diff --git a/.gitmodules b/.gitmodules index 7cbd900b1..3b08ceaa4 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "contracts/lib/forge-std"] path = contracts/lib/forge-std url = https://github.com/foundry-rs/forge-std +[submodule "contracts/lib/eigenlayer-contracts"] + path = contracts/lib/eigenlayer-contracts + url = https://github.com/Layr-Labs/eigenlayer-contracts.git diff --git a/contracts-abi/abi/MevCommitAVS.abi b/contracts-abi/abi/MevCommitAVS.abi new file mode 100644 index 000000000..ed4e3e4cf --- /dev/null +++ b/contracts-abi/abi/MevCommitAVS.abi @@ -0,0 +1,1515 @@ +[ + { + "type": "constructor", + "inputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "fallback", + "stateMutability": "payable" + }, + { + "type": "receive", + "stateMutability": "payable" + }, + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "avsDirectory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "deregisterLSTRestaker", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "deregisterOperator", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "deregisterValidators", + "inputs": [ + { + "name": "valPubKeys", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "freeze", + "inputs": [ + { + "name": "valPubKeys", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "freezeOracle", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getLSTRestakerRegInfo", + "inputs": [ + { + "name": "lstRestaker", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IMevCommitAVS.LSTRestakerRegistrationInfo", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "chosenValidators", + "type": "bytes[]", + "internalType": "bytes[]" + }, + { + "name": "numChosen", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "deregRequestHeight", + "type": "tuple", + "internalType": "struct EventHeightLib.EventHeight", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "blockHeight", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getOperatorRegInfo", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IMevCommitAVS.OperatorRegistrationInfo", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "deregRequestHeight", + "type": "tuple", + "internalType": "struct EventHeightLib.EventHeight", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "blockHeight", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getOperatorRestakedStrategies", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRestakeableStrategies", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getValidatorRegInfo", + "inputs": [ + { + "name": "valPubKey", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct IMevCommitAVS.ValidatorRegistrationInfo", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "podOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "freezeHeight", + "type": "tuple", + "internalType": "struct EventHeightLib.EventHeight", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "blockHeight", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "deregRequestHeight", + "type": "tuple", + "internalType": "struct EventHeightLib.EventHeight", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "blockHeight", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "owner_", + "type": "address", + "internalType": "address" + }, + { + "name": "delegationManager_", + "type": "address", + "internalType": "contract IDelegationManager" + }, + { + "name": "eigenPodManager_", + "type": "address", + "internalType": "contract IEigenPodManager" + }, + { + "name": "strategyManager_", + "type": "address", + "internalType": "contract IStrategyManager" + }, + { + "name": "avsDirectory_", + "type": "address", + "internalType": "contract IAVSDirectory" + }, + { + "name": "restakeableStrategies_", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "freezeOracle_", + "type": "address", + "internalType": "address" + }, + { + "name": "unfreezeFee_", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "unfreezeReceiver_", + "type": "address", + "internalType": "address" + }, + { + "name": "unfreezePeriodBlocks_", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "operatorDeregPeriodBlocks_", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "validatorDeregPeriodBlocks_", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "lstRestakerDeregPeriodBlocks_", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "metadataURI_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "isValidatorOptedIn", + "inputs": [ + { + "name": "valPubKey", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "lstRestakerDeregPeriodBlocks", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "lstRestakerRegistrations", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "numChosen", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "deregRequestHeight", + "type": "tuple", + "internalType": "struct EventHeightLib.EventHeight", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "blockHeight", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "operatorDeregPeriodBlocks", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "operatorRegistrations", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "deregRequestHeight", + "type": "tuple", + "internalType": "struct EventHeightLib.EventHeight", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "blockHeight", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "paused", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "registerLSTRestaker", + "inputs": [ + { + "name": "chosenValidators", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "registerOperator", + "inputs": [ + { + "name": "operatorSignature", + "type": "tuple", + "internalType": "struct ISignatureUtils.SignatureWithSaltAndExpiry", + "components": [ + { + "name": "signature", + "type": "bytes", + "internalType": "bytes" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "expiry", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "registerValidatorsByPodOwners", + "inputs": [ + { + "name": "valPubKeys", + "type": "bytes[][]", + "internalType": "bytes[][]" + }, + { + "name": "podOwners", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "requestLSTRestakerDeregistration", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "requestOperatorDeregistration", + "inputs": [ + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "requestValidatorsDeregistration", + "inputs": [ + { + "name": "valPubKeys", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "restakeableStrategies", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setAVSDirectory", + "inputs": [ + { + "name": "avsDirectory_", + "type": "address", + "internalType": "contract IAVSDirectory" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setDelegationManager", + "inputs": [ + { + "name": "delegationManager_", + "type": "address", + "internalType": "contract IDelegationManager" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setEigenPodManager", + "inputs": [ + { + "name": "eigenPodManager_", + "type": "address", + "internalType": "contract IEigenPodManager" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setFreezeOracle", + "inputs": [ + { + "name": "freezeOracle_", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setLstRestakerDeregPeriodBlocks", + "inputs": [ + { + "name": "lstRestakerDeregPeriodBlocks_", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setOperatorDeregPeriodBlocks", + "inputs": [ + { + "name": "operatorDeregPeriodBlocks_", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setRestakeableStrategies", + "inputs": [ + { + "name": "restakeableStrategies_", + "type": "address[]", + "internalType": "address[]" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setStrategyManager", + "inputs": [ + { + "name": "strategyManager_", + "type": "address", + "internalType": "contract IStrategyManager" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setUnfreezeFee", + "inputs": [ + { + "name": "unfreezeFee_", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setUnfreezePeriodBlocks", + "inputs": [ + { + "name": "unfreezePeriodBlocks_", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setUnfreezeReceiver", + "inputs": [ + { + "name": "unfreezeReceiver_", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setValidatorDeregPeriodBlocks", + "inputs": [ + { + "name": "validatorDeregPeriodBlocks_", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "unfreeze", + "inputs": [ + { + "name": "valPubKey", + "type": "bytes[]", + "internalType": "bytes[]" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "unfreezeFee", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unfreezePeriodBlocks", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unfreezeReceiver", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "unpause", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateMetadataURI", + "inputs": [ + { + "name": "metadataURI_", + "type": "string", + "internalType": "string" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { + "name": "newImplementation", + "type": "address", + "internalType": "address" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "validatorDeregPeriodBlocks", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "validatorRegistrations", + "inputs": [ + { + "name": "", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "podOwner", + "type": "address", + "internalType": "address" + }, + { + "name": "freezeHeight", + "type": "tuple", + "internalType": "struct EventHeightLib.EventHeight", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "blockHeight", + "type": "uint256", + "internalType": "uint256" + } + ] + }, + { + "name": "deregRequestHeight", + "type": "tuple", + "internalType": "struct EventHeightLib.EventHeight", + "components": [ + { + "name": "exists", + "type": "bool", + "internalType": "bool" + }, + { + "name": "blockHeight", + "type": "uint256", + "internalType": "uint256" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "AVSDirectorySet", + "inputs": [ + { + "name": "avsDirectory", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegationManagerSet", + "inputs": [ + { + "name": "delegationManager", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EigenPodManagerSet", + "inputs": [ + { + "name": "eigenPodManager", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "FreezeOracleSet", + "inputs": [ + { + "name": "freezeOracle", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint64", + "indexed": false, + "internalType": "uint64" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "LSTRestakerDeregPeriodBlocksSet", + "inputs": [ + { + "name": "lstRestakerDeregPeriodBlocks", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "LSTRestakerDeregistered", + "inputs": [ + { + "name": "chosenValidator", + "type": "bytes", + "indexed": true, + "internalType": "bytes" + }, + { + "name": "numChosen", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "lstRestaker", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "LSTRestakerDeregistrationRequested", + "inputs": [ + { + "name": "chosenValidator", + "type": "bytes", + "indexed": true, + "internalType": "bytes" + }, + { + "name": "numChosen", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "lstRestaker", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "LSTRestakerRegistered", + "inputs": [ + { + "name": "chosenValidator", + "type": "bytes", + "indexed": true, + "internalType": "bytes" + }, + { + "name": "numChosen", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "lstRestaker", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorDeregPeriodBlocksSet", + "inputs": [ + { + "name": "operatorDeregPeriodBlocks", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorDeregistered", + "inputs": [ + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorDeregistrationRequested", + "inputs": [ + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OperatorRegistered", + "inputs": [ + { + "name": "operator", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Paused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RestakeableStrategiesSet", + "inputs": [ + { + "name": "restakeableStrategies", + "type": "address[]", + "indexed": true, + "internalType": "address[]" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "StrategyManagerSet", + "inputs": [ + { + "name": "strategyManager", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "UnfreezeFeeSet", + "inputs": [ + { + "name": "unfreezeFee", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "UnfreezePeriodBlocksSet", + "inputs": [ + { + "name": "unfreezePeriodBlocks", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "UnfreezeReceiverSet", + "inputs": [ + { + "name": "unfreezeReceiver", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Unpaused", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Upgraded", + "inputs": [ + { + "name": "implementation", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorDeregPeriodBlocksSet", + "inputs": [ + { + "name": "validatorDeregPeriodBlocks", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorDeregistered", + "inputs": [ + { + "name": "validatorPubKey", + "type": "bytes", + "indexed": true, + "internalType": "bytes" + }, + { + "name": "podOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorDeregistrationRequested", + "inputs": [ + { + "name": "validatorPubKey", + "type": "bytes", + "indexed": true, + "internalType": "bytes" + }, + { + "name": "podOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorFrozen", + "inputs": [ + { + "name": "validatorPubKey", + "type": "bytes", + "indexed": true, + "internalType": "bytes" + }, + { + "name": "podOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorRegistered", + "inputs": [ + { + "name": "validatorPubKey", + "type": "bytes", + "indexed": true, + "internalType": "bytes" + }, + { + "name": "podOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorUnfrozen", + "inputs": [ + { + "name": "validatorPubKey", + "type": "bytes", + "indexed": true, + "internalType": "bytes" + }, + { + "name": "podOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [ + { + "name": "target", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [ + { + "name": "implementation", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "ERC1967NonPayable", + "inputs": [] + }, + { + "type": "error", + "name": "EnforcedPause", + "inputs": [] + }, + { + "type": "error", + "name": "ExpectedPause", + "inputs": [] + }, + { + "type": "error", + "name": "FailedInnerCall", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidInitialization", + "inputs": [] + }, + { + "type": "error", + "name": "NotInitializing", + "inputs": [] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "UUPSUnauthorizedCallContext", + "inputs": [] + }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [ + { + "name": "slot", + "type": "bytes32", + "internalType": "bytes32" + } + ] + } +] diff --git a/contracts-abi/clients/MevCommitAVS/MevCommitAVS.go b/contracts-abi/clients/MevCommitAVS/MevCommitAVS.go new file mode 100644 index 000000000..ba593fab6 --- /dev/null +++ b/contracts-abi/clients/MevCommitAVS/MevCommitAVS.go @@ -0,0 +1,5669 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package mevcommitavs + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// EventHeightLibEventHeight is an auto generated low-level Go binding around an user-defined struct. +type EventHeightLibEventHeight struct { + Exists bool + BlockHeight *big.Int +} + +// IMevCommitAVSLSTRestakerRegistrationInfo is an auto generated low-level Go binding around an user-defined struct. +type IMevCommitAVSLSTRestakerRegistrationInfo struct { + Exists bool + ChosenValidators [][]byte + NumChosen *big.Int + DeregRequestHeight EventHeightLibEventHeight +} + +// IMevCommitAVSOperatorRegistrationInfo is an auto generated low-level Go binding around an user-defined struct. +type IMevCommitAVSOperatorRegistrationInfo struct { + Exists bool + DeregRequestHeight EventHeightLibEventHeight +} + +// IMevCommitAVSValidatorRegistrationInfo is an auto generated low-level Go binding around an user-defined struct. +type IMevCommitAVSValidatorRegistrationInfo struct { + Exists bool + PodOwner common.Address + FreezeHeight EventHeightLibEventHeight + DeregRequestHeight EventHeightLibEventHeight +} + +// ISignatureUtilsSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct. +type ISignatureUtilsSignatureWithSaltAndExpiry struct { + Signature []byte + Salt [32]byte + Expiry *big.Int +} + +// MevcommitavsMetaData contains all meta data concerning the Mevcommitavs contract. +var MevcommitavsMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsDirectory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterLSTRestaker\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterValidators\",\"inputs\":[{\"name\":\"valPubKeys\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"freeze\",\"inputs\":[{\"name\":\"valPubKeys\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"freezeOracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getLSTRestakerRegInfo\",\"inputs\":[{\"name\":\"lstRestaker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIMevCommitAVS.LSTRestakerRegistrationInfo\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"chosenValidators\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"numChosen\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deregRequestHeight\",\"type\":\"tuple\",\"internalType\":\"structEventHeightLib.EventHeight\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blockHeight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorRegInfo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIMevCommitAVS.OperatorRegistrationInfo\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deregRequestHeight\",\"type\":\"tuple\",\"internalType\":\"structEventHeightLib.EventHeight\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blockHeight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorRestakedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRestakeableStrategies\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getValidatorRegInfo\",\"inputs\":[{\"name\":\"valPubKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIMevCommitAVS.ValidatorRegistrationInfo\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"freezeHeight\",\"type\":\"tuple\",\"internalType\":\"structEventHeightLib.EventHeight\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blockHeight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"deregRequestHeight\",\"type\":\"tuple\",\"internalType\":\"structEventHeightLib.EventHeight\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blockHeight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationManager_\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"eigenPodManager_\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"strategyManager_\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"avsDirectory_\",\"type\":\"address\",\"internalType\":\"contractIAVSDirectory\"},{\"name\":\"restakeableStrategies_\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"freezeOracle_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"unfreezeFee_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"unfreezeReceiver_\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"unfreezePeriodBlocks_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operatorDeregPeriodBlocks_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"validatorDeregPeriodBlocks_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"lstRestakerDeregPeriodBlocks_\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"metadataURI_\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isValidatorOptedIn\",\"inputs\":[{\"name\":\"valPubKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lstRestakerDeregPeriodBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"lstRestakerRegistrations\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"numChosen\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deregRequestHeight\",\"type\":\"tuple\",\"internalType\":\"structEventHeightLib.EventHeight\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blockHeight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorDeregPeriodBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorRegistrations\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deregRequestHeight\",\"type\":\"tuple\",\"internalType\":\"structEventHeightLib.EventHeight\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blockHeight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerLSTRestaker\",\"inputs\":[{\"name\":\"chosenValidators\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperator\",\"inputs\":[{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerValidatorsByPodOwners\",\"inputs\":[{\"name\":\"valPubKeys\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"podOwners\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestLSTRestakerDeregistration\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestOperatorDeregistration\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestValidatorsDeregistration\",\"inputs\":[{\"name\":\"valPubKeys\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"restakeableStrategies\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setAVSDirectory\",\"inputs\":[{\"name\":\"avsDirectory_\",\"type\":\"address\",\"internalType\":\"contractIAVSDirectory\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDelegationManager\",\"inputs\":[{\"name\":\"delegationManager_\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setEigenPodManager\",\"inputs\":[{\"name\":\"eigenPodManager_\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setFreezeOracle\",\"inputs\":[{\"name\":\"freezeOracle_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setLstRestakerDeregPeriodBlocks\",\"inputs\":[{\"name\":\"lstRestakerDeregPeriodBlocks_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorDeregPeriodBlocks\",\"inputs\":[{\"name\":\"operatorDeregPeriodBlocks_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRestakeableStrategies\",\"inputs\":[{\"name\":\"restakeableStrategies_\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyManager\",\"inputs\":[{\"name\":\"strategyManager_\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnfreezeFee\",\"inputs\":[{\"name\":\"unfreezeFee_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnfreezePeriodBlocks\",\"inputs\":[{\"name\":\"unfreezePeriodBlocks_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setUnfreezeReceiver\",\"inputs\":[{\"name\":\"unfreezeReceiver_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setValidatorDeregPeriodBlocks\",\"inputs\":[{\"name\":\"validatorDeregPeriodBlocks_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unfreeze\",\"inputs\":[{\"name\":\"valPubKey\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"unfreezeFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unfreezePeriodBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unfreezeReceiver\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateMetadataURI\",\"inputs\":[{\"name\":\"metadataURI_\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"validatorDeregPeriodBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorRegistrations\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"freezeHeight\",\"type\":\"tuple\",\"internalType\":\"structEventHeightLib.EventHeight\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blockHeight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"deregRequestHeight\",\"type\":\"tuple\",\"internalType\":\"structEventHeightLib.EventHeight\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"blockHeight\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"AVSDirectorySet\",\"inputs\":[{\"name\":\"avsDirectory\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegationManagerSet\",\"inputs\":[{\"name\":\"delegationManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodManagerSet\",\"inputs\":[{\"name\":\"eigenPodManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FreezeOracleSet\",\"inputs\":[{\"name\":\"freezeOracle\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LSTRestakerDeregPeriodBlocksSet\",\"inputs\":[{\"name\":\"lstRestakerDeregPeriodBlocks\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LSTRestakerDeregistered\",\"inputs\":[{\"name\":\"chosenValidator\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"numChosen\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"lstRestaker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LSTRestakerDeregistrationRequested\",\"inputs\":[{\"name\":\"chosenValidator\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"numChosen\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"lstRestaker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"LSTRestakerRegistered\",\"inputs\":[{\"name\":\"chosenValidator\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"numChosen\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"lstRestaker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDeregPeriodBlocksSet\",\"inputs\":[{\"name\":\"operatorDeregPeriodBlocks\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDeregistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDeregistrationRequested\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakeableStrategiesSet\",\"inputs\":[{\"name\":\"restakeableStrategies\",\"type\":\"address[]\",\"indexed\":true,\"internalType\":\"address[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyManagerSet\",\"inputs\":[{\"name\":\"strategyManager\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnfreezeFeeSet\",\"inputs\":[{\"name\":\"unfreezeFee\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnfreezePeriodBlocksSet\",\"inputs\":[{\"name\":\"unfreezePeriodBlocks\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UnfreezeReceiverSet\",\"inputs\":[{\"name\":\"unfreezeReceiver\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorDeregPeriodBlocksSet\",\"inputs\":[{\"name\":\"validatorDeregPeriodBlocks\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorDeregistered\",\"inputs\":[{\"name\":\"validatorPubKey\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorDeregistrationRequested\",\"inputs\":[{\"name\":\"validatorPubKey\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorFrozen\",\"inputs\":[{\"name\":\"validatorPubKey\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRegistered\",\"inputs\":[{\"name\":\"validatorPubKey\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorUnfrozen\",\"inputs\":[{\"name\":\"validatorPubKey\",\"type\":\"bytes\",\"indexed\":true,\"internalType\":\"bytes\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"EnforcedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ExpectedPause\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]", +} + +// MevcommitavsABI is the input ABI used to generate the binding from. +// Deprecated: Use MevcommitavsMetaData.ABI instead. +var MevcommitavsABI = MevcommitavsMetaData.ABI + +// Mevcommitavs is an auto generated Go binding around an Ethereum contract. +type Mevcommitavs struct { + MevcommitavsCaller // Read-only binding to the contract + MevcommitavsTransactor // Write-only binding to the contract + MevcommitavsFilterer // Log filterer for contract events +} + +// MevcommitavsCaller is an auto generated read-only Go binding around an Ethereum contract. +type MevcommitavsCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MevcommitavsTransactor is an auto generated write-only Go binding around an Ethereum contract. +type MevcommitavsTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MevcommitavsFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type MevcommitavsFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MevcommitavsSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type MevcommitavsSession struct { + Contract *Mevcommitavs // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MevcommitavsCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type MevcommitavsCallerSession struct { + Contract *MevcommitavsCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// MevcommitavsTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type MevcommitavsTransactorSession struct { + Contract *MevcommitavsTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MevcommitavsRaw is an auto generated low-level Go binding around an Ethereum contract. +type MevcommitavsRaw struct { + Contract *Mevcommitavs // Generic contract binding to access the raw methods on +} + +// MevcommitavsCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type MevcommitavsCallerRaw struct { + Contract *MevcommitavsCaller // Generic read-only contract binding to access the raw methods on +} + +// MevcommitavsTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type MevcommitavsTransactorRaw struct { + Contract *MevcommitavsTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewMevcommitavs creates a new instance of Mevcommitavs, bound to a specific deployed contract. +func NewMevcommitavs(address common.Address, backend bind.ContractBackend) (*Mevcommitavs, error) { + contract, err := bindMevcommitavs(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Mevcommitavs{MevcommitavsCaller: MevcommitavsCaller{contract: contract}, MevcommitavsTransactor: MevcommitavsTransactor{contract: contract}, MevcommitavsFilterer: MevcommitavsFilterer{contract: contract}}, nil +} + +// NewMevcommitavsCaller creates a new read-only instance of Mevcommitavs, bound to a specific deployed contract. +func NewMevcommitavsCaller(address common.Address, caller bind.ContractCaller) (*MevcommitavsCaller, error) { + contract, err := bindMevcommitavs(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MevcommitavsCaller{contract: contract}, nil +} + +// NewMevcommitavsTransactor creates a new write-only instance of Mevcommitavs, bound to a specific deployed contract. +func NewMevcommitavsTransactor(address common.Address, transactor bind.ContractTransactor) (*MevcommitavsTransactor, error) { + contract, err := bindMevcommitavs(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MevcommitavsTransactor{contract: contract}, nil +} + +// NewMevcommitavsFilterer creates a new log filterer instance of Mevcommitavs, bound to a specific deployed contract. +func NewMevcommitavsFilterer(address common.Address, filterer bind.ContractFilterer) (*MevcommitavsFilterer, error) { + contract, err := bindMevcommitavs(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MevcommitavsFilterer{contract: contract}, nil +} + +// bindMevcommitavs binds a generic wrapper to an already deployed contract. +func bindMevcommitavs(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MevcommitavsMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Mevcommitavs *MevcommitavsRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Mevcommitavs.Contract.MevcommitavsCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Mevcommitavs *MevcommitavsRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Mevcommitavs.Contract.MevcommitavsTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Mevcommitavs *MevcommitavsRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Mevcommitavs.Contract.MevcommitavsTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Mevcommitavs *MevcommitavsCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Mevcommitavs.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Mevcommitavs *MevcommitavsTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Mevcommitavs.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Mevcommitavs *MevcommitavsTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Mevcommitavs.Contract.contract.Transact(opts, method, params...) +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_Mevcommitavs *MevcommitavsCaller) UPGRADEINTERFACEVERSION(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "UPGRADE_INTERFACE_VERSION") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_Mevcommitavs *MevcommitavsSession) UPGRADEINTERFACEVERSION() (string, error) { + return _Mevcommitavs.Contract.UPGRADEINTERFACEVERSION(&_Mevcommitavs.CallOpts) +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_Mevcommitavs *MevcommitavsCallerSession) UPGRADEINTERFACEVERSION() (string, error) { + return _Mevcommitavs.Contract.UPGRADEINTERFACEVERSION(&_Mevcommitavs.CallOpts) +} + +// AvsDirectory is a free data retrieval call binding the contract method 0x6b3aa72e. +// +// Solidity: function avsDirectory() view returns(address) +func (_Mevcommitavs *MevcommitavsCaller) AvsDirectory(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "avsDirectory") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// AvsDirectory is a free data retrieval call binding the contract method 0x6b3aa72e. +// +// Solidity: function avsDirectory() view returns(address) +func (_Mevcommitavs *MevcommitavsSession) AvsDirectory() (common.Address, error) { + return _Mevcommitavs.Contract.AvsDirectory(&_Mevcommitavs.CallOpts) +} + +// AvsDirectory is a free data retrieval call binding the contract method 0x6b3aa72e. +// +// Solidity: function avsDirectory() view returns(address) +func (_Mevcommitavs *MevcommitavsCallerSession) AvsDirectory() (common.Address, error) { + return _Mevcommitavs.Contract.AvsDirectory(&_Mevcommitavs.CallOpts) +} + +// FreezeOracle is a free data retrieval call binding the contract method 0xaf91e0bf. +// +// Solidity: function freezeOracle() view returns(address) +func (_Mevcommitavs *MevcommitavsCaller) FreezeOracle(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "freezeOracle") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// FreezeOracle is a free data retrieval call binding the contract method 0xaf91e0bf. +// +// Solidity: function freezeOracle() view returns(address) +func (_Mevcommitavs *MevcommitavsSession) FreezeOracle() (common.Address, error) { + return _Mevcommitavs.Contract.FreezeOracle(&_Mevcommitavs.CallOpts) +} + +// FreezeOracle is a free data retrieval call binding the contract method 0xaf91e0bf. +// +// Solidity: function freezeOracle() view returns(address) +func (_Mevcommitavs *MevcommitavsCallerSession) FreezeOracle() (common.Address, error) { + return _Mevcommitavs.Contract.FreezeOracle(&_Mevcommitavs.CallOpts) +} + +// GetLSTRestakerRegInfo is a free data retrieval call binding the contract method 0xeaeb9c88. +// +// Solidity: function getLSTRestakerRegInfo(address lstRestaker) view returns((bool,bytes[],uint256,(bool,uint256))) +func (_Mevcommitavs *MevcommitavsCaller) GetLSTRestakerRegInfo(opts *bind.CallOpts, lstRestaker common.Address) (IMevCommitAVSLSTRestakerRegistrationInfo, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "getLSTRestakerRegInfo", lstRestaker) + + if err != nil { + return *new(IMevCommitAVSLSTRestakerRegistrationInfo), err + } + + out0 := *abi.ConvertType(out[0], new(IMevCommitAVSLSTRestakerRegistrationInfo)).(*IMevCommitAVSLSTRestakerRegistrationInfo) + + return out0, err + +} + +// GetLSTRestakerRegInfo is a free data retrieval call binding the contract method 0xeaeb9c88. +// +// Solidity: function getLSTRestakerRegInfo(address lstRestaker) view returns((bool,bytes[],uint256,(bool,uint256))) +func (_Mevcommitavs *MevcommitavsSession) GetLSTRestakerRegInfo(lstRestaker common.Address) (IMevCommitAVSLSTRestakerRegistrationInfo, error) { + return _Mevcommitavs.Contract.GetLSTRestakerRegInfo(&_Mevcommitavs.CallOpts, lstRestaker) +} + +// GetLSTRestakerRegInfo is a free data retrieval call binding the contract method 0xeaeb9c88. +// +// Solidity: function getLSTRestakerRegInfo(address lstRestaker) view returns((bool,bytes[],uint256,(bool,uint256))) +func (_Mevcommitavs *MevcommitavsCallerSession) GetLSTRestakerRegInfo(lstRestaker common.Address) (IMevCommitAVSLSTRestakerRegistrationInfo, error) { + return _Mevcommitavs.Contract.GetLSTRestakerRegInfo(&_Mevcommitavs.CallOpts, lstRestaker) +} + +// GetOperatorRegInfo is a free data retrieval call binding the contract method 0x2c249e6c. +// +// Solidity: function getOperatorRegInfo(address operator) view returns((bool,(bool,uint256))) +func (_Mevcommitavs *MevcommitavsCaller) GetOperatorRegInfo(opts *bind.CallOpts, operator common.Address) (IMevCommitAVSOperatorRegistrationInfo, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "getOperatorRegInfo", operator) + + if err != nil { + return *new(IMevCommitAVSOperatorRegistrationInfo), err + } + + out0 := *abi.ConvertType(out[0], new(IMevCommitAVSOperatorRegistrationInfo)).(*IMevCommitAVSOperatorRegistrationInfo) + + return out0, err + +} + +// GetOperatorRegInfo is a free data retrieval call binding the contract method 0x2c249e6c. +// +// Solidity: function getOperatorRegInfo(address operator) view returns((bool,(bool,uint256))) +func (_Mevcommitavs *MevcommitavsSession) GetOperatorRegInfo(operator common.Address) (IMevCommitAVSOperatorRegistrationInfo, error) { + return _Mevcommitavs.Contract.GetOperatorRegInfo(&_Mevcommitavs.CallOpts, operator) +} + +// GetOperatorRegInfo is a free data retrieval call binding the contract method 0x2c249e6c. +// +// Solidity: function getOperatorRegInfo(address operator) view returns((bool,(bool,uint256))) +func (_Mevcommitavs *MevcommitavsCallerSession) GetOperatorRegInfo(operator common.Address) (IMevCommitAVSOperatorRegistrationInfo, error) { + return _Mevcommitavs.Contract.GetOperatorRegInfo(&_Mevcommitavs.CallOpts, operator) +} + +// GetOperatorRestakedStrategies is a free data retrieval call binding the contract method 0x33cfb7b7. +// +// Solidity: function getOperatorRestakedStrategies(address operator) view returns(address[]) +func (_Mevcommitavs *MevcommitavsCaller) GetOperatorRestakedStrategies(opts *bind.CallOpts, operator common.Address) ([]common.Address, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "getOperatorRestakedStrategies", operator) + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetOperatorRestakedStrategies is a free data retrieval call binding the contract method 0x33cfb7b7. +// +// Solidity: function getOperatorRestakedStrategies(address operator) view returns(address[]) +func (_Mevcommitavs *MevcommitavsSession) GetOperatorRestakedStrategies(operator common.Address) ([]common.Address, error) { + return _Mevcommitavs.Contract.GetOperatorRestakedStrategies(&_Mevcommitavs.CallOpts, operator) +} + +// GetOperatorRestakedStrategies is a free data retrieval call binding the contract method 0x33cfb7b7. +// +// Solidity: function getOperatorRestakedStrategies(address operator) view returns(address[]) +func (_Mevcommitavs *MevcommitavsCallerSession) GetOperatorRestakedStrategies(operator common.Address) ([]common.Address, error) { + return _Mevcommitavs.Contract.GetOperatorRestakedStrategies(&_Mevcommitavs.CallOpts, operator) +} + +// GetRestakeableStrategies is a free data retrieval call binding the contract method 0xe481af9d. +// +// Solidity: function getRestakeableStrategies() view returns(address[]) +func (_Mevcommitavs *MevcommitavsCaller) GetRestakeableStrategies(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "getRestakeableStrategies") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetRestakeableStrategies is a free data retrieval call binding the contract method 0xe481af9d. +// +// Solidity: function getRestakeableStrategies() view returns(address[]) +func (_Mevcommitavs *MevcommitavsSession) GetRestakeableStrategies() ([]common.Address, error) { + return _Mevcommitavs.Contract.GetRestakeableStrategies(&_Mevcommitavs.CallOpts) +} + +// GetRestakeableStrategies is a free data retrieval call binding the contract method 0xe481af9d. +// +// Solidity: function getRestakeableStrategies() view returns(address[]) +func (_Mevcommitavs *MevcommitavsCallerSession) GetRestakeableStrategies() ([]common.Address, error) { + return _Mevcommitavs.Contract.GetRestakeableStrategies(&_Mevcommitavs.CallOpts) +} + +// GetValidatorRegInfo is a free data retrieval call binding the contract method 0x972ac83c. +// +// Solidity: function getValidatorRegInfo(bytes valPubKey) view returns((bool,address,(bool,uint256),(bool,uint256))) +func (_Mevcommitavs *MevcommitavsCaller) GetValidatorRegInfo(opts *bind.CallOpts, valPubKey []byte) (IMevCommitAVSValidatorRegistrationInfo, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "getValidatorRegInfo", valPubKey) + + if err != nil { + return *new(IMevCommitAVSValidatorRegistrationInfo), err + } + + out0 := *abi.ConvertType(out[0], new(IMevCommitAVSValidatorRegistrationInfo)).(*IMevCommitAVSValidatorRegistrationInfo) + + return out0, err + +} + +// GetValidatorRegInfo is a free data retrieval call binding the contract method 0x972ac83c. +// +// Solidity: function getValidatorRegInfo(bytes valPubKey) view returns((bool,address,(bool,uint256),(bool,uint256))) +func (_Mevcommitavs *MevcommitavsSession) GetValidatorRegInfo(valPubKey []byte) (IMevCommitAVSValidatorRegistrationInfo, error) { + return _Mevcommitavs.Contract.GetValidatorRegInfo(&_Mevcommitavs.CallOpts, valPubKey) +} + +// GetValidatorRegInfo is a free data retrieval call binding the contract method 0x972ac83c. +// +// Solidity: function getValidatorRegInfo(bytes valPubKey) view returns((bool,address,(bool,uint256),(bool,uint256))) +func (_Mevcommitavs *MevcommitavsCallerSession) GetValidatorRegInfo(valPubKey []byte) (IMevCommitAVSValidatorRegistrationInfo, error) { + return _Mevcommitavs.Contract.GetValidatorRegInfo(&_Mevcommitavs.CallOpts, valPubKey) +} + +// IsValidatorOptedIn is a free data retrieval call binding the contract method 0x470b690f. +// +// Solidity: function isValidatorOptedIn(bytes valPubKey) view returns(bool) +func (_Mevcommitavs *MevcommitavsCaller) IsValidatorOptedIn(opts *bind.CallOpts, valPubKey []byte) (bool, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "isValidatorOptedIn", valPubKey) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsValidatorOptedIn is a free data retrieval call binding the contract method 0x470b690f. +// +// Solidity: function isValidatorOptedIn(bytes valPubKey) view returns(bool) +func (_Mevcommitavs *MevcommitavsSession) IsValidatorOptedIn(valPubKey []byte) (bool, error) { + return _Mevcommitavs.Contract.IsValidatorOptedIn(&_Mevcommitavs.CallOpts, valPubKey) +} + +// IsValidatorOptedIn is a free data retrieval call binding the contract method 0x470b690f. +// +// Solidity: function isValidatorOptedIn(bytes valPubKey) view returns(bool) +func (_Mevcommitavs *MevcommitavsCallerSession) IsValidatorOptedIn(valPubKey []byte) (bool, error) { + return _Mevcommitavs.Contract.IsValidatorOptedIn(&_Mevcommitavs.CallOpts, valPubKey) +} + +// LstRestakerDeregPeriodBlocks is a free data retrieval call binding the contract method 0xb0282b23. +// +// Solidity: function lstRestakerDeregPeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsCaller) LstRestakerDeregPeriodBlocks(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "lstRestakerDeregPeriodBlocks") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// LstRestakerDeregPeriodBlocks is a free data retrieval call binding the contract method 0xb0282b23. +// +// Solidity: function lstRestakerDeregPeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsSession) LstRestakerDeregPeriodBlocks() (*big.Int, error) { + return _Mevcommitavs.Contract.LstRestakerDeregPeriodBlocks(&_Mevcommitavs.CallOpts) +} + +// LstRestakerDeregPeriodBlocks is a free data retrieval call binding the contract method 0xb0282b23. +// +// Solidity: function lstRestakerDeregPeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsCallerSession) LstRestakerDeregPeriodBlocks() (*big.Int, error) { + return _Mevcommitavs.Contract.LstRestakerDeregPeriodBlocks(&_Mevcommitavs.CallOpts) +} + +// LstRestakerRegistrations is a free data retrieval call binding the contract method 0x25911aba. +// +// Solidity: function lstRestakerRegistrations(address ) view returns(bool exists, uint256 numChosen, (bool,uint256) deregRequestHeight) +func (_Mevcommitavs *MevcommitavsCaller) LstRestakerRegistrations(opts *bind.CallOpts, arg0 common.Address) (struct { + Exists bool + NumChosen *big.Int + DeregRequestHeight EventHeightLibEventHeight +}, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "lstRestakerRegistrations", arg0) + + outstruct := new(struct { + Exists bool + NumChosen *big.Int + DeregRequestHeight EventHeightLibEventHeight + }) + if err != nil { + return *outstruct, err + } + + outstruct.Exists = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.NumChosen = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) + outstruct.DeregRequestHeight = *abi.ConvertType(out[2], new(EventHeightLibEventHeight)).(*EventHeightLibEventHeight) + + return *outstruct, err + +} + +// LstRestakerRegistrations is a free data retrieval call binding the contract method 0x25911aba. +// +// Solidity: function lstRestakerRegistrations(address ) view returns(bool exists, uint256 numChosen, (bool,uint256) deregRequestHeight) +func (_Mevcommitavs *MevcommitavsSession) LstRestakerRegistrations(arg0 common.Address) (struct { + Exists bool + NumChosen *big.Int + DeregRequestHeight EventHeightLibEventHeight +}, error) { + return _Mevcommitavs.Contract.LstRestakerRegistrations(&_Mevcommitavs.CallOpts, arg0) +} + +// LstRestakerRegistrations is a free data retrieval call binding the contract method 0x25911aba. +// +// Solidity: function lstRestakerRegistrations(address ) view returns(bool exists, uint256 numChosen, (bool,uint256) deregRequestHeight) +func (_Mevcommitavs *MevcommitavsCallerSession) LstRestakerRegistrations(arg0 common.Address) (struct { + Exists bool + NumChosen *big.Int + DeregRequestHeight EventHeightLibEventHeight +}, error) { + return _Mevcommitavs.Contract.LstRestakerRegistrations(&_Mevcommitavs.CallOpts, arg0) +} + +// OperatorDeregPeriodBlocks is a free data retrieval call binding the contract method 0x14be85bd. +// +// Solidity: function operatorDeregPeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsCaller) OperatorDeregPeriodBlocks(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "operatorDeregPeriodBlocks") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// OperatorDeregPeriodBlocks is a free data retrieval call binding the contract method 0x14be85bd. +// +// Solidity: function operatorDeregPeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsSession) OperatorDeregPeriodBlocks() (*big.Int, error) { + return _Mevcommitavs.Contract.OperatorDeregPeriodBlocks(&_Mevcommitavs.CallOpts) +} + +// OperatorDeregPeriodBlocks is a free data retrieval call binding the contract method 0x14be85bd. +// +// Solidity: function operatorDeregPeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsCallerSession) OperatorDeregPeriodBlocks() (*big.Int, error) { + return _Mevcommitavs.Contract.OperatorDeregPeriodBlocks(&_Mevcommitavs.CallOpts) +} + +// OperatorRegistrations is a free data retrieval call binding the contract method 0xfe07a836. +// +// Solidity: function operatorRegistrations(address ) view returns(bool exists, (bool,uint256) deregRequestHeight) +func (_Mevcommitavs *MevcommitavsCaller) OperatorRegistrations(opts *bind.CallOpts, arg0 common.Address) (struct { + Exists bool + DeregRequestHeight EventHeightLibEventHeight +}, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "operatorRegistrations", arg0) + + outstruct := new(struct { + Exists bool + DeregRequestHeight EventHeightLibEventHeight + }) + if err != nil { + return *outstruct, err + } + + outstruct.Exists = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.DeregRequestHeight = *abi.ConvertType(out[1], new(EventHeightLibEventHeight)).(*EventHeightLibEventHeight) + + return *outstruct, err + +} + +// OperatorRegistrations is a free data retrieval call binding the contract method 0xfe07a836. +// +// Solidity: function operatorRegistrations(address ) view returns(bool exists, (bool,uint256) deregRequestHeight) +func (_Mevcommitavs *MevcommitavsSession) OperatorRegistrations(arg0 common.Address) (struct { + Exists bool + DeregRequestHeight EventHeightLibEventHeight +}, error) { + return _Mevcommitavs.Contract.OperatorRegistrations(&_Mevcommitavs.CallOpts, arg0) +} + +// OperatorRegistrations is a free data retrieval call binding the contract method 0xfe07a836. +// +// Solidity: function operatorRegistrations(address ) view returns(bool exists, (bool,uint256) deregRequestHeight) +func (_Mevcommitavs *MevcommitavsCallerSession) OperatorRegistrations(arg0 common.Address) (struct { + Exists bool + DeregRequestHeight EventHeightLibEventHeight +}, error) { + return _Mevcommitavs.Contract.OperatorRegistrations(&_Mevcommitavs.CallOpts, arg0) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Mevcommitavs *MevcommitavsCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Mevcommitavs *MevcommitavsSession) Owner() (common.Address, error) { + return _Mevcommitavs.Contract.Owner(&_Mevcommitavs.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_Mevcommitavs *MevcommitavsCallerSession) Owner() (common.Address, error) { + return _Mevcommitavs.Contract.Owner(&_Mevcommitavs.CallOpts) +} + +// Paused is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_Mevcommitavs *MevcommitavsCaller) Paused(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "paused") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// Paused is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_Mevcommitavs *MevcommitavsSession) Paused() (bool, error) { + return _Mevcommitavs.Contract.Paused(&_Mevcommitavs.CallOpts) +} + +// Paused is a free data retrieval call binding the contract method 0x5c975abb. +// +// Solidity: function paused() view returns(bool) +func (_Mevcommitavs *MevcommitavsCallerSession) Paused() (bool, error) { + return _Mevcommitavs.Contract.Paused(&_Mevcommitavs.CallOpts) +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_Mevcommitavs *MevcommitavsCaller) ProxiableUUID(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "proxiableUUID") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_Mevcommitavs *MevcommitavsSession) ProxiableUUID() ([32]byte, error) { + return _Mevcommitavs.Contract.ProxiableUUID(&_Mevcommitavs.CallOpts) +} + +// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d. +// +// Solidity: function proxiableUUID() view returns(bytes32) +func (_Mevcommitavs *MevcommitavsCallerSession) ProxiableUUID() ([32]byte, error) { + return _Mevcommitavs.Contract.ProxiableUUID(&_Mevcommitavs.CallOpts) +} + +// RestakeableStrategies is a free data retrieval call binding the contract method 0x94eef385. +// +// Solidity: function restakeableStrategies(uint256 ) view returns(address) +func (_Mevcommitavs *MevcommitavsCaller) RestakeableStrategies(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "restakeableStrategies", arg0) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// RestakeableStrategies is a free data retrieval call binding the contract method 0x94eef385. +// +// Solidity: function restakeableStrategies(uint256 ) view returns(address) +func (_Mevcommitavs *MevcommitavsSession) RestakeableStrategies(arg0 *big.Int) (common.Address, error) { + return _Mevcommitavs.Contract.RestakeableStrategies(&_Mevcommitavs.CallOpts, arg0) +} + +// RestakeableStrategies is a free data retrieval call binding the contract method 0x94eef385. +// +// Solidity: function restakeableStrategies(uint256 ) view returns(address) +func (_Mevcommitavs *MevcommitavsCallerSession) RestakeableStrategies(arg0 *big.Int) (common.Address, error) { + return _Mevcommitavs.Contract.RestakeableStrategies(&_Mevcommitavs.CallOpts, arg0) +} + +// UnfreezeFee is a free data retrieval call binding the contract method 0x90d0c8c2. +// +// Solidity: function unfreezeFee() view returns(uint256) +func (_Mevcommitavs *MevcommitavsCaller) UnfreezeFee(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "unfreezeFee") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// UnfreezeFee is a free data retrieval call binding the contract method 0x90d0c8c2. +// +// Solidity: function unfreezeFee() view returns(uint256) +func (_Mevcommitavs *MevcommitavsSession) UnfreezeFee() (*big.Int, error) { + return _Mevcommitavs.Contract.UnfreezeFee(&_Mevcommitavs.CallOpts) +} + +// UnfreezeFee is a free data retrieval call binding the contract method 0x90d0c8c2. +// +// Solidity: function unfreezeFee() view returns(uint256) +func (_Mevcommitavs *MevcommitavsCallerSession) UnfreezeFee() (*big.Int, error) { + return _Mevcommitavs.Contract.UnfreezeFee(&_Mevcommitavs.CallOpts) +} + +// UnfreezePeriodBlocks is a free data retrieval call binding the contract method 0x735ca5dd. +// +// Solidity: function unfreezePeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsCaller) UnfreezePeriodBlocks(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "unfreezePeriodBlocks") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// UnfreezePeriodBlocks is a free data retrieval call binding the contract method 0x735ca5dd. +// +// Solidity: function unfreezePeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsSession) UnfreezePeriodBlocks() (*big.Int, error) { + return _Mevcommitavs.Contract.UnfreezePeriodBlocks(&_Mevcommitavs.CallOpts) +} + +// UnfreezePeriodBlocks is a free data retrieval call binding the contract method 0x735ca5dd. +// +// Solidity: function unfreezePeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsCallerSession) UnfreezePeriodBlocks() (*big.Int, error) { + return _Mevcommitavs.Contract.UnfreezePeriodBlocks(&_Mevcommitavs.CallOpts) +} + +// UnfreezeReceiver is a free data retrieval call binding the contract method 0xc9207afb. +// +// Solidity: function unfreezeReceiver() view returns(address) +func (_Mevcommitavs *MevcommitavsCaller) UnfreezeReceiver(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "unfreezeReceiver") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// UnfreezeReceiver is a free data retrieval call binding the contract method 0xc9207afb. +// +// Solidity: function unfreezeReceiver() view returns(address) +func (_Mevcommitavs *MevcommitavsSession) UnfreezeReceiver() (common.Address, error) { + return _Mevcommitavs.Contract.UnfreezeReceiver(&_Mevcommitavs.CallOpts) +} + +// UnfreezeReceiver is a free data retrieval call binding the contract method 0xc9207afb. +// +// Solidity: function unfreezeReceiver() view returns(address) +func (_Mevcommitavs *MevcommitavsCallerSession) UnfreezeReceiver() (common.Address, error) { + return _Mevcommitavs.Contract.UnfreezeReceiver(&_Mevcommitavs.CallOpts) +} + +// ValidatorDeregPeriodBlocks is a free data retrieval call binding the contract method 0x41a364a8. +// +// Solidity: function validatorDeregPeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsCaller) ValidatorDeregPeriodBlocks(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "validatorDeregPeriodBlocks") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ValidatorDeregPeriodBlocks is a free data retrieval call binding the contract method 0x41a364a8. +// +// Solidity: function validatorDeregPeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsSession) ValidatorDeregPeriodBlocks() (*big.Int, error) { + return _Mevcommitavs.Contract.ValidatorDeregPeriodBlocks(&_Mevcommitavs.CallOpts) +} + +// ValidatorDeregPeriodBlocks is a free data retrieval call binding the contract method 0x41a364a8. +// +// Solidity: function validatorDeregPeriodBlocks() view returns(uint256) +func (_Mevcommitavs *MevcommitavsCallerSession) ValidatorDeregPeriodBlocks() (*big.Int, error) { + return _Mevcommitavs.Contract.ValidatorDeregPeriodBlocks(&_Mevcommitavs.CallOpts) +} + +// ValidatorRegistrations is a free data retrieval call binding the contract method 0x8cdaf000. +// +// Solidity: function validatorRegistrations(bytes ) view returns(bool exists, address podOwner, (bool,uint256) freezeHeight, (bool,uint256) deregRequestHeight) +func (_Mevcommitavs *MevcommitavsCaller) ValidatorRegistrations(opts *bind.CallOpts, arg0 []byte) (struct { + Exists bool + PodOwner common.Address + FreezeHeight EventHeightLibEventHeight + DeregRequestHeight EventHeightLibEventHeight +}, error) { + var out []interface{} + err := _Mevcommitavs.contract.Call(opts, &out, "validatorRegistrations", arg0) + + outstruct := new(struct { + Exists bool + PodOwner common.Address + FreezeHeight EventHeightLibEventHeight + DeregRequestHeight EventHeightLibEventHeight + }) + if err != nil { + return *outstruct, err + } + + outstruct.Exists = *abi.ConvertType(out[0], new(bool)).(*bool) + outstruct.PodOwner = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + outstruct.FreezeHeight = *abi.ConvertType(out[2], new(EventHeightLibEventHeight)).(*EventHeightLibEventHeight) + outstruct.DeregRequestHeight = *abi.ConvertType(out[3], new(EventHeightLibEventHeight)).(*EventHeightLibEventHeight) + + return *outstruct, err + +} + +// ValidatorRegistrations is a free data retrieval call binding the contract method 0x8cdaf000. +// +// Solidity: function validatorRegistrations(bytes ) view returns(bool exists, address podOwner, (bool,uint256) freezeHeight, (bool,uint256) deregRequestHeight) +func (_Mevcommitavs *MevcommitavsSession) ValidatorRegistrations(arg0 []byte) (struct { + Exists bool + PodOwner common.Address + FreezeHeight EventHeightLibEventHeight + DeregRequestHeight EventHeightLibEventHeight +}, error) { + return _Mevcommitavs.Contract.ValidatorRegistrations(&_Mevcommitavs.CallOpts, arg0) +} + +// ValidatorRegistrations is a free data retrieval call binding the contract method 0x8cdaf000. +// +// Solidity: function validatorRegistrations(bytes ) view returns(bool exists, address podOwner, (bool,uint256) freezeHeight, (bool,uint256) deregRequestHeight) +func (_Mevcommitavs *MevcommitavsCallerSession) ValidatorRegistrations(arg0 []byte) (struct { + Exists bool + PodOwner common.Address + FreezeHeight EventHeightLibEventHeight + DeregRequestHeight EventHeightLibEventHeight +}, error) { + return _Mevcommitavs.Contract.ValidatorRegistrations(&_Mevcommitavs.CallOpts, arg0) +} + +// DeregisterLSTRestaker is a paid mutator transaction binding the contract method 0x4ad29427. +// +// Solidity: function deregisterLSTRestaker() returns() +func (_Mevcommitavs *MevcommitavsTransactor) DeregisterLSTRestaker(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "deregisterLSTRestaker") +} + +// DeregisterLSTRestaker is a paid mutator transaction binding the contract method 0x4ad29427. +// +// Solidity: function deregisterLSTRestaker() returns() +func (_Mevcommitavs *MevcommitavsSession) DeregisterLSTRestaker() (*types.Transaction, error) { + return _Mevcommitavs.Contract.DeregisterLSTRestaker(&_Mevcommitavs.TransactOpts) +} + +// DeregisterLSTRestaker is a paid mutator transaction binding the contract method 0x4ad29427. +// +// Solidity: function deregisterLSTRestaker() returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) DeregisterLSTRestaker() (*types.Transaction, error) { + return _Mevcommitavs.Contract.DeregisterLSTRestaker(&_Mevcommitavs.TransactOpts) +} + +// DeregisterOperator is a paid mutator transaction binding the contract method 0xd8cf98ca. +// +// Solidity: function deregisterOperator(address operator) returns() +func (_Mevcommitavs *MevcommitavsTransactor) DeregisterOperator(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "deregisterOperator", operator) +} + +// DeregisterOperator is a paid mutator transaction binding the contract method 0xd8cf98ca. +// +// Solidity: function deregisterOperator(address operator) returns() +func (_Mevcommitavs *MevcommitavsSession) DeregisterOperator(operator common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.DeregisterOperator(&_Mevcommitavs.TransactOpts, operator) +} + +// DeregisterOperator is a paid mutator transaction binding the contract method 0xd8cf98ca. +// +// Solidity: function deregisterOperator(address operator) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) DeregisterOperator(operator common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.DeregisterOperator(&_Mevcommitavs.TransactOpts, operator) +} + +// DeregisterValidators is a paid mutator transaction binding the contract method 0xc6c6a657. +// +// Solidity: function deregisterValidators(bytes[] valPubKeys) returns() +func (_Mevcommitavs *MevcommitavsTransactor) DeregisterValidators(opts *bind.TransactOpts, valPubKeys [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "deregisterValidators", valPubKeys) +} + +// DeregisterValidators is a paid mutator transaction binding the contract method 0xc6c6a657. +// +// Solidity: function deregisterValidators(bytes[] valPubKeys) returns() +func (_Mevcommitavs *MevcommitavsSession) DeregisterValidators(valPubKeys [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.DeregisterValidators(&_Mevcommitavs.TransactOpts, valPubKeys) +} + +// DeregisterValidators is a paid mutator transaction binding the contract method 0xc6c6a657. +// +// Solidity: function deregisterValidators(bytes[] valPubKeys) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) DeregisterValidators(valPubKeys [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.DeregisterValidators(&_Mevcommitavs.TransactOpts, valPubKeys) +} + +// Freeze is a paid mutator transaction binding the contract method 0xa694d33f. +// +// Solidity: function freeze(bytes[] valPubKeys) returns() +func (_Mevcommitavs *MevcommitavsTransactor) Freeze(opts *bind.TransactOpts, valPubKeys [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "freeze", valPubKeys) +} + +// Freeze is a paid mutator transaction binding the contract method 0xa694d33f. +// +// Solidity: function freeze(bytes[] valPubKeys) returns() +func (_Mevcommitavs *MevcommitavsSession) Freeze(valPubKeys [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.Freeze(&_Mevcommitavs.TransactOpts, valPubKeys) +} + +// Freeze is a paid mutator transaction binding the contract method 0xa694d33f. +// +// Solidity: function freeze(bytes[] valPubKeys) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) Freeze(valPubKeys [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.Freeze(&_Mevcommitavs.TransactOpts, valPubKeys) +} + +// Initialize is a paid mutator transaction binding the contract method 0x78a69cd4. +// +// Solidity: function initialize(address owner_, address delegationManager_, address eigenPodManager_, address strategyManager_, address avsDirectory_, address[] restakeableStrategies_, address freezeOracle_, uint256 unfreezeFee_, address unfreezeReceiver_, uint256 unfreezePeriodBlocks_, uint256 operatorDeregPeriodBlocks_, uint256 validatorDeregPeriodBlocks_, uint256 lstRestakerDeregPeriodBlocks_, string metadataURI_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) Initialize(opts *bind.TransactOpts, owner_ common.Address, delegationManager_ common.Address, eigenPodManager_ common.Address, strategyManager_ common.Address, avsDirectory_ common.Address, restakeableStrategies_ []common.Address, freezeOracle_ common.Address, unfreezeFee_ *big.Int, unfreezeReceiver_ common.Address, unfreezePeriodBlocks_ *big.Int, operatorDeregPeriodBlocks_ *big.Int, validatorDeregPeriodBlocks_ *big.Int, lstRestakerDeregPeriodBlocks_ *big.Int, metadataURI_ string) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "initialize", owner_, delegationManager_, eigenPodManager_, strategyManager_, avsDirectory_, restakeableStrategies_, freezeOracle_, unfreezeFee_, unfreezeReceiver_, unfreezePeriodBlocks_, operatorDeregPeriodBlocks_, validatorDeregPeriodBlocks_, lstRestakerDeregPeriodBlocks_, metadataURI_) +} + +// Initialize is a paid mutator transaction binding the contract method 0x78a69cd4. +// +// Solidity: function initialize(address owner_, address delegationManager_, address eigenPodManager_, address strategyManager_, address avsDirectory_, address[] restakeableStrategies_, address freezeOracle_, uint256 unfreezeFee_, address unfreezeReceiver_, uint256 unfreezePeriodBlocks_, uint256 operatorDeregPeriodBlocks_, uint256 validatorDeregPeriodBlocks_, uint256 lstRestakerDeregPeriodBlocks_, string metadataURI_) returns() +func (_Mevcommitavs *MevcommitavsSession) Initialize(owner_ common.Address, delegationManager_ common.Address, eigenPodManager_ common.Address, strategyManager_ common.Address, avsDirectory_ common.Address, restakeableStrategies_ []common.Address, freezeOracle_ common.Address, unfreezeFee_ *big.Int, unfreezeReceiver_ common.Address, unfreezePeriodBlocks_ *big.Int, operatorDeregPeriodBlocks_ *big.Int, validatorDeregPeriodBlocks_ *big.Int, lstRestakerDeregPeriodBlocks_ *big.Int, metadataURI_ string) (*types.Transaction, error) { + return _Mevcommitavs.Contract.Initialize(&_Mevcommitavs.TransactOpts, owner_, delegationManager_, eigenPodManager_, strategyManager_, avsDirectory_, restakeableStrategies_, freezeOracle_, unfreezeFee_, unfreezeReceiver_, unfreezePeriodBlocks_, operatorDeregPeriodBlocks_, validatorDeregPeriodBlocks_, lstRestakerDeregPeriodBlocks_, metadataURI_) +} + +// Initialize is a paid mutator transaction binding the contract method 0x78a69cd4. +// +// Solidity: function initialize(address owner_, address delegationManager_, address eigenPodManager_, address strategyManager_, address avsDirectory_, address[] restakeableStrategies_, address freezeOracle_, uint256 unfreezeFee_, address unfreezeReceiver_, uint256 unfreezePeriodBlocks_, uint256 operatorDeregPeriodBlocks_, uint256 validatorDeregPeriodBlocks_, uint256 lstRestakerDeregPeriodBlocks_, string metadataURI_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) Initialize(owner_ common.Address, delegationManager_ common.Address, eigenPodManager_ common.Address, strategyManager_ common.Address, avsDirectory_ common.Address, restakeableStrategies_ []common.Address, freezeOracle_ common.Address, unfreezeFee_ *big.Int, unfreezeReceiver_ common.Address, unfreezePeriodBlocks_ *big.Int, operatorDeregPeriodBlocks_ *big.Int, validatorDeregPeriodBlocks_ *big.Int, lstRestakerDeregPeriodBlocks_ *big.Int, metadataURI_ string) (*types.Transaction, error) { + return _Mevcommitavs.Contract.Initialize(&_Mevcommitavs.TransactOpts, owner_, delegationManager_, eigenPodManager_, strategyManager_, avsDirectory_, restakeableStrategies_, freezeOracle_, unfreezeFee_, unfreezeReceiver_, unfreezePeriodBlocks_, operatorDeregPeriodBlocks_, validatorDeregPeriodBlocks_, lstRestakerDeregPeriodBlocks_, metadataURI_) +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_Mevcommitavs *MevcommitavsTransactor) Pause(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "pause") +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_Mevcommitavs *MevcommitavsSession) Pause() (*types.Transaction, error) { + return _Mevcommitavs.Contract.Pause(&_Mevcommitavs.TransactOpts) +} + +// Pause is a paid mutator transaction binding the contract method 0x8456cb59. +// +// Solidity: function pause() returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) Pause() (*types.Transaction, error) { + return _Mevcommitavs.Contract.Pause(&_Mevcommitavs.TransactOpts) +} + +// RegisterLSTRestaker is a paid mutator transaction binding the contract method 0xa807a70e. +// +// Solidity: function registerLSTRestaker(bytes[] chosenValidators) returns() +func (_Mevcommitavs *MevcommitavsTransactor) RegisterLSTRestaker(opts *bind.TransactOpts, chosenValidators [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "registerLSTRestaker", chosenValidators) +} + +// RegisterLSTRestaker is a paid mutator transaction binding the contract method 0xa807a70e. +// +// Solidity: function registerLSTRestaker(bytes[] chosenValidators) returns() +func (_Mevcommitavs *MevcommitavsSession) RegisterLSTRestaker(chosenValidators [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.RegisterLSTRestaker(&_Mevcommitavs.TransactOpts, chosenValidators) +} + +// RegisterLSTRestaker is a paid mutator transaction binding the contract method 0xa807a70e. +// +// Solidity: function registerLSTRestaker(bytes[] chosenValidators) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) RegisterLSTRestaker(chosenValidators [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.RegisterLSTRestaker(&_Mevcommitavs.TransactOpts, chosenValidators) +} + +// RegisterOperator is a paid mutator transaction binding the contract method 0x8317781d. +// +// Solidity: function registerOperator((bytes,bytes32,uint256) operatorSignature) returns() +func (_Mevcommitavs *MevcommitavsTransactor) RegisterOperator(opts *bind.TransactOpts, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "registerOperator", operatorSignature) +} + +// RegisterOperator is a paid mutator transaction binding the contract method 0x8317781d. +// +// Solidity: function registerOperator((bytes,bytes32,uint256) operatorSignature) returns() +func (_Mevcommitavs *MevcommitavsSession) RegisterOperator(operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _Mevcommitavs.Contract.RegisterOperator(&_Mevcommitavs.TransactOpts, operatorSignature) +} + +// RegisterOperator is a paid mutator transaction binding the contract method 0x8317781d. +// +// Solidity: function registerOperator((bytes,bytes32,uint256) operatorSignature) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) RegisterOperator(operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _Mevcommitavs.Contract.RegisterOperator(&_Mevcommitavs.TransactOpts, operatorSignature) +} + +// RegisterValidatorsByPodOwners is a paid mutator transaction binding the contract method 0x86566f96. +// +// Solidity: function registerValidatorsByPodOwners(bytes[][] valPubKeys, address[] podOwners) returns() +func (_Mevcommitavs *MevcommitavsTransactor) RegisterValidatorsByPodOwners(opts *bind.TransactOpts, valPubKeys [][][]byte, podOwners []common.Address) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "registerValidatorsByPodOwners", valPubKeys, podOwners) +} + +// RegisterValidatorsByPodOwners is a paid mutator transaction binding the contract method 0x86566f96. +// +// Solidity: function registerValidatorsByPodOwners(bytes[][] valPubKeys, address[] podOwners) returns() +func (_Mevcommitavs *MevcommitavsSession) RegisterValidatorsByPodOwners(valPubKeys [][][]byte, podOwners []common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.RegisterValidatorsByPodOwners(&_Mevcommitavs.TransactOpts, valPubKeys, podOwners) +} + +// RegisterValidatorsByPodOwners is a paid mutator transaction binding the contract method 0x86566f96. +// +// Solidity: function registerValidatorsByPodOwners(bytes[][] valPubKeys, address[] podOwners) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) RegisterValidatorsByPodOwners(valPubKeys [][][]byte, podOwners []common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.RegisterValidatorsByPodOwners(&_Mevcommitavs.TransactOpts, valPubKeys, podOwners) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_Mevcommitavs *MevcommitavsTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_Mevcommitavs *MevcommitavsSession) RenounceOwnership() (*types.Transaction, error) { + return _Mevcommitavs.Contract.RenounceOwnership(&_Mevcommitavs.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _Mevcommitavs.Contract.RenounceOwnership(&_Mevcommitavs.TransactOpts) +} + +// RequestLSTRestakerDeregistration is a paid mutator transaction binding the contract method 0x6e7a0e1f. +// +// Solidity: function requestLSTRestakerDeregistration() returns() +func (_Mevcommitavs *MevcommitavsTransactor) RequestLSTRestakerDeregistration(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "requestLSTRestakerDeregistration") +} + +// RequestLSTRestakerDeregistration is a paid mutator transaction binding the contract method 0x6e7a0e1f. +// +// Solidity: function requestLSTRestakerDeregistration() returns() +func (_Mevcommitavs *MevcommitavsSession) RequestLSTRestakerDeregistration() (*types.Transaction, error) { + return _Mevcommitavs.Contract.RequestLSTRestakerDeregistration(&_Mevcommitavs.TransactOpts) +} + +// RequestLSTRestakerDeregistration is a paid mutator transaction binding the contract method 0x6e7a0e1f. +// +// Solidity: function requestLSTRestakerDeregistration() returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) RequestLSTRestakerDeregistration() (*types.Transaction, error) { + return _Mevcommitavs.Contract.RequestLSTRestakerDeregistration(&_Mevcommitavs.TransactOpts) +} + +// RequestOperatorDeregistration is a paid mutator transaction binding the contract method 0x95f8451b. +// +// Solidity: function requestOperatorDeregistration(address operator) returns() +func (_Mevcommitavs *MevcommitavsTransactor) RequestOperatorDeregistration(opts *bind.TransactOpts, operator common.Address) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "requestOperatorDeregistration", operator) +} + +// RequestOperatorDeregistration is a paid mutator transaction binding the contract method 0x95f8451b. +// +// Solidity: function requestOperatorDeregistration(address operator) returns() +func (_Mevcommitavs *MevcommitavsSession) RequestOperatorDeregistration(operator common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.RequestOperatorDeregistration(&_Mevcommitavs.TransactOpts, operator) +} + +// RequestOperatorDeregistration is a paid mutator transaction binding the contract method 0x95f8451b. +// +// Solidity: function requestOperatorDeregistration(address operator) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) RequestOperatorDeregistration(operator common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.RequestOperatorDeregistration(&_Mevcommitavs.TransactOpts, operator) +} + +// RequestValidatorsDeregistration is a paid mutator transaction binding the contract method 0xeb35369b. +// +// Solidity: function requestValidatorsDeregistration(bytes[] valPubKeys) returns() +func (_Mevcommitavs *MevcommitavsTransactor) RequestValidatorsDeregistration(opts *bind.TransactOpts, valPubKeys [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "requestValidatorsDeregistration", valPubKeys) +} + +// RequestValidatorsDeregistration is a paid mutator transaction binding the contract method 0xeb35369b. +// +// Solidity: function requestValidatorsDeregistration(bytes[] valPubKeys) returns() +func (_Mevcommitavs *MevcommitavsSession) RequestValidatorsDeregistration(valPubKeys [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.RequestValidatorsDeregistration(&_Mevcommitavs.TransactOpts, valPubKeys) +} + +// RequestValidatorsDeregistration is a paid mutator transaction binding the contract method 0xeb35369b. +// +// Solidity: function requestValidatorsDeregistration(bytes[] valPubKeys) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) RequestValidatorsDeregistration(valPubKeys [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.RequestValidatorsDeregistration(&_Mevcommitavs.TransactOpts, valPubKeys) +} + +// SetAVSDirectory is a paid mutator transaction binding the contract method 0x862621ef. +// +// Solidity: function setAVSDirectory(address avsDirectory_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetAVSDirectory(opts *bind.TransactOpts, avsDirectory_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setAVSDirectory", avsDirectory_) +} + +// SetAVSDirectory is a paid mutator transaction binding the contract method 0x862621ef. +// +// Solidity: function setAVSDirectory(address avsDirectory_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetAVSDirectory(avsDirectory_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetAVSDirectory(&_Mevcommitavs.TransactOpts, avsDirectory_) +} + +// SetAVSDirectory is a paid mutator transaction binding the contract method 0x862621ef. +// +// Solidity: function setAVSDirectory(address avsDirectory_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetAVSDirectory(avsDirectory_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetAVSDirectory(&_Mevcommitavs.TransactOpts, avsDirectory_) +} + +// SetDelegationManager is a paid mutator transaction binding the contract method 0x1a8d0de2. +// +// Solidity: function setDelegationManager(address delegationManager_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetDelegationManager(opts *bind.TransactOpts, delegationManager_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setDelegationManager", delegationManager_) +} + +// SetDelegationManager is a paid mutator transaction binding the contract method 0x1a8d0de2. +// +// Solidity: function setDelegationManager(address delegationManager_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetDelegationManager(delegationManager_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetDelegationManager(&_Mevcommitavs.TransactOpts, delegationManager_) +} + +// SetDelegationManager is a paid mutator transaction binding the contract method 0x1a8d0de2. +// +// Solidity: function setDelegationManager(address delegationManager_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetDelegationManager(delegationManager_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetDelegationManager(&_Mevcommitavs.TransactOpts, delegationManager_) +} + +// SetEigenPodManager is a paid mutator transaction binding the contract method 0x3c2adfde. +// +// Solidity: function setEigenPodManager(address eigenPodManager_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetEigenPodManager(opts *bind.TransactOpts, eigenPodManager_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setEigenPodManager", eigenPodManager_) +} + +// SetEigenPodManager is a paid mutator transaction binding the contract method 0x3c2adfde. +// +// Solidity: function setEigenPodManager(address eigenPodManager_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetEigenPodManager(eigenPodManager_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetEigenPodManager(&_Mevcommitavs.TransactOpts, eigenPodManager_) +} + +// SetEigenPodManager is a paid mutator transaction binding the contract method 0x3c2adfde. +// +// Solidity: function setEigenPodManager(address eigenPodManager_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetEigenPodManager(eigenPodManager_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetEigenPodManager(&_Mevcommitavs.TransactOpts, eigenPodManager_) +} + +// SetFreezeOracle is a paid mutator transaction binding the contract method 0x65a49071. +// +// Solidity: function setFreezeOracle(address freezeOracle_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetFreezeOracle(opts *bind.TransactOpts, freezeOracle_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setFreezeOracle", freezeOracle_) +} + +// SetFreezeOracle is a paid mutator transaction binding the contract method 0x65a49071. +// +// Solidity: function setFreezeOracle(address freezeOracle_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetFreezeOracle(freezeOracle_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetFreezeOracle(&_Mevcommitavs.TransactOpts, freezeOracle_) +} + +// SetFreezeOracle is a paid mutator transaction binding the contract method 0x65a49071. +// +// Solidity: function setFreezeOracle(address freezeOracle_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetFreezeOracle(freezeOracle_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetFreezeOracle(&_Mevcommitavs.TransactOpts, freezeOracle_) +} + +// SetLstRestakerDeregPeriodBlocks is a paid mutator transaction binding the contract method 0x62f3dedb. +// +// Solidity: function setLstRestakerDeregPeriodBlocks(uint256 lstRestakerDeregPeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetLstRestakerDeregPeriodBlocks(opts *bind.TransactOpts, lstRestakerDeregPeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setLstRestakerDeregPeriodBlocks", lstRestakerDeregPeriodBlocks_) +} + +// SetLstRestakerDeregPeriodBlocks is a paid mutator transaction binding the contract method 0x62f3dedb. +// +// Solidity: function setLstRestakerDeregPeriodBlocks(uint256 lstRestakerDeregPeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetLstRestakerDeregPeriodBlocks(lstRestakerDeregPeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetLstRestakerDeregPeriodBlocks(&_Mevcommitavs.TransactOpts, lstRestakerDeregPeriodBlocks_) +} + +// SetLstRestakerDeregPeriodBlocks is a paid mutator transaction binding the contract method 0x62f3dedb. +// +// Solidity: function setLstRestakerDeregPeriodBlocks(uint256 lstRestakerDeregPeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetLstRestakerDeregPeriodBlocks(lstRestakerDeregPeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetLstRestakerDeregPeriodBlocks(&_Mevcommitavs.TransactOpts, lstRestakerDeregPeriodBlocks_) +} + +// SetOperatorDeregPeriodBlocks is a paid mutator transaction binding the contract method 0xedfb9d0d. +// +// Solidity: function setOperatorDeregPeriodBlocks(uint256 operatorDeregPeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetOperatorDeregPeriodBlocks(opts *bind.TransactOpts, operatorDeregPeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setOperatorDeregPeriodBlocks", operatorDeregPeriodBlocks_) +} + +// SetOperatorDeregPeriodBlocks is a paid mutator transaction binding the contract method 0xedfb9d0d. +// +// Solidity: function setOperatorDeregPeriodBlocks(uint256 operatorDeregPeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetOperatorDeregPeriodBlocks(operatorDeregPeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetOperatorDeregPeriodBlocks(&_Mevcommitavs.TransactOpts, operatorDeregPeriodBlocks_) +} + +// SetOperatorDeregPeriodBlocks is a paid mutator transaction binding the contract method 0xedfb9d0d. +// +// Solidity: function setOperatorDeregPeriodBlocks(uint256 operatorDeregPeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetOperatorDeregPeriodBlocks(operatorDeregPeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetOperatorDeregPeriodBlocks(&_Mevcommitavs.TransactOpts, operatorDeregPeriodBlocks_) +} + +// SetRestakeableStrategies is a paid mutator transaction binding the contract method 0xd871d570. +// +// Solidity: function setRestakeableStrategies(address[] restakeableStrategies_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetRestakeableStrategies(opts *bind.TransactOpts, restakeableStrategies_ []common.Address) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setRestakeableStrategies", restakeableStrategies_) +} + +// SetRestakeableStrategies is a paid mutator transaction binding the contract method 0xd871d570. +// +// Solidity: function setRestakeableStrategies(address[] restakeableStrategies_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetRestakeableStrategies(restakeableStrategies_ []common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetRestakeableStrategies(&_Mevcommitavs.TransactOpts, restakeableStrategies_) +} + +// SetRestakeableStrategies is a paid mutator transaction binding the contract method 0xd871d570. +// +// Solidity: function setRestakeableStrategies(address[] restakeableStrategies_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetRestakeableStrategies(restakeableStrategies_ []common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetRestakeableStrategies(&_Mevcommitavs.TransactOpts, restakeableStrategies_) +} + +// SetStrategyManager is a paid mutator transaction binding the contract method 0x5c966646. +// +// Solidity: function setStrategyManager(address strategyManager_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetStrategyManager(opts *bind.TransactOpts, strategyManager_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setStrategyManager", strategyManager_) +} + +// SetStrategyManager is a paid mutator transaction binding the contract method 0x5c966646. +// +// Solidity: function setStrategyManager(address strategyManager_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetStrategyManager(strategyManager_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetStrategyManager(&_Mevcommitavs.TransactOpts, strategyManager_) +} + +// SetStrategyManager is a paid mutator transaction binding the contract method 0x5c966646. +// +// Solidity: function setStrategyManager(address strategyManager_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetStrategyManager(strategyManager_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetStrategyManager(&_Mevcommitavs.TransactOpts, strategyManager_) +} + +// SetUnfreezeFee is a paid mutator transaction binding the contract method 0x80e7751c. +// +// Solidity: function setUnfreezeFee(uint256 unfreezeFee_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetUnfreezeFee(opts *bind.TransactOpts, unfreezeFee_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setUnfreezeFee", unfreezeFee_) +} + +// SetUnfreezeFee is a paid mutator transaction binding the contract method 0x80e7751c. +// +// Solidity: function setUnfreezeFee(uint256 unfreezeFee_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetUnfreezeFee(unfreezeFee_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetUnfreezeFee(&_Mevcommitavs.TransactOpts, unfreezeFee_) +} + +// SetUnfreezeFee is a paid mutator transaction binding the contract method 0x80e7751c. +// +// Solidity: function setUnfreezeFee(uint256 unfreezeFee_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetUnfreezeFee(unfreezeFee_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetUnfreezeFee(&_Mevcommitavs.TransactOpts, unfreezeFee_) +} + +// SetUnfreezePeriodBlocks is a paid mutator transaction binding the contract method 0x86c823e0. +// +// Solidity: function setUnfreezePeriodBlocks(uint256 unfreezePeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetUnfreezePeriodBlocks(opts *bind.TransactOpts, unfreezePeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setUnfreezePeriodBlocks", unfreezePeriodBlocks_) +} + +// SetUnfreezePeriodBlocks is a paid mutator transaction binding the contract method 0x86c823e0. +// +// Solidity: function setUnfreezePeriodBlocks(uint256 unfreezePeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetUnfreezePeriodBlocks(unfreezePeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetUnfreezePeriodBlocks(&_Mevcommitavs.TransactOpts, unfreezePeriodBlocks_) +} + +// SetUnfreezePeriodBlocks is a paid mutator transaction binding the contract method 0x86c823e0. +// +// Solidity: function setUnfreezePeriodBlocks(uint256 unfreezePeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetUnfreezePeriodBlocks(unfreezePeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetUnfreezePeriodBlocks(&_Mevcommitavs.TransactOpts, unfreezePeriodBlocks_) +} + +// SetUnfreezeReceiver is a paid mutator transaction binding the contract method 0x7d0b802d. +// +// Solidity: function setUnfreezeReceiver(address unfreezeReceiver_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetUnfreezeReceiver(opts *bind.TransactOpts, unfreezeReceiver_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setUnfreezeReceiver", unfreezeReceiver_) +} + +// SetUnfreezeReceiver is a paid mutator transaction binding the contract method 0x7d0b802d. +// +// Solidity: function setUnfreezeReceiver(address unfreezeReceiver_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetUnfreezeReceiver(unfreezeReceiver_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetUnfreezeReceiver(&_Mevcommitavs.TransactOpts, unfreezeReceiver_) +} + +// SetUnfreezeReceiver is a paid mutator transaction binding the contract method 0x7d0b802d. +// +// Solidity: function setUnfreezeReceiver(address unfreezeReceiver_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetUnfreezeReceiver(unfreezeReceiver_ common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetUnfreezeReceiver(&_Mevcommitavs.TransactOpts, unfreezeReceiver_) +} + +// SetValidatorDeregPeriodBlocks is a paid mutator transaction binding the contract method 0xb20bbf0a. +// +// Solidity: function setValidatorDeregPeriodBlocks(uint256 validatorDeregPeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) SetValidatorDeregPeriodBlocks(opts *bind.TransactOpts, validatorDeregPeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "setValidatorDeregPeriodBlocks", validatorDeregPeriodBlocks_) +} + +// SetValidatorDeregPeriodBlocks is a paid mutator transaction binding the contract method 0xb20bbf0a. +// +// Solidity: function setValidatorDeregPeriodBlocks(uint256 validatorDeregPeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsSession) SetValidatorDeregPeriodBlocks(validatorDeregPeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetValidatorDeregPeriodBlocks(&_Mevcommitavs.TransactOpts, validatorDeregPeriodBlocks_) +} + +// SetValidatorDeregPeriodBlocks is a paid mutator transaction binding the contract method 0xb20bbf0a. +// +// Solidity: function setValidatorDeregPeriodBlocks(uint256 validatorDeregPeriodBlocks_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) SetValidatorDeregPeriodBlocks(validatorDeregPeriodBlocks_ *big.Int) (*types.Transaction, error) { + return _Mevcommitavs.Contract.SetValidatorDeregPeriodBlocks(&_Mevcommitavs.TransactOpts, validatorDeregPeriodBlocks_) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_Mevcommitavs *MevcommitavsTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_Mevcommitavs *MevcommitavsSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.TransferOwnership(&_Mevcommitavs.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _Mevcommitavs.Contract.TransferOwnership(&_Mevcommitavs.TransactOpts, newOwner) +} + +// Unfreeze is a paid mutator transaction binding the contract method 0xb764d33c. +// +// Solidity: function unfreeze(bytes[] valPubKey) payable returns() +func (_Mevcommitavs *MevcommitavsTransactor) Unfreeze(opts *bind.TransactOpts, valPubKey [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "unfreeze", valPubKey) +} + +// Unfreeze is a paid mutator transaction binding the contract method 0xb764d33c. +// +// Solidity: function unfreeze(bytes[] valPubKey) payable returns() +func (_Mevcommitavs *MevcommitavsSession) Unfreeze(valPubKey [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.Unfreeze(&_Mevcommitavs.TransactOpts, valPubKey) +} + +// Unfreeze is a paid mutator transaction binding the contract method 0xb764d33c. +// +// Solidity: function unfreeze(bytes[] valPubKey) payable returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) Unfreeze(valPubKey [][]byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.Unfreeze(&_Mevcommitavs.TransactOpts, valPubKey) +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_Mevcommitavs *MevcommitavsTransactor) Unpause(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "unpause") +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_Mevcommitavs *MevcommitavsSession) Unpause() (*types.Transaction, error) { + return _Mevcommitavs.Contract.Unpause(&_Mevcommitavs.TransactOpts) +} + +// Unpause is a paid mutator transaction binding the contract method 0x3f4ba83a. +// +// Solidity: function unpause() returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) Unpause() (*types.Transaction, error) { + return _Mevcommitavs.Contract.Unpause(&_Mevcommitavs.TransactOpts) +} + +// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81. +// +// Solidity: function updateMetadataURI(string metadataURI_) returns() +func (_Mevcommitavs *MevcommitavsTransactor) UpdateMetadataURI(opts *bind.TransactOpts, metadataURI_ string) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "updateMetadataURI", metadataURI_) +} + +// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81. +// +// Solidity: function updateMetadataURI(string metadataURI_) returns() +func (_Mevcommitavs *MevcommitavsSession) UpdateMetadataURI(metadataURI_ string) (*types.Transaction, error) { + return _Mevcommitavs.Contract.UpdateMetadataURI(&_Mevcommitavs.TransactOpts, metadataURI_) +} + +// UpdateMetadataURI is a paid mutator transaction binding the contract method 0x53fd3e81. +// +// Solidity: function updateMetadataURI(string metadataURI_) returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) UpdateMetadataURI(metadataURI_ string) (*types.Transaction, error) { + return _Mevcommitavs.Contract.UpdateMetadataURI(&_Mevcommitavs.TransactOpts, metadataURI_) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_Mevcommitavs *MevcommitavsTransactor) UpgradeToAndCall(opts *bind.TransactOpts, newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _Mevcommitavs.contract.Transact(opts, "upgradeToAndCall", newImplementation, data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_Mevcommitavs *MevcommitavsSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.UpgradeToAndCall(&_Mevcommitavs.TransactOpts, newImplementation, data) +} + +// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286. +// +// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.UpgradeToAndCall(&_Mevcommitavs.TransactOpts, newImplementation, data) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Mevcommitavs *MevcommitavsTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _Mevcommitavs.contract.RawTransact(opts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Mevcommitavs *MevcommitavsSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.Fallback(&_Mevcommitavs.TransactOpts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _Mevcommitavs.Contract.Fallback(&_Mevcommitavs.TransactOpts, calldata) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Mevcommitavs *MevcommitavsTransactor) Receive(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Mevcommitavs.contract.RawTransact(opts, nil) // calldata is disallowed for receive function +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Mevcommitavs *MevcommitavsSession) Receive() (*types.Transaction, error) { + return _Mevcommitavs.Contract.Receive(&_Mevcommitavs.TransactOpts) +} + +// Receive is a paid mutator transaction binding the contract receive function. +// +// Solidity: receive() payable returns() +func (_Mevcommitavs *MevcommitavsTransactorSession) Receive() (*types.Transaction, error) { + return _Mevcommitavs.Contract.Receive(&_Mevcommitavs.TransactOpts) +} + +// MevcommitavsAVSDirectorySetIterator is returned from FilterAVSDirectorySet and is used to iterate over the raw logs and unpacked data for AVSDirectorySet events raised by the Mevcommitavs contract. +type MevcommitavsAVSDirectorySetIterator struct { + Event *MevcommitavsAVSDirectorySet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsAVSDirectorySetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsAVSDirectorySet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsAVSDirectorySet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsAVSDirectorySetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsAVSDirectorySetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsAVSDirectorySet represents a AVSDirectorySet event raised by the Mevcommitavs contract. +type MevcommitavsAVSDirectorySet struct { + AvsDirectory common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAVSDirectorySet is a free log retrieval operation binding the contract event 0x934223b20c24d569ff89796ae10a6997d43e2b3df0c3677fb6ca1f6e37ce344b. +// +// Solidity: event AVSDirectorySet(address indexed avsDirectory) +func (_Mevcommitavs *MevcommitavsFilterer) FilterAVSDirectorySet(opts *bind.FilterOpts, avsDirectory []common.Address) (*MevcommitavsAVSDirectorySetIterator, error) { + + var avsDirectoryRule []interface{} + for _, avsDirectoryItem := range avsDirectory { + avsDirectoryRule = append(avsDirectoryRule, avsDirectoryItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "AVSDirectorySet", avsDirectoryRule) + if err != nil { + return nil, err + } + return &MevcommitavsAVSDirectorySetIterator{contract: _Mevcommitavs.contract, event: "AVSDirectorySet", logs: logs, sub: sub}, nil +} + +// WatchAVSDirectorySet is a free log subscription operation binding the contract event 0x934223b20c24d569ff89796ae10a6997d43e2b3df0c3677fb6ca1f6e37ce344b. +// +// Solidity: event AVSDirectorySet(address indexed avsDirectory) +func (_Mevcommitavs *MevcommitavsFilterer) WatchAVSDirectorySet(opts *bind.WatchOpts, sink chan<- *MevcommitavsAVSDirectorySet, avsDirectory []common.Address) (event.Subscription, error) { + + var avsDirectoryRule []interface{} + for _, avsDirectoryItem := range avsDirectory { + avsDirectoryRule = append(avsDirectoryRule, avsDirectoryItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "AVSDirectorySet", avsDirectoryRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsAVSDirectorySet) + if err := _Mevcommitavs.contract.UnpackLog(event, "AVSDirectorySet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAVSDirectorySet is a log parse operation binding the contract event 0x934223b20c24d569ff89796ae10a6997d43e2b3df0c3677fb6ca1f6e37ce344b. +// +// Solidity: event AVSDirectorySet(address indexed avsDirectory) +func (_Mevcommitavs *MevcommitavsFilterer) ParseAVSDirectorySet(log types.Log) (*MevcommitavsAVSDirectorySet, error) { + event := new(MevcommitavsAVSDirectorySet) + if err := _Mevcommitavs.contract.UnpackLog(event, "AVSDirectorySet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsDelegationManagerSetIterator is returned from FilterDelegationManagerSet and is used to iterate over the raw logs and unpacked data for DelegationManagerSet events raised by the Mevcommitavs contract. +type MevcommitavsDelegationManagerSetIterator struct { + Event *MevcommitavsDelegationManagerSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsDelegationManagerSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsDelegationManagerSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsDelegationManagerSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsDelegationManagerSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsDelegationManagerSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsDelegationManagerSet represents a DelegationManagerSet event raised by the Mevcommitavs contract. +type MevcommitavsDelegationManagerSet struct { + DelegationManager common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegationManagerSet is a free log retrieval operation binding the contract event 0x2296e6d8aebb5c81250fd381a114c2ec346fc44bc4582ba95cdcac0f09df6cd9. +// +// Solidity: event DelegationManagerSet(address indexed delegationManager) +func (_Mevcommitavs *MevcommitavsFilterer) FilterDelegationManagerSet(opts *bind.FilterOpts, delegationManager []common.Address) (*MevcommitavsDelegationManagerSetIterator, error) { + + var delegationManagerRule []interface{} + for _, delegationManagerItem := range delegationManager { + delegationManagerRule = append(delegationManagerRule, delegationManagerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "DelegationManagerSet", delegationManagerRule) + if err != nil { + return nil, err + } + return &MevcommitavsDelegationManagerSetIterator{contract: _Mevcommitavs.contract, event: "DelegationManagerSet", logs: logs, sub: sub}, nil +} + +// WatchDelegationManagerSet is a free log subscription operation binding the contract event 0x2296e6d8aebb5c81250fd381a114c2ec346fc44bc4582ba95cdcac0f09df6cd9. +// +// Solidity: event DelegationManagerSet(address indexed delegationManager) +func (_Mevcommitavs *MevcommitavsFilterer) WatchDelegationManagerSet(opts *bind.WatchOpts, sink chan<- *MevcommitavsDelegationManagerSet, delegationManager []common.Address) (event.Subscription, error) { + + var delegationManagerRule []interface{} + for _, delegationManagerItem := range delegationManager { + delegationManagerRule = append(delegationManagerRule, delegationManagerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "DelegationManagerSet", delegationManagerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsDelegationManagerSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "DelegationManagerSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegationManagerSet is a log parse operation binding the contract event 0x2296e6d8aebb5c81250fd381a114c2ec346fc44bc4582ba95cdcac0f09df6cd9. +// +// Solidity: event DelegationManagerSet(address indexed delegationManager) +func (_Mevcommitavs *MevcommitavsFilterer) ParseDelegationManagerSet(log types.Log) (*MevcommitavsDelegationManagerSet, error) { + event := new(MevcommitavsDelegationManagerSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "DelegationManagerSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsEigenPodManagerSetIterator is returned from FilterEigenPodManagerSet and is used to iterate over the raw logs and unpacked data for EigenPodManagerSet events raised by the Mevcommitavs contract. +type MevcommitavsEigenPodManagerSetIterator struct { + Event *MevcommitavsEigenPodManagerSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsEigenPodManagerSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsEigenPodManagerSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsEigenPodManagerSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsEigenPodManagerSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsEigenPodManagerSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsEigenPodManagerSet represents a EigenPodManagerSet event raised by the Mevcommitavs contract. +type MevcommitavsEigenPodManagerSet struct { + EigenPodManager common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEigenPodManagerSet is a free log retrieval operation binding the contract event 0x42070ca05aa3fae96a2bb90f36887ecc4894e2e33e748efeb2721962c11fd801. +// +// Solidity: event EigenPodManagerSet(address indexed eigenPodManager) +func (_Mevcommitavs *MevcommitavsFilterer) FilterEigenPodManagerSet(opts *bind.FilterOpts, eigenPodManager []common.Address) (*MevcommitavsEigenPodManagerSetIterator, error) { + + var eigenPodManagerRule []interface{} + for _, eigenPodManagerItem := range eigenPodManager { + eigenPodManagerRule = append(eigenPodManagerRule, eigenPodManagerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "EigenPodManagerSet", eigenPodManagerRule) + if err != nil { + return nil, err + } + return &MevcommitavsEigenPodManagerSetIterator{contract: _Mevcommitavs.contract, event: "EigenPodManagerSet", logs: logs, sub: sub}, nil +} + +// WatchEigenPodManagerSet is a free log subscription operation binding the contract event 0x42070ca05aa3fae96a2bb90f36887ecc4894e2e33e748efeb2721962c11fd801. +// +// Solidity: event EigenPodManagerSet(address indexed eigenPodManager) +func (_Mevcommitavs *MevcommitavsFilterer) WatchEigenPodManagerSet(opts *bind.WatchOpts, sink chan<- *MevcommitavsEigenPodManagerSet, eigenPodManager []common.Address) (event.Subscription, error) { + + var eigenPodManagerRule []interface{} + for _, eigenPodManagerItem := range eigenPodManager { + eigenPodManagerRule = append(eigenPodManagerRule, eigenPodManagerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "EigenPodManagerSet", eigenPodManagerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsEigenPodManagerSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "EigenPodManagerSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEigenPodManagerSet is a log parse operation binding the contract event 0x42070ca05aa3fae96a2bb90f36887ecc4894e2e33e748efeb2721962c11fd801. +// +// Solidity: event EigenPodManagerSet(address indexed eigenPodManager) +func (_Mevcommitavs *MevcommitavsFilterer) ParseEigenPodManagerSet(log types.Log) (*MevcommitavsEigenPodManagerSet, error) { + event := new(MevcommitavsEigenPodManagerSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "EigenPodManagerSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsFreezeOracleSetIterator is returned from FilterFreezeOracleSet and is used to iterate over the raw logs and unpacked data for FreezeOracleSet events raised by the Mevcommitavs contract. +type MevcommitavsFreezeOracleSetIterator struct { + Event *MevcommitavsFreezeOracleSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsFreezeOracleSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsFreezeOracleSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsFreezeOracleSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsFreezeOracleSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsFreezeOracleSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsFreezeOracleSet represents a FreezeOracleSet event raised by the Mevcommitavs contract. +type MevcommitavsFreezeOracleSet struct { + FreezeOracle common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterFreezeOracleSet is a free log retrieval operation binding the contract event 0xa33f3723c675820c785c70cde43f95aea5a4a0da3a5443a6cc129e14fcc9455a. +// +// Solidity: event FreezeOracleSet(address indexed freezeOracle) +func (_Mevcommitavs *MevcommitavsFilterer) FilterFreezeOracleSet(opts *bind.FilterOpts, freezeOracle []common.Address) (*MevcommitavsFreezeOracleSetIterator, error) { + + var freezeOracleRule []interface{} + for _, freezeOracleItem := range freezeOracle { + freezeOracleRule = append(freezeOracleRule, freezeOracleItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "FreezeOracleSet", freezeOracleRule) + if err != nil { + return nil, err + } + return &MevcommitavsFreezeOracleSetIterator{contract: _Mevcommitavs.contract, event: "FreezeOracleSet", logs: logs, sub: sub}, nil +} + +// WatchFreezeOracleSet is a free log subscription operation binding the contract event 0xa33f3723c675820c785c70cde43f95aea5a4a0da3a5443a6cc129e14fcc9455a. +// +// Solidity: event FreezeOracleSet(address indexed freezeOracle) +func (_Mevcommitavs *MevcommitavsFilterer) WatchFreezeOracleSet(opts *bind.WatchOpts, sink chan<- *MevcommitavsFreezeOracleSet, freezeOracle []common.Address) (event.Subscription, error) { + + var freezeOracleRule []interface{} + for _, freezeOracleItem := range freezeOracle { + freezeOracleRule = append(freezeOracleRule, freezeOracleItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "FreezeOracleSet", freezeOracleRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsFreezeOracleSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "FreezeOracleSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseFreezeOracleSet is a log parse operation binding the contract event 0xa33f3723c675820c785c70cde43f95aea5a4a0da3a5443a6cc129e14fcc9455a. +// +// Solidity: event FreezeOracleSet(address indexed freezeOracle) +func (_Mevcommitavs *MevcommitavsFilterer) ParseFreezeOracleSet(log types.Log) (*MevcommitavsFreezeOracleSet, error) { + event := new(MevcommitavsFreezeOracleSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "FreezeOracleSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Mevcommitavs contract. +type MevcommitavsInitializedIterator struct { + Event *MevcommitavsInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsInitialized represents a Initialized event raised by the Mevcommitavs contract. +type MevcommitavsInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Mevcommitavs *MevcommitavsFilterer) FilterInitialized(opts *bind.FilterOpts) (*MevcommitavsInitializedIterator, error) { + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &MevcommitavsInitializedIterator{contract: _Mevcommitavs.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Mevcommitavs *MevcommitavsFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *MevcommitavsInitialized) (event.Subscription, error) { + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsInitialized) + if err := _Mevcommitavs.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_Mevcommitavs *MevcommitavsFilterer) ParseInitialized(log types.Log) (*MevcommitavsInitialized, error) { + event := new(MevcommitavsInitialized) + if err := _Mevcommitavs.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsLSTRestakerDeregPeriodBlocksSetIterator is returned from FilterLSTRestakerDeregPeriodBlocksSet and is used to iterate over the raw logs and unpacked data for LSTRestakerDeregPeriodBlocksSet events raised by the Mevcommitavs contract. +type MevcommitavsLSTRestakerDeregPeriodBlocksSetIterator struct { + Event *MevcommitavsLSTRestakerDeregPeriodBlocksSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsLSTRestakerDeregPeriodBlocksSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsLSTRestakerDeregPeriodBlocksSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsLSTRestakerDeregPeriodBlocksSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsLSTRestakerDeregPeriodBlocksSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsLSTRestakerDeregPeriodBlocksSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsLSTRestakerDeregPeriodBlocksSet represents a LSTRestakerDeregPeriodBlocksSet event raised by the Mevcommitavs contract. +type MevcommitavsLSTRestakerDeregPeriodBlocksSet struct { + LstRestakerDeregPeriodBlocks *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterLSTRestakerDeregPeriodBlocksSet is a free log retrieval operation binding the contract event 0x7bd82fe806a0299d04c1dc6b928d934d0515dd3dfb8e6b0a0ca02267da5ec181. +// +// Solidity: event LSTRestakerDeregPeriodBlocksSet(uint256 lstRestakerDeregPeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) FilterLSTRestakerDeregPeriodBlocksSet(opts *bind.FilterOpts) (*MevcommitavsLSTRestakerDeregPeriodBlocksSetIterator, error) { + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "LSTRestakerDeregPeriodBlocksSet") + if err != nil { + return nil, err + } + return &MevcommitavsLSTRestakerDeregPeriodBlocksSetIterator{contract: _Mevcommitavs.contract, event: "LSTRestakerDeregPeriodBlocksSet", logs: logs, sub: sub}, nil +} + +// WatchLSTRestakerDeregPeriodBlocksSet is a free log subscription operation binding the contract event 0x7bd82fe806a0299d04c1dc6b928d934d0515dd3dfb8e6b0a0ca02267da5ec181. +// +// Solidity: event LSTRestakerDeregPeriodBlocksSet(uint256 lstRestakerDeregPeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) WatchLSTRestakerDeregPeriodBlocksSet(opts *bind.WatchOpts, sink chan<- *MevcommitavsLSTRestakerDeregPeriodBlocksSet) (event.Subscription, error) { + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "LSTRestakerDeregPeriodBlocksSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsLSTRestakerDeregPeriodBlocksSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "LSTRestakerDeregPeriodBlocksSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseLSTRestakerDeregPeriodBlocksSet is a log parse operation binding the contract event 0x7bd82fe806a0299d04c1dc6b928d934d0515dd3dfb8e6b0a0ca02267da5ec181. +// +// Solidity: event LSTRestakerDeregPeriodBlocksSet(uint256 lstRestakerDeregPeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) ParseLSTRestakerDeregPeriodBlocksSet(log types.Log) (*MevcommitavsLSTRestakerDeregPeriodBlocksSet, error) { + event := new(MevcommitavsLSTRestakerDeregPeriodBlocksSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "LSTRestakerDeregPeriodBlocksSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsLSTRestakerDeregisteredIterator is returned from FilterLSTRestakerDeregistered and is used to iterate over the raw logs and unpacked data for LSTRestakerDeregistered events raised by the Mevcommitavs contract. +type MevcommitavsLSTRestakerDeregisteredIterator struct { + Event *MevcommitavsLSTRestakerDeregistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsLSTRestakerDeregisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsLSTRestakerDeregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsLSTRestakerDeregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsLSTRestakerDeregisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsLSTRestakerDeregisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsLSTRestakerDeregistered represents a LSTRestakerDeregistered event raised by the Mevcommitavs contract. +type MevcommitavsLSTRestakerDeregistered struct { + ChosenValidator common.Hash + NumChosen *big.Int + LstRestaker common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterLSTRestakerDeregistered is a free log retrieval operation binding the contract event 0xaf3d14c12fe6a17d9cab68818354270a52de8de87f44c614c8cf7c35e96086fd. +// +// Solidity: event LSTRestakerDeregistered(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker) +func (_Mevcommitavs *MevcommitavsFilterer) FilterLSTRestakerDeregistered(opts *bind.FilterOpts, chosenValidator [][]byte, lstRestaker []common.Address) (*MevcommitavsLSTRestakerDeregisteredIterator, error) { + + var chosenValidatorRule []interface{} + for _, chosenValidatorItem := range chosenValidator { + chosenValidatorRule = append(chosenValidatorRule, chosenValidatorItem) + } + + var lstRestakerRule []interface{} + for _, lstRestakerItem := range lstRestaker { + lstRestakerRule = append(lstRestakerRule, lstRestakerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "LSTRestakerDeregistered", chosenValidatorRule, lstRestakerRule) + if err != nil { + return nil, err + } + return &MevcommitavsLSTRestakerDeregisteredIterator{contract: _Mevcommitavs.contract, event: "LSTRestakerDeregistered", logs: logs, sub: sub}, nil +} + +// WatchLSTRestakerDeregistered is a free log subscription operation binding the contract event 0xaf3d14c12fe6a17d9cab68818354270a52de8de87f44c614c8cf7c35e96086fd. +// +// Solidity: event LSTRestakerDeregistered(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker) +func (_Mevcommitavs *MevcommitavsFilterer) WatchLSTRestakerDeregistered(opts *bind.WatchOpts, sink chan<- *MevcommitavsLSTRestakerDeregistered, chosenValidator [][]byte, lstRestaker []common.Address) (event.Subscription, error) { + + var chosenValidatorRule []interface{} + for _, chosenValidatorItem := range chosenValidator { + chosenValidatorRule = append(chosenValidatorRule, chosenValidatorItem) + } + + var lstRestakerRule []interface{} + for _, lstRestakerItem := range lstRestaker { + lstRestakerRule = append(lstRestakerRule, lstRestakerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "LSTRestakerDeregistered", chosenValidatorRule, lstRestakerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsLSTRestakerDeregistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "LSTRestakerDeregistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseLSTRestakerDeregistered is a log parse operation binding the contract event 0xaf3d14c12fe6a17d9cab68818354270a52de8de87f44c614c8cf7c35e96086fd. +// +// Solidity: event LSTRestakerDeregistered(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker) +func (_Mevcommitavs *MevcommitavsFilterer) ParseLSTRestakerDeregistered(log types.Log) (*MevcommitavsLSTRestakerDeregistered, error) { + event := new(MevcommitavsLSTRestakerDeregistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "LSTRestakerDeregistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsLSTRestakerDeregistrationRequestedIterator is returned from FilterLSTRestakerDeregistrationRequested and is used to iterate over the raw logs and unpacked data for LSTRestakerDeregistrationRequested events raised by the Mevcommitavs contract. +type MevcommitavsLSTRestakerDeregistrationRequestedIterator struct { + Event *MevcommitavsLSTRestakerDeregistrationRequested // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsLSTRestakerDeregistrationRequestedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsLSTRestakerDeregistrationRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsLSTRestakerDeregistrationRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsLSTRestakerDeregistrationRequestedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsLSTRestakerDeregistrationRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsLSTRestakerDeregistrationRequested represents a LSTRestakerDeregistrationRequested event raised by the Mevcommitavs contract. +type MevcommitavsLSTRestakerDeregistrationRequested struct { + ChosenValidator common.Hash + NumChosen *big.Int + LstRestaker common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterLSTRestakerDeregistrationRequested is a free log retrieval operation binding the contract event 0x6a7ec4f90fd0baec2ae0d35e6c4731b6c833f9f082a3fe8f5b30fe1be4af1c3b. +// +// Solidity: event LSTRestakerDeregistrationRequested(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker) +func (_Mevcommitavs *MevcommitavsFilterer) FilterLSTRestakerDeregistrationRequested(opts *bind.FilterOpts, chosenValidator [][]byte, lstRestaker []common.Address) (*MevcommitavsLSTRestakerDeregistrationRequestedIterator, error) { + + var chosenValidatorRule []interface{} + for _, chosenValidatorItem := range chosenValidator { + chosenValidatorRule = append(chosenValidatorRule, chosenValidatorItem) + } + + var lstRestakerRule []interface{} + for _, lstRestakerItem := range lstRestaker { + lstRestakerRule = append(lstRestakerRule, lstRestakerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "LSTRestakerDeregistrationRequested", chosenValidatorRule, lstRestakerRule) + if err != nil { + return nil, err + } + return &MevcommitavsLSTRestakerDeregistrationRequestedIterator{contract: _Mevcommitavs.contract, event: "LSTRestakerDeregistrationRequested", logs: logs, sub: sub}, nil +} + +// WatchLSTRestakerDeregistrationRequested is a free log subscription operation binding the contract event 0x6a7ec4f90fd0baec2ae0d35e6c4731b6c833f9f082a3fe8f5b30fe1be4af1c3b. +// +// Solidity: event LSTRestakerDeregistrationRequested(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker) +func (_Mevcommitavs *MevcommitavsFilterer) WatchLSTRestakerDeregistrationRequested(opts *bind.WatchOpts, sink chan<- *MevcommitavsLSTRestakerDeregistrationRequested, chosenValidator [][]byte, lstRestaker []common.Address) (event.Subscription, error) { + + var chosenValidatorRule []interface{} + for _, chosenValidatorItem := range chosenValidator { + chosenValidatorRule = append(chosenValidatorRule, chosenValidatorItem) + } + + var lstRestakerRule []interface{} + for _, lstRestakerItem := range lstRestaker { + lstRestakerRule = append(lstRestakerRule, lstRestakerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "LSTRestakerDeregistrationRequested", chosenValidatorRule, lstRestakerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsLSTRestakerDeregistrationRequested) + if err := _Mevcommitavs.contract.UnpackLog(event, "LSTRestakerDeregistrationRequested", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseLSTRestakerDeregistrationRequested is a log parse operation binding the contract event 0x6a7ec4f90fd0baec2ae0d35e6c4731b6c833f9f082a3fe8f5b30fe1be4af1c3b. +// +// Solidity: event LSTRestakerDeregistrationRequested(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker) +func (_Mevcommitavs *MevcommitavsFilterer) ParseLSTRestakerDeregistrationRequested(log types.Log) (*MevcommitavsLSTRestakerDeregistrationRequested, error) { + event := new(MevcommitavsLSTRestakerDeregistrationRequested) + if err := _Mevcommitavs.contract.UnpackLog(event, "LSTRestakerDeregistrationRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsLSTRestakerRegisteredIterator is returned from FilterLSTRestakerRegistered and is used to iterate over the raw logs and unpacked data for LSTRestakerRegistered events raised by the Mevcommitavs contract. +type MevcommitavsLSTRestakerRegisteredIterator struct { + Event *MevcommitavsLSTRestakerRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsLSTRestakerRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsLSTRestakerRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsLSTRestakerRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsLSTRestakerRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsLSTRestakerRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsLSTRestakerRegistered represents a LSTRestakerRegistered event raised by the Mevcommitavs contract. +type MevcommitavsLSTRestakerRegistered struct { + ChosenValidator common.Hash + NumChosen *big.Int + LstRestaker common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterLSTRestakerRegistered is a free log retrieval operation binding the contract event 0xdecaa7bc9a78e41b524d10750b5a52f0c8c1144cd5ab2991c9ca75ff380e011a. +// +// Solidity: event LSTRestakerRegistered(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker) +func (_Mevcommitavs *MevcommitavsFilterer) FilterLSTRestakerRegistered(opts *bind.FilterOpts, chosenValidator [][]byte, lstRestaker []common.Address) (*MevcommitavsLSTRestakerRegisteredIterator, error) { + + var chosenValidatorRule []interface{} + for _, chosenValidatorItem := range chosenValidator { + chosenValidatorRule = append(chosenValidatorRule, chosenValidatorItem) + } + + var lstRestakerRule []interface{} + for _, lstRestakerItem := range lstRestaker { + lstRestakerRule = append(lstRestakerRule, lstRestakerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "LSTRestakerRegistered", chosenValidatorRule, lstRestakerRule) + if err != nil { + return nil, err + } + return &MevcommitavsLSTRestakerRegisteredIterator{contract: _Mevcommitavs.contract, event: "LSTRestakerRegistered", logs: logs, sub: sub}, nil +} + +// WatchLSTRestakerRegistered is a free log subscription operation binding the contract event 0xdecaa7bc9a78e41b524d10750b5a52f0c8c1144cd5ab2991c9ca75ff380e011a. +// +// Solidity: event LSTRestakerRegistered(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker) +func (_Mevcommitavs *MevcommitavsFilterer) WatchLSTRestakerRegistered(opts *bind.WatchOpts, sink chan<- *MevcommitavsLSTRestakerRegistered, chosenValidator [][]byte, lstRestaker []common.Address) (event.Subscription, error) { + + var chosenValidatorRule []interface{} + for _, chosenValidatorItem := range chosenValidator { + chosenValidatorRule = append(chosenValidatorRule, chosenValidatorItem) + } + + var lstRestakerRule []interface{} + for _, lstRestakerItem := range lstRestaker { + lstRestakerRule = append(lstRestakerRule, lstRestakerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "LSTRestakerRegistered", chosenValidatorRule, lstRestakerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsLSTRestakerRegistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "LSTRestakerRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseLSTRestakerRegistered is a log parse operation binding the contract event 0xdecaa7bc9a78e41b524d10750b5a52f0c8c1144cd5ab2991c9ca75ff380e011a. +// +// Solidity: event LSTRestakerRegistered(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker) +func (_Mevcommitavs *MevcommitavsFilterer) ParseLSTRestakerRegistered(log types.Log) (*MevcommitavsLSTRestakerRegistered, error) { + event := new(MevcommitavsLSTRestakerRegistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "LSTRestakerRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsOperatorDeregPeriodBlocksSetIterator is returned from FilterOperatorDeregPeriodBlocksSet and is used to iterate over the raw logs and unpacked data for OperatorDeregPeriodBlocksSet events raised by the Mevcommitavs contract. +type MevcommitavsOperatorDeregPeriodBlocksSetIterator struct { + Event *MevcommitavsOperatorDeregPeriodBlocksSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsOperatorDeregPeriodBlocksSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsOperatorDeregPeriodBlocksSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsOperatorDeregPeriodBlocksSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsOperatorDeregPeriodBlocksSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsOperatorDeregPeriodBlocksSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsOperatorDeregPeriodBlocksSet represents a OperatorDeregPeriodBlocksSet event raised by the Mevcommitavs contract. +type MevcommitavsOperatorDeregPeriodBlocksSet struct { + OperatorDeregPeriodBlocks *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorDeregPeriodBlocksSet is a free log retrieval operation binding the contract event 0xfea621e39fd1186d690d8fa903a946ee52fee14c9c1f1c7295173b2e623b517e. +// +// Solidity: event OperatorDeregPeriodBlocksSet(uint256 operatorDeregPeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) FilterOperatorDeregPeriodBlocksSet(opts *bind.FilterOpts) (*MevcommitavsOperatorDeregPeriodBlocksSetIterator, error) { + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "OperatorDeregPeriodBlocksSet") + if err != nil { + return nil, err + } + return &MevcommitavsOperatorDeregPeriodBlocksSetIterator{contract: _Mevcommitavs.contract, event: "OperatorDeregPeriodBlocksSet", logs: logs, sub: sub}, nil +} + +// WatchOperatorDeregPeriodBlocksSet is a free log subscription operation binding the contract event 0xfea621e39fd1186d690d8fa903a946ee52fee14c9c1f1c7295173b2e623b517e. +// +// Solidity: event OperatorDeregPeriodBlocksSet(uint256 operatorDeregPeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) WatchOperatorDeregPeriodBlocksSet(opts *bind.WatchOpts, sink chan<- *MevcommitavsOperatorDeregPeriodBlocksSet) (event.Subscription, error) { + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "OperatorDeregPeriodBlocksSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsOperatorDeregPeriodBlocksSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "OperatorDeregPeriodBlocksSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorDeregPeriodBlocksSet is a log parse operation binding the contract event 0xfea621e39fd1186d690d8fa903a946ee52fee14c9c1f1c7295173b2e623b517e. +// +// Solidity: event OperatorDeregPeriodBlocksSet(uint256 operatorDeregPeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) ParseOperatorDeregPeriodBlocksSet(log types.Log) (*MevcommitavsOperatorDeregPeriodBlocksSet, error) { + event := new(MevcommitavsOperatorDeregPeriodBlocksSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "OperatorDeregPeriodBlocksSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsOperatorDeregisteredIterator is returned from FilterOperatorDeregistered and is used to iterate over the raw logs and unpacked data for OperatorDeregistered events raised by the Mevcommitavs contract. +type MevcommitavsOperatorDeregisteredIterator struct { + Event *MevcommitavsOperatorDeregistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsOperatorDeregisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsOperatorDeregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsOperatorDeregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsOperatorDeregisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsOperatorDeregisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsOperatorDeregistered represents a OperatorDeregistered event raised by the Mevcommitavs contract. +type MevcommitavsOperatorDeregistered struct { + Operator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorDeregistered is a free log retrieval operation binding the contract event 0x6dd4ca66565fb3dee8076c654634c6c4ad949022d809d0394308617d6791218d. +// +// Solidity: event OperatorDeregistered(address indexed operator) +func (_Mevcommitavs *MevcommitavsFilterer) FilterOperatorDeregistered(opts *bind.FilterOpts, operator []common.Address) (*MevcommitavsOperatorDeregisteredIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "OperatorDeregistered", operatorRule) + if err != nil { + return nil, err + } + return &MevcommitavsOperatorDeregisteredIterator{contract: _Mevcommitavs.contract, event: "OperatorDeregistered", logs: logs, sub: sub}, nil +} + +// WatchOperatorDeregistered is a free log subscription operation binding the contract event 0x6dd4ca66565fb3dee8076c654634c6c4ad949022d809d0394308617d6791218d. +// +// Solidity: event OperatorDeregistered(address indexed operator) +func (_Mevcommitavs *MevcommitavsFilterer) WatchOperatorDeregistered(opts *bind.WatchOpts, sink chan<- *MevcommitavsOperatorDeregistered, operator []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "OperatorDeregistered", operatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsOperatorDeregistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "OperatorDeregistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorDeregistered is a log parse operation binding the contract event 0x6dd4ca66565fb3dee8076c654634c6c4ad949022d809d0394308617d6791218d. +// +// Solidity: event OperatorDeregistered(address indexed operator) +func (_Mevcommitavs *MevcommitavsFilterer) ParseOperatorDeregistered(log types.Log) (*MevcommitavsOperatorDeregistered, error) { + event := new(MevcommitavsOperatorDeregistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "OperatorDeregistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsOperatorDeregistrationRequestedIterator is returned from FilterOperatorDeregistrationRequested and is used to iterate over the raw logs and unpacked data for OperatorDeregistrationRequested events raised by the Mevcommitavs contract. +type MevcommitavsOperatorDeregistrationRequestedIterator struct { + Event *MevcommitavsOperatorDeregistrationRequested // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsOperatorDeregistrationRequestedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsOperatorDeregistrationRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsOperatorDeregistrationRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsOperatorDeregistrationRequestedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsOperatorDeregistrationRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsOperatorDeregistrationRequested represents a OperatorDeregistrationRequested event raised by the Mevcommitavs contract. +type MevcommitavsOperatorDeregistrationRequested struct { + Operator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorDeregistrationRequested is a free log retrieval operation binding the contract event 0x4df522c04c21ddaed6db450a1c41907201a3daa6e80a58d12962062860a20d02. +// +// Solidity: event OperatorDeregistrationRequested(address indexed operator) +func (_Mevcommitavs *MevcommitavsFilterer) FilterOperatorDeregistrationRequested(opts *bind.FilterOpts, operator []common.Address) (*MevcommitavsOperatorDeregistrationRequestedIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "OperatorDeregistrationRequested", operatorRule) + if err != nil { + return nil, err + } + return &MevcommitavsOperatorDeregistrationRequestedIterator{contract: _Mevcommitavs.contract, event: "OperatorDeregistrationRequested", logs: logs, sub: sub}, nil +} + +// WatchOperatorDeregistrationRequested is a free log subscription operation binding the contract event 0x4df522c04c21ddaed6db450a1c41907201a3daa6e80a58d12962062860a20d02. +// +// Solidity: event OperatorDeregistrationRequested(address indexed operator) +func (_Mevcommitavs *MevcommitavsFilterer) WatchOperatorDeregistrationRequested(opts *bind.WatchOpts, sink chan<- *MevcommitavsOperatorDeregistrationRequested, operator []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "OperatorDeregistrationRequested", operatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsOperatorDeregistrationRequested) + if err := _Mevcommitavs.contract.UnpackLog(event, "OperatorDeregistrationRequested", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorDeregistrationRequested is a log parse operation binding the contract event 0x4df522c04c21ddaed6db450a1c41907201a3daa6e80a58d12962062860a20d02. +// +// Solidity: event OperatorDeregistrationRequested(address indexed operator) +func (_Mevcommitavs *MevcommitavsFilterer) ParseOperatorDeregistrationRequested(log types.Log) (*MevcommitavsOperatorDeregistrationRequested, error) { + event := new(MevcommitavsOperatorDeregistrationRequested) + if err := _Mevcommitavs.contract.UnpackLog(event, "OperatorDeregistrationRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsOperatorRegisteredIterator is returned from FilterOperatorRegistered and is used to iterate over the raw logs and unpacked data for OperatorRegistered events raised by the Mevcommitavs contract. +type MevcommitavsOperatorRegisteredIterator struct { + Event *MevcommitavsOperatorRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsOperatorRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsOperatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsOperatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsOperatorRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsOperatorRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsOperatorRegistered represents a OperatorRegistered event raised by the Mevcommitavs contract. +type MevcommitavsOperatorRegistered struct { + Operator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorRegistered is a free log retrieval operation binding the contract event 0x4d0eb1f4bac8744fd2be119845e23b3befc88094b42bcda1204c65694a00f9e5. +// +// Solidity: event OperatorRegistered(address indexed operator) +func (_Mevcommitavs *MevcommitavsFilterer) FilterOperatorRegistered(opts *bind.FilterOpts, operator []common.Address) (*MevcommitavsOperatorRegisteredIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "OperatorRegistered", operatorRule) + if err != nil { + return nil, err + } + return &MevcommitavsOperatorRegisteredIterator{contract: _Mevcommitavs.contract, event: "OperatorRegistered", logs: logs, sub: sub}, nil +} + +// WatchOperatorRegistered is a free log subscription operation binding the contract event 0x4d0eb1f4bac8744fd2be119845e23b3befc88094b42bcda1204c65694a00f9e5. +// +// Solidity: event OperatorRegistered(address indexed operator) +func (_Mevcommitavs *MevcommitavsFilterer) WatchOperatorRegistered(opts *bind.WatchOpts, sink chan<- *MevcommitavsOperatorRegistered, operator []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "OperatorRegistered", operatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsOperatorRegistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "OperatorRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorRegistered is a log parse operation binding the contract event 0x4d0eb1f4bac8744fd2be119845e23b3befc88094b42bcda1204c65694a00f9e5. +// +// Solidity: event OperatorRegistered(address indexed operator) +func (_Mevcommitavs *MevcommitavsFilterer) ParseOperatorRegistered(log types.Log) (*MevcommitavsOperatorRegistered, error) { + event := new(MevcommitavsOperatorRegistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "OperatorRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the Mevcommitavs contract. +type MevcommitavsOwnershipTransferredIterator struct { + Event *MevcommitavsOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsOwnershipTransferred represents a OwnershipTransferred event raised by the Mevcommitavs contract. +type MevcommitavsOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Mevcommitavs *MevcommitavsFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*MevcommitavsOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &MevcommitavsOwnershipTransferredIterator{contract: _Mevcommitavs.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Mevcommitavs *MevcommitavsFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *MevcommitavsOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsOwnershipTransferred) + if err := _Mevcommitavs.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_Mevcommitavs *MevcommitavsFilterer) ParseOwnershipTransferred(log types.Log) (*MevcommitavsOwnershipTransferred, error) { + event := new(MevcommitavsOwnershipTransferred) + if err := _Mevcommitavs.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsPausedIterator is returned from FilterPaused and is used to iterate over the raw logs and unpacked data for Paused events raised by the Mevcommitavs contract. +type MevcommitavsPausedIterator struct { + Event *MevcommitavsPaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsPausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsPaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsPaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsPausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsPausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsPaused represents a Paused event raised by the Mevcommitavs contract. +type MevcommitavsPaused struct { + Account common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPaused is a free log retrieval operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_Mevcommitavs *MevcommitavsFilterer) FilterPaused(opts *bind.FilterOpts) (*MevcommitavsPausedIterator, error) { + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "Paused") + if err != nil { + return nil, err + } + return &MevcommitavsPausedIterator{contract: _Mevcommitavs.contract, event: "Paused", logs: logs, sub: sub}, nil +} + +// WatchPaused is a free log subscription operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_Mevcommitavs *MevcommitavsFilterer) WatchPaused(opts *bind.WatchOpts, sink chan<- *MevcommitavsPaused) (event.Subscription, error) { + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "Paused") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsPaused) + if err := _Mevcommitavs.contract.UnpackLog(event, "Paused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParsePaused is a log parse operation binding the contract event 0x62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258. +// +// Solidity: event Paused(address account) +func (_Mevcommitavs *MevcommitavsFilterer) ParsePaused(log types.Log) (*MevcommitavsPaused, error) { + event := new(MevcommitavsPaused) + if err := _Mevcommitavs.contract.UnpackLog(event, "Paused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsRestakeableStrategiesSetIterator is returned from FilterRestakeableStrategiesSet and is used to iterate over the raw logs and unpacked data for RestakeableStrategiesSet events raised by the Mevcommitavs contract. +type MevcommitavsRestakeableStrategiesSetIterator struct { + Event *MevcommitavsRestakeableStrategiesSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsRestakeableStrategiesSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsRestakeableStrategiesSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsRestakeableStrategiesSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsRestakeableStrategiesSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsRestakeableStrategiesSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsRestakeableStrategiesSet represents a RestakeableStrategiesSet event raised by the Mevcommitavs contract. +type MevcommitavsRestakeableStrategiesSet struct { + RestakeableStrategies []common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRestakeableStrategiesSet is a free log retrieval operation binding the contract event 0xda4dd29046c55387af7520737a1e06033ae31f610dde3d0851458dffe13a0c0f. +// +// Solidity: event RestakeableStrategiesSet(address[] indexed restakeableStrategies) +func (_Mevcommitavs *MevcommitavsFilterer) FilterRestakeableStrategiesSet(opts *bind.FilterOpts, restakeableStrategies [][]common.Address) (*MevcommitavsRestakeableStrategiesSetIterator, error) { + + var restakeableStrategiesRule []interface{} + for _, restakeableStrategiesItem := range restakeableStrategies { + restakeableStrategiesRule = append(restakeableStrategiesRule, restakeableStrategiesItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "RestakeableStrategiesSet", restakeableStrategiesRule) + if err != nil { + return nil, err + } + return &MevcommitavsRestakeableStrategiesSetIterator{contract: _Mevcommitavs.contract, event: "RestakeableStrategiesSet", logs: logs, sub: sub}, nil +} + +// WatchRestakeableStrategiesSet is a free log subscription operation binding the contract event 0xda4dd29046c55387af7520737a1e06033ae31f610dde3d0851458dffe13a0c0f. +// +// Solidity: event RestakeableStrategiesSet(address[] indexed restakeableStrategies) +func (_Mevcommitavs *MevcommitavsFilterer) WatchRestakeableStrategiesSet(opts *bind.WatchOpts, sink chan<- *MevcommitavsRestakeableStrategiesSet, restakeableStrategies [][]common.Address) (event.Subscription, error) { + + var restakeableStrategiesRule []interface{} + for _, restakeableStrategiesItem := range restakeableStrategies { + restakeableStrategiesRule = append(restakeableStrategiesRule, restakeableStrategiesItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "RestakeableStrategiesSet", restakeableStrategiesRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsRestakeableStrategiesSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "RestakeableStrategiesSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRestakeableStrategiesSet is a log parse operation binding the contract event 0xda4dd29046c55387af7520737a1e06033ae31f610dde3d0851458dffe13a0c0f. +// +// Solidity: event RestakeableStrategiesSet(address[] indexed restakeableStrategies) +func (_Mevcommitavs *MevcommitavsFilterer) ParseRestakeableStrategiesSet(log types.Log) (*MevcommitavsRestakeableStrategiesSet, error) { + event := new(MevcommitavsRestakeableStrategiesSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "RestakeableStrategiesSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsStrategyManagerSetIterator is returned from FilterStrategyManagerSet and is used to iterate over the raw logs and unpacked data for StrategyManagerSet events raised by the Mevcommitavs contract. +type MevcommitavsStrategyManagerSetIterator struct { + Event *MevcommitavsStrategyManagerSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsStrategyManagerSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsStrategyManagerSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsStrategyManagerSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsStrategyManagerSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsStrategyManagerSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsStrategyManagerSet represents a StrategyManagerSet event raised by the Mevcommitavs contract. +type MevcommitavsStrategyManagerSet struct { + StrategyManager common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterStrategyManagerSet is a free log retrieval operation binding the contract event 0x76fe640b216c20f563ab2d807634271e9d772e92c8a3752325cb2bc924e9e514. +// +// Solidity: event StrategyManagerSet(address indexed strategyManager) +func (_Mevcommitavs *MevcommitavsFilterer) FilterStrategyManagerSet(opts *bind.FilterOpts, strategyManager []common.Address) (*MevcommitavsStrategyManagerSetIterator, error) { + + var strategyManagerRule []interface{} + for _, strategyManagerItem := range strategyManager { + strategyManagerRule = append(strategyManagerRule, strategyManagerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "StrategyManagerSet", strategyManagerRule) + if err != nil { + return nil, err + } + return &MevcommitavsStrategyManagerSetIterator{contract: _Mevcommitavs.contract, event: "StrategyManagerSet", logs: logs, sub: sub}, nil +} + +// WatchStrategyManagerSet is a free log subscription operation binding the contract event 0x76fe640b216c20f563ab2d807634271e9d772e92c8a3752325cb2bc924e9e514. +// +// Solidity: event StrategyManagerSet(address indexed strategyManager) +func (_Mevcommitavs *MevcommitavsFilterer) WatchStrategyManagerSet(opts *bind.WatchOpts, sink chan<- *MevcommitavsStrategyManagerSet, strategyManager []common.Address) (event.Subscription, error) { + + var strategyManagerRule []interface{} + for _, strategyManagerItem := range strategyManager { + strategyManagerRule = append(strategyManagerRule, strategyManagerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "StrategyManagerSet", strategyManagerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsStrategyManagerSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "StrategyManagerSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseStrategyManagerSet is a log parse operation binding the contract event 0x76fe640b216c20f563ab2d807634271e9d772e92c8a3752325cb2bc924e9e514. +// +// Solidity: event StrategyManagerSet(address indexed strategyManager) +func (_Mevcommitavs *MevcommitavsFilterer) ParseStrategyManagerSet(log types.Log) (*MevcommitavsStrategyManagerSet, error) { + event := new(MevcommitavsStrategyManagerSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "StrategyManagerSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsUnfreezeFeeSetIterator is returned from FilterUnfreezeFeeSet and is used to iterate over the raw logs and unpacked data for UnfreezeFeeSet events raised by the Mevcommitavs contract. +type MevcommitavsUnfreezeFeeSetIterator struct { + Event *MevcommitavsUnfreezeFeeSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsUnfreezeFeeSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsUnfreezeFeeSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsUnfreezeFeeSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsUnfreezeFeeSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsUnfreezeFeeSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsUnfreezeFeeSet represents a UnfreezeFeeSet event raised by the Mevcommitavs contract. +type MevcommitavsUnfreezeFeeSet struct { + UnfreezeFee *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnfreezeFeeSet is a free log retrieval operation binding the contract event 0x6c0cf79356801bf6665a4c6cc85d35896ca003fe22c8c92c2b0e1d563b384c9d. +// +// Solidity: event UnfreezeFeeSet(uint256 unfreezeFee) +func (_Mevcommitavs *MevcommitavsFilterer) FilterUnfreezeFeeSet(opts *bind.FilterOpts) (*MevcommitavsUnfreezeFeeSetIterator, error) { + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "UnfreezeFeeSet") + if err != nil { + return nil, err + } + return &MevcommitavsUnfreezeFeeSetIterator{contract: _Mevcommitavs.contract, event: "UnfreezeFeeSet", logs: logs, sub: sub}, nil +} + +// WatchUnfreezeFeeSet is a free log subscription operation binding the contract event 0x6c0cf79356801bf6665a4c6cc85d35896ca003fe22c8c92c2b0e1d563b384c9d. +// +// Solidity: event UnfreezeFeeSet(uint256 unfreezeFee) +func (_Mevcommitavs *MevcommitavsFilterer) WatchUnfreezeFeeSet(opts *bind.WatchOpts, sink chan<- *MevcommitavsUnfreezeFeeSet) (event.Subscription, error) { + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "UnfreezeFeeSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsUnfreezeFeeSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "UnfreezeFeeSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnfreezeFeeSet is a log parse operation binding the contract event 0x6c0cf79356801bf6665a4c6cc85d35896ca003fe22c8c92c2b0e1d563b384c9d. +// +// Solidity: event UnfreezeFeeSet(uint256 unfreezeFee) +func (_Mevcommitavs *MevcommitavsFilterer) ParseUnfreezeFeeSet(log types.Log) (*MevcommitavsUnfreezeFeeSet, error) { + event := new(MevcommitavsUnfreezeFeeSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "UnfreezeFeeSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsUnfreezePeriodBlocksSetIterator is returned from FilterUnfreezePeriodBlocksSet and is used to iterate over the raw logs and unpacked data for UnfreezePeriodBlocksSet events raised by the Mevcommitavs contract. +type MevcommitavsUnfreezePeriodBlocksSetIterator struct { + Event *MevcommitavsUnfreezePeriodBlocksSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsUnfreezePeriodBlocksSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsUnfreezePeriodBlocksSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsUnfreezePeriodBlocksSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsUnfreezePeriodBlocksSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsUnfreezePeriodBlocksSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsUnfreezePeriodBlocksSet represents a UnfreezePeriodBlocksSet event raised by the Mevcommitavs contract. +type MevcommitavsUnfreezePeriodBlocksSet struct { + UnfreezePeriodBlocks *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnfreezePeriodBlocksSet is a free log retrieval operation binding the contract event 0xdf42b0e9b907c6972f5ad1b757b3ab4e0eeca44f9b9dc7c8d97f2f40c1a042dd. +// +// Solidity: event UnfreezePeriodBlocksSet(uint256 unfreezePeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) FilterUnfreezePeriodBlocksSet(opts *bind.FilterOpts) (*MevcommitavsUnfreezePeriodBlocksSetIterator, error) { + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "UnfreezePeriodBlocksSet") + if err != nil { + return nil, err + } + return &MevcommitavsUnfreezePeriodBlocksSetIterator{contract: _Mevcommitavs.contract, event: "UnfreezePeriodBlocksSet", logs: logs, sub: sub}, nil +} + +// WatchUnfreezePeriodBlocksSet is a free log subscription operation binding the contract event 0xdf42b0e9b907c6972f5ad1b757b3ab4e0eeca44f9b9dc7c8d97f2f40c1a042dd. +// +// Solidity: event UnfreezePeriodBlocksSet(uint256 unfreezePeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) WatchUnfreezePeriodBlocksSet(opts *bind.WatchOpts, sink chan<- *MevcommitavsUnfreezePeriodBlocksSet) (event.Subscription, error) { + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "UnfreezePeriodBlocksSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsUnfreezePeriodBlocksSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "UnfreezePeriodBlocksSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnfreezePeriodBlocksSet is a log parse operation binding the contract event 0xdf42b0e9b907c6972f5ad1b757b3ab4e0eeca44f9b9dc7c8d97f2f40c1a042dd. +// +// Solidity: event UnfreezePeriodBlocksSet(uint256 unfreezePeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) ParseUnfreezePeriodBlocksSet(log types.Log) (*MevcommitavsUnfreezePeriodBlocksSet, error) { + event := new(MevcommitavsUnfreezePeriodBlocksSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "UnfreezePeriodBlocksSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsUnfreezeReceiverSetIterator is returned from FilterUnfreezeReceiverSet and is used to iterate over the raw logs and unpacked data for UnfreezeReceiverSet events raised by the Mevcommitavs contract. +type MevcommitavsUnfreezeReceiverSetIterator struct { + Event *MevcommitavsUnfreezeReceiverSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsUnfreezeReceiverSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsUnfreezeReceiverSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsUnfreezeReceiverSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsUnfreezeReceiverSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsUnfreezeReceiverSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsUnfreezeReceiverSet represents a UnfreezeReceiverSet event raised by the Mevcommitavs contract. +type MevcommitavsUnfreezeReceiverSet struct { + UnfreezeReceiver common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnfreezeReceiverSet is a free log retrieval operation binding the contract event 0x7b992f6c09b22e43cad1f0f9a1d7e41949ac1c53a4eebb7f4b2374605049d2bf. +// +// Solidity: event UnfreezeReceiverSet(address indexed unfreezeReceiver) +func (_Mevcommitavs *MevcommitavsFilterer) FilterUnfreezeReceiverSet(opts *bind.FilterOpts, unfreezeReceiver []common.Address) (*MevcommitavsUnfreezeReceiverSetIterator, error) { + + var unfreezeReceiverRule []interface{} + for _, unfreezeReceiverItem := range unfreezeReceiver { + unfreezeReceiverRule = append(unfreezeReceiverRule, unfreezeReceiverItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "UnfreezeReceiverSet", unfreezeReceiverRule) + if err != nil { + return nil, err + } + return &MevcommitavsUnfreezeReceiverSetIterator{contract: _Mevcommitavs.contract, event: "UnfreezeReceiverSet", logs: logs, sub: sub}, nil +} + +// WatchUnfreezeReceiverSet is a free log subscription operation binding the contract event 0x7b992f6c09b22e43cad1f0f9a1d7e41949ac1c53a4eebb7f4b2374605049d2bf. +// +// Solidity: event UnfreezeReceiverSet(address indexed unfreezeReceiver) +func (_Mevcommitavs *MevcommitavsFilterer) WatchUnfreezeReceiverSet(opts *bind.WatchOpts, sink chan<- *MevcommitavsUnfreezeReceiverSet, unfreezeReceiver []common.Address) (event.Subscription, error) { + + var unfreezeReceiverRule []interface{} + for _, unfreezeReceiverItem := range unfreezeReceiver { + unfreezeReceiverRule = append(unfreezeReceiverRule, unfreezeReceiverItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "UnfreezeReceiverSet", unfreezeReceiverRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsUnfreezeReceiverSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "UnfreezeReceiverSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnfreezeReceiverSet is a log parse operation binding the contract event 0x7b992f6c09b22e43cad1f0f9a1d7e41949ac1c53a4eebb7f4b2374605049d2bf. +// +// Solidity: event UnfreezeReceiverSet(address indexed unfreezeReceiver) +func (_Mevcommitavs *MevcommitavsFilterer) ParseUnfreezeReceiverSet(log types.Log) (*MevcommitavsUnfreezeReceiverSet, error) { + event := new(MevcommitavsUnfreezeReceiverSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "UnfreezeReceiverSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the Mevcommitavs contract. +type MevcommitavsUnpausedIterator struct { + Event *MevcommitavsUnpaused // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsUnpausedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsUnpaused) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsUnpausedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsUnpausedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsUnpaused represents a Unpaused event raised by the Mevcommitavs contract. +type MevcommitavsUnpaused struct { + Account common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUnpaused is a free log retrieval operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_Mevcommitavs *MevcommitavsFilterer) FilterUnpaused(opts *bind.FilterOpts) (*MevcommitavsUnpausedIterator, error) { + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "Unpaused") + if err != nil { + return nil, err + } + return &MevcommitavsUnpausedIterator{contract: _Mevcommitavs.contract, event: "Unpaused", logs: logs, sub: sub}, nil +} + +// WatchUnpaused is a free log subscription operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_Mevcommitavs *MevcommitavsFilterer) WatchUnpaused(opts *bind.WatchOpts, sink chan<- *MevcommitavsUnpaused) (event.Subscription, error) { + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "Unpaused") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsUnpaused) + if err := _Mevcommitavs.contract.UnpackLog(event, "Unpaused", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUnpaused is a log parse operation binding the contract event 0x5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa. +// +// Solidity: event Unpaused(address account) +func (_Mevcommitavs *MevcommitavsFilterer) ParseUnpaused(log types.Log) (*MevcommitavsUnpaused, error) { + event := new(MevcommitavsUnpaused) + if err := _Mevcommitavs.contract.UnpackLog(event, "Unpaused", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the Mevcommitavs contract. +type MevcommitavsUpgradedIterator struct { + Event *MevcommitavsUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsUpgraded represents a Upgraded event raised by the Mevcommitavs contract. +type MevcommitavsUpgraded struct { + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Mevcommitavs *MevcommitavsFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*MevcommitavsUpgradedIterator, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return &MevcommitavsUpgradedIterator{contract: _Mevcommitavs.contract, event: "Upgraded", logs: logs, sub: sub}, nil +} + +// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Mevcommitavs *MevcommitavsFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *MevcommitavsUpgraded, implementation []common.Address) (event.Subscription, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsUpgraded) + if err := _Mevcommitavs.contract.UnpackLog(event, "Upgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_Mevcommitavs *MevcommitavsFilterer) ParseUpgraded(log types.Log) (*MevcommitavsUpgraded, error) { + event := new(MevcommitavsUpgraded) + if err := _Mevcommitavs.contract.UnpackLog(event, "Upgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsValidatorDeregPeriodBlocksSetIterator is returned from FilterValidatorDeregPeriodBlocksSet and is used to iterate over the raw logs and unpacked data for ValidatorDeregPeriodBlocksSet events raised by the Mevcommitavs contract. +type MevcommitavsValidatorDeregPeriodBlocksSetIterator struct { + Event *MevcommitavsValidatorDeregPeriodBlocksSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsValidatorDeregPeriodBlocksSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorDeregPeriodBlocksSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorDeregPeriodBlocksSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsValidatorDeregPeriodBlocksSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsValidatorDeregPeriodBlocksSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsValidatorDeregPeriodBlocksSet represents a ValidatorDeregPeriodBlocksSet event raised by the Mevcommitavs contract. +type MevcommitavsValidatorDeregPeriodBlocksSet struct { + ValidatorDeregPeriodBlocks *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorDeregPeriodBlocksSet is a free log retrieval operation binding the contract event 0x38755fd87ce522d770f5627d05f541406a9358d853b64009737f5c4d8913eae7. +// +// Solidity: event ValidatorDeregPeriodBlocksSet(uint256 validatorDeregPeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) FilterValidatorDeregPeriodBlocksSet(opts *bind.FilterOpts) (*MevcommitavsValidatorDeregPeriodBlocksSetIterator, error) { + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "ValidatorDeregPeriodBlocksSet") + if err != nil { + return nil, err + } + return &MevcommitavsValidatorDeregPeriodBlocksSetIterator{contract: _Mevcommitavs.contract, event: "ValidatorDeregPeriodBlocksSet", logs: logs, sub: sub}, nil +} + +// WatchValidatorDeregPeriodBlocksSet is a free log subscription operation binding the contract event 0x38755fd87ce522d770f5627d05f541406a9358d853b64009737f5c4d8913eae7. +// +// Solidity: event ValidatorDeregPeriodBlocksSet(uint256 validatorDeregPeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) WatchValidatorDeregPeriodBlocksSet(opts *bind.WatchOpts, sink chan<- *MevcommitavsValidatorDeregPeriodBlocksSet) (event.Subscription, error) { + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "ValidatorDeregPeriodBlocksSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsValidatorDeregPeriodBlocksSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorDeregPeriodBlocksSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorDeregPeriodBlocksSet is a log parse operation binding the contract event 0x38755fd87ce522d770f5627d05f541406a9358d853b64009737f5c4d8913eae7. +// +// Solidity: event ValidatorDeregPeriodBlocksSet(uint256 validatorDeregPeriodBlocks) +func (_Mevcommitavs *MevcommitavsFilterer) ParseValidatorDeregPeriodBlocksSet(log types.Log) (*MevcommitavsValidatorDeregPeriodBlocksSet, error) { + event := new(MevcommitavsValidatorDeregPeriodBlocksSet) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorDeregPeriodBlocksSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsValidatorDeregisteredIterator is returned from FilterValidatorDeregistered and is used to iterate over the raw logs and unpacked data for ValidatorDeregistered events raised by the Mevcommitavs contract. +type MevcommitavsValidatorDeregisteredIterator struct { + Event *MevcommitavsValidatorDeregistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsValidatorDeregisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorDeregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorDeregistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsValidatorDeregisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsValidatorDeregisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsValidatorDeregistered represents a ValidatorDeregistered event raised by the Mevcommitavs contract. +type MevcommitavsValidatorDeregistered struct { + ValidatorPubKey common.Hash + PodOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorDeregistered is a free log retrieval operation binding the contract event 0x10ec0bb1533e599e504516d6b49226d8a637ea19cbadfc6f7ff14a01bede3170. +// +// Solidity: event ValidatorDeregistered(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) FilterValidatorDeregistered(opts *bind.FilterOpts, validatorPubKey [][]byte, podOwner []common.Address) (*MevcommitavsValidatorDeregisteredIterator, error) { + + var validatorPubKeyRule []interface{} + for _, validatorPubKeyItem := range validatorPubKey { + validatorPubKeyRule = append(validatorPubKeyRule, validatorPubKeyItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "ValidatorDeregistered", validatorPubKeyRule, podOwnerRule) + if err != nil { + return nil, err + } + return &MevcommitavsValidatorDeregisteredIterator{contract: _Mevcommitavs.contract, event: "ValidatorDeregistered", logs: logs, sub: sub}, nil +} + +// WatchValidatorDeregistered is a free log subscription operation binding the contract event 0x10ec0bb1533e599e504516d6b49226d8a637ea19cbadfc6f7ff14a01bede3170. +// +// Solidity: event ValidatorDeregistered(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) WatchValidatorDeregistered(opts *bind.WatchOpts, sink chan<- *MevcommitavsValidatorDeregistered, validatorPubKey [][]byte, podOwner []common.Address) (event.Subscription, error) { + + var validatorPubKeyRule []interface{} + for _, validatorPubKeyItem := range validatorPubKey { + validatorPubKeyRule = append(validatorPubKeyRule, validatorPubKeyItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "ValidatorDeregistered", validatorPubKeyRule, podOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsValidatorDeregistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorDeregistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorDeregistered is a log parse operation binding the contract event 0x10ec0bb1533e599e504516d6b49226d8a637ea19cbadfc6f7ff14a01bede3170. +// +// Solidity: event ValidatorDeregistered(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) ParseValidatorDeregistered(log types.Log) (*MevcommitavsValidatorDeregistered, error) { + event := new(MevcommitavsValidatorDeregistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorDeregistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsValidatorDeregistrationRequestedIterator is returned from FilterValidatorDeregistrationRequested and is used to iterate over the raw logs and unpacked data for ValidatorDeregistrationRequested events raised by the Mevcommitavs contract. +type MevcommitavsValidatorDeregistrationRequestedIterator struct { + Event *MevcommitavsValidatorDeregistrationRequested // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsValidatorDeregistrationRequestedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorDeregistrationRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorDeregistrationRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsValidatorDeregistrationRequestedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsValidatorDeregistrationRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsValidatorDeregistrationRequested represents a ValidatorDeregistrationRequested event raised by the Mevcommitavs contract. +type MevcommitavsValidatorDeregistrationRequested struct { + ValidatorPubKey common.Hash + PodOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorDeregistrationRequested is a free log retrieval operation binding the contract event 0x13b70fd48d462f71863cae24350d77b0dc4115a7e928b39dd0f0f60b701ffed3. +// +// Solidity: event ValidatorDeregistrationRequested(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) FilterValidatorDeregistrationRequested(opts *bind.FilterOpts, validatorPubKey [][]byte, podOwner []common.Address) (*MevcommitavsValidatorDeregistrationRequestedIterator, error) { + + var validatorPubKeyRule []interface{} + for _, validatorPubKeyItem := range validatorPubKey { + validatorPubKeyRule = append(validatorPubKeyRule, validatorPubKeyItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "ValidatorDeregistrationRequested", validatorPubKeyRule, podOwnerRule) + if err != nil { + return nil, err + } + return &MevcommitavsValidatorDeregistrationRequestedIterator{contract: _Mevcommitavs.contract, event: "ValidatorDeregistrationRequested", logs: logs, sub: sub}, nil +} + +// WatchValidatorDeregistrationRequested is a free log subscription operation binding the contract event 0x13b70fd48d462f71863cae24350d77b0dc4115a7e928b39dd0f0f60b701ffed3. +// +// Solidity: event ValidatorDeregistrationRequested(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) WatchValidatorDeregistrationRequested(opts *bind.WatchOpts, sink chan<- *MevcommitavsValidatorDeregistrationRequested, validatorPubKey [][]byte, podOwner []common.Address) (event.Subscription, error) { + + var validatorPubKeyRule []interface{} + for _, validatorPubKeyItem := range validatorPubKey { + validatorPubKeyRule = append(validatorPubKeyRule, validatorPubKeyItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "ValidatorDeregistrationRequested", validatorPubKeyRule, podOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsValidatorDeregistrationRequested) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorDeregistrationRequested", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorDeregistrationRequested is a log parse operation binding the contract event 0x13b70fd48d462f71863cae24350d77b0dc4115a7e928b39dd0f0f60b701ffed3. +// +// Solidity: event ValidatorDeregistrationRequested(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) ParseValidatorDeregistrationRequested(log types.Log) (*MevcommitavsValidatorDeregistrationRequested, error) { + event := new(MevcommitavsValidatorDeregistrationRequested) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorDeregistrationRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsValidatorFrozenIterator is returned from FilterValidatorFrozen and is used to iterate over the raw logs and unpacked data for ValidatorFrozen events raised by the Mevcommitavs contract. +type MevcommitavsValidatorFrozenIterator struct { + Event *MevcommitavsValidatorFrozen // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsValidatorFrozenIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorFrozen) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorFrozen) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsValidatorFrozenIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsValidatorFrozenIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsValidatorFrozen represents a ValidatorFrozen event raised by the Mevcommitavs contract. +type MevcommitavsValidatorFrozen struct { + ValidatorPubKey common.Hash + PodOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorFrozen is a free log retrieval operation binding the contract event 0x5f565c1dd6cf6dc33dbdfd22c94b541af6ee1390251c8975b0c84106c58654bf. +// +// Solidity: event ValidatorFrozen(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) FilterValidatorFrozen(opts *bind.FilterOpts, validatorPubKey [][]byte, podOwner []common.Address) (*MevcommitavsValidatorFrozenIterator, error) { + + var validatorPubKeyRule []interface{} + for _, validatorPubKeyItem := range validatorPubKey { + validatorPubKeyRule = append(validatorPubKeyRule, validatorPubKeyItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "ValidatorFrozen", validatorPubKeyRule, podOwnerRule) + if err != nil { + return nil, err + } + return &MevcommitavsValidatorFrozenIterator{contract: _Mevcommitavs.contract, event: "ValidatorFrozen", logs: logs, sub: sub}, nil +} + +// WatchValidatorFrozen is a free log subscription operation binding the contract event 0x5f565c1dd6cf6dc33dbdfd22c94b541af6ee1390251c8975b0c84106c58654bf. +// +// Solidity: event ValidatorFrozen(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) WatchValidatorFrozen(opts *bind.WatchOpts, sink chan<- *MevcommitavsValidatorFrozen, validatorPubKey [][]byte, podOwner []common.Address) (event.Subscription, error) { + + var validatorPubKeyRule []interface{} + for _, validatorPubKeyItem := range validatorPubKey { + validatorPubKeyRule = append(validatorPubKeyRule, validatorPubKeyItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "ValidatorFrozen", validatorPubKeyRule, podOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsValidatorFrozen) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorFrozen", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorFrozen is a log parse operation binding the contract event 0x5f565c1dd6cf6dc33dbdfd22c94b541af6ee1390251c8975b0c84106c58654bf. +// +// Solidity: event ValidatorFrozen(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) ParseValidatorFrozen(log types.Log) (*MevcommitavsValidatorFrozen, error) { + event := new(MevcommitavsValidatorFrozen) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorFrozen", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsValidatorRegisteredIterator is returned from FilterValidatorRegistered and is used to iterate over the raw logs and unpacked data for ValidatorRegistered events raised by the Mevcommitavs contract. +type MevcommitavsValidatorRegisteredIterator struct { + Event *MevcommitavsValidatorRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsValidatorRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsValidatorRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsValidatorRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsValidatorRegistered represents a ValidatorRegistered event raised by the Mevcommitavs contract. +type MevcommitavsValidatorRegistered struct { + ValidatorPubKey common.Hash + PodOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRegistered is a free log retrieval operation binding the contract event 0x7cb7aef9bd2e5ee3f6073019691bb332fe3ef290465065aca1b9983f3dc66c56. +// +// Solidity: event ValidatorRegistered(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) FilterValidatorRegistered(opts *bind.FilterOpts, validatorPubKey [][]byte, podOwner []common.Address) (*MevcommitavsValidatorRegisteredIterator, error) { + + var validatorPubKeyRule []interface{} + for _, validatorPubKeyItem := range validatorPubKey { + validatorPubKeyRule = append(validatorPubKeyRule, validatorPubKeyItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "ValidatorRegistered", validatorPubKeyRule, podOwnerRule) + if err != nil { + return nil, err + } + return &MevcommitavsValidatorRegisteredIterator{contract: _Mevcommitavs.contract, event: "ValidatorRegistered", logs: logs, sub: sub}, nil +} + +// WatchValidatorRegistered is a free log subscription operation binding the contract event 0x7cb7aef9bd2e5ee3f6073019691bb332fe3ef290465065aca1b9983f3dc66c56. +// +// Solidity: event ValidatorRegistered(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) WatchValidatorRegistered(opts *bind.WatchOpts, sink chan<- *MevcommitavsValidatorRegistered, validatorPubKey [][]byte, podOwner []common.Address) (event.Subscription, error) { + + var validatorPubKeyRule []interface{} + for _, validatorPubKeyItem := range validatorPubKey { + validatorPubKeyRule = append(validatorPubKeyRule, validatorPubKeyItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "ValidatorRegistered", validatorPubKeyRule, podOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsValidatorRegistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorRegistered is a log parse operation binding the contract event 0x7cb7aef9bd2e5ee3f6073019691bb332fe3ef290465065aca1b9983f3dc66c56. +// +// Solidity: event ValidatorRegistered(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) ParseValidatorRegistered(log types.Log) (*MevcommitavsValidatorRegistered, error) { + event := new(MevcommitavsValidatorRegistered) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MevcommitavsValidatorUnfrozenIterator is returned from FilterValidatorUnfrozen and is used to iterate over the raw logs and unpacked data for ValidatorUnfrozen events raised by the Mevcommitavs contract. +type MevcommitavsValidatorUnfrozenIterator struct { + Event *MevcommitavsValidatorUnfrozen // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MevcommitavsValidatorUnfrozenIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorUnfrozen) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MevcommitavsValidatorUnfrozen) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MevcommitavsValidatorUnfrozenIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitavsValidatorUnfrozenIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitavsValidatorUnfrozen represents a ValidatorUnfrozen event raised by the Mevcommitavs contract. +type MevcommitavsValidatorUnfrozen struct { + ValidatorPubKey common.Hash + PodOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorUnfrozen is a free log retrieval operation binding the contract event 0x8b4f548363e5182887ee88395b0bacbd44ef955d9b9c1ace7aad0da43af0de40. +// +// Solidity: event ValidatorUnfrozen(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) FilterValidatorUnfrozen(opts *bind.FilterOpts, validatorPubKey [][]byte, podOwner []common.Address) (*MevcommitavsValidatorUnfrozenIterator, error) { + + var validatorPubKeyRule []interface{} + for _, validatorPubKeyItem := range validatorPubKey { + validatorPubKeyRule = append(validatorPubKeyRule, validatorPubKeyItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.FilterLogs(opts, "ValidatorUnfrozen", validatorPubKeyRule, podOwnerRule) + if err != nil { + return nil, err + } + return &MevcommitavsValidatorUnfrozenIterator{contract: _Mevcommitavs.contract, event: "ValidatorUnfrozen", logs: logs, sub: sub}, nil +} + +// WatchValidatorUnfrozen is a free log subscription operation binding the contract event 0x8b4f548363e5182887ee88395b0bacbd44ef955d9b9c1ace7aad0da43af0de40. +// +// Solidity: event ValidatorUnfrozen(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) WatchValidatorUnfrozen(opts *bind.WatchOpts, sink chan<- *MevcommitavsValidatorUnfrozen, validatorPubKey [][]byte, podOwner []common.Address) (event.Subscription, error) { + + var validatorPubKeyRule []interface{} + for _, validatorPubKeyItem := range validatorPubKey { + validatorPubKeyRule = append(validatorPubKeyRule, validatorPubKeyItem) + } + var podOwnerRule []interface{} + for _, podOwnerItem := range podOwner { + podOwnerRule = append(podOwnerRule, podOwnerItem) + } + + logs, sub, err := _Mevcommitavs.contract.WatchLogs(opts, "ValidatorUnfrozen", validatorPubKeyRule, podOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MevcommitavsValidatorUnfrozen) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorUnfrozen", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorUnfrozen is a log parse operation binding the contract event 0x8b4f548363e5182887ee88395b0bacbd44ef955d9b9c1ace7aad0da43af0de40. +// +// Solidity: event ValidatorUnfrozen(bytes indexed validatorPubKey, address indexed podOwner) +func (_Mevcommitavs *MevcommitavsFilterer) ParseValidatorUnfrozen(log types.Log) (*MevcommitavsValidatorUnfrozen, error) { + event := new(MevcommitavsValidatorUnfrozen) + if err := _Mevcommitavs.contract.UnpackLog(event, "ValidatorUnfrozen", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts-abi/script.sh b/contracts-abi/script.sh index 7a2957139..eae903171 100755 --- a/contracts-abi/script.sh +++ b/contracts-abi/script.sh @@ -38,6 +38,8 @@ extract_and_save_abi "$BASE_DIR/out/ValidatorRegistryV1.sol/ValidatorRegistryV1. extract_and_save_abi "$BASE_DIR/out/BlockTracker.sol/BlockTracker.json" "$ABI_DIR/BlockTracker.abi" +extract_and_save_abi "$BASE_DIR/out/MevCommitAVS.sol/MevCommitAVS.json" "$ABI_DIR/MevCommitAVS.abi" + echo "ABI files extracted successfully." @@ -83,5 +85,7 @@ generate_go_code "$ABI_DIR/ValidatorRegistryV1.abi" "ValidatorRegistryV1" "valid generate_go_code "$ABI_DIR/BlockTracker.abi" "BlockTracker" "blocktracker" +generate_go_code "$ABI_DIR/MevCommitAVS.abi" "MevCommitAVS" "mevcommitavs" + echo "Go code generated successfully in separate folders." diff --git a/contracts/contracts/interfaces/IMevCommitAVS.sol b/contracts/contracts/interfaces/IMevCommitAVS.sol new file mode 100644 index 000000000..590bb30d4 --- /dev/null +++ b/contracts/contracts/interfaces/IMevCommitAVS.sol @@ -0,0 +1,209 @@ +// SPDX-License-Identifier: BSL 1.1 +pragma solidity ^0.8.20; + +import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import {EventHeightLib} from "../utils/EventHeight.sol"; +import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; +import {IEigenPodManager} from "eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol"; +import {IStrategyManager} from "eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; +import {IAVSDirectory} from "eigenlayer-contracts/src/contracts/interfaces/IAVSDirectory.sol"; + +interface IMevCommitAVS { + + /// @notice Struct representing MevCommitAVS registration info for an operator + struct OperatorRegistrationInfo { + /// @notice Whether the operator is registered with MevCommitAVS + bool exists; + /// @notice Height at which the operator possibly requested deregistration + EventHeightLib.EventHeight deregRequestHeight; + } + + /// @notice Struct representing MevCommitAVS registration info for a validator + struct ValidatorRegistrationInfo { + /// @notice Whether the validator is registered with MevCommitAVS + bool exists; + /// @notice Address of the pod owner for the validator + address podOwner; + /// @notice Height at which the validator was possibly frozen + EventHeightLib.EventHeight freezeHeight; + /// @notice Height at which the validator possibly requested deregistration + EventHeightLib.EventHeight deregRequestHeight; + } + + /// @notice Struct representing MevCommitAVS registration info for a LST restaker + struct LSTRestakerRegistrationInfo { + /// @notice Whether the LST restaker is registered with MevCommitAVS + bool exists; + /// @notice Address of validator(s) chosen by the LST restaker, which equally represent the restaker + bytes[] chosenValidators; + /// @notice Total number of validators chosen by the LST restaker, where attribution is split evenly + uint256 numChosen; + /// @notice Height at which the LST restaker possibly requested deregistration + EventHeightLib.EventHeight deregRequestHeight; + } + + /// @notice Emmitted when an operator is registered with MevCommitAVS + event OperatorRegistered(address indexed operator); + + /// @notice Emmitted when a deregistration request is made for an operator + event OperatorDeregistrationRequested(address indexed operator); + + /// @notice Emmitted when an operator is deregistered from MevCommitAVS + event OperatorDeregistered(address indexed operator); + + /// @notice Emmitted when a validator is registered with MevCommitAVS + event ValidatorRegistered(bytes indexed validatorPubKey, address indexed podOwner); + + /// @notice Emmitted when a deregistration request is made for a validator + event ValidatorDeregistrationRequested(bytes indexed validatorPubKey, address indexed podOwner); + + /// @notice Emmitted when a validator is deregistered from MevCommitAVS + event ValidatorDeregistered(bytes indexed validatorPubKey, address indexed podOwner); + + /// @notice Emmitted when a LST restaker registers (chooses a validator) with MevCommitAVS + /// @dev numChosen is the total number of validators chosen by the LST restaker, where attribution is split evenly. + event LSTRestakerRegistered(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker); + + /// @notice Emmitted when a deregistration request is made by an LST restaker + /// @dev numChosen is the total number of validators chosen by the LST restaker, where attribution is split evenly. + event LSTRestakerDeregistrationRequested(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker); + + /// @notice Emmitted when a LST restaker is deregistered from MevCommitAVS + /// @dev numChosen is the total number of validators chosen by the LST restaker, where attribution is split evenly. + event LSTRestakerDeregistered(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker); + + /// @notice Emmitted when a validator is frozen by the oracle + event ValidatorFrozen(bytes indexed validatorPubKey, address indexed podOwner); + + /// @notice Emmitted when a validator is unfrozen + event ValidatorUnfrozen(bytes indexed validatorPubKey, address indexed podOwner); + + /// @notice Emitted when the AVS directory is set + event AVSDirectorySet(address indexed avsDirectory); + + /// @notice Emitted when the strategy manager is set + event StrategyManagerSet(address indexed strategyManager); + + /// @notice Emitted when the delegation manager is set + event DelegationManagerSet(address indexed delegationManager); + + /// @notice Emitted when the EigenPod manager is set + event EigenPodManagerSet(address indexed eigenPodManager); + + /// @notice Emitted when the restakeable strategies are set + event RestakeableStrategiesSet(address[] indexed restakeableStrategies); + + /// @notice Emitted when the freeze oracle is set + event FreezeOracleSet(address indexed freezeOracle); + + /// @notice Emitted when the unfreeze fee is set + event UnfreezeFeeSet(uint256 unfreezeFee); + + /// @notice Emitted when the unfreeze receiver is set + event UnfreezeReceiverSet(address indexed unfreezeReceiver); + + /// @notice Emitted when the unfreeze period is set + event UnfreezePeriodBlocksSet(uint256 unfreezePeriodBlocks); + + /// @notice Emitted when the operator deregistration period is set + event OperatorDeregPeriodBlocksSet(uint256 operatorDeregPeriodBlocks); + + /// @notice Emitted when the validator deregistration period is set + event ValidatorDeregPeriodBlocksSet(uint256 validatorDeregPeriodBlocks); + + /// @notice Emitted when the LST restaker deregistration period is set + event LSTRestakerDeregPeriodBlocksSet(uint256 lstRestakerDeregPeriodBlocks); + + /// @dev Registers an operator with the MevCommitAVS. + function registerOperator(ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature) external; + + /// @dev Allows an operator to request deregistration from the MevCommitAVS. + function requestOperatorDeregistration(address operator) external; + + /// @dev Allows an operator to deregister from the MevCommitAVS. + function deregisterOperator(address operator) external; + + /// @dev Registers sets of validator pubkeys associated to one or more pod owners. + function registerValidatorsByPodOwners(bytes[][] calldata valPubKeys, address[] calldata podOwners) external; + + /// @dev Allows a validator to request deregistration from the MevCommitAVS. + function requestValidatorsDeregistration(bytes[] calldata valPubKeys) external; + + /// @dev Allows a validator to deregister from the MevCommitAVS. + function deregisterValidators(bytes[] calldata valPubKeys) external; + + /// @dev Registers sender as an LST restaker with chosen validators. + function registerLSTRestaker(bytes[] calldata chosenValidators) external; + + /// @dev Allows an LST restaker to request deregistration from the MevCommitAVS. + function requestLSTRestakerDeregistration() external; + + /// @dev Allows an LST restaker to deregister from the MevCommitAVS. + function deregisterLSTRestaker() external; + + /// @dev Allows the freeze oracle account to freeze validators which disobey the mev-commit protocol. + function freeze(bytes[] calldata valPubKeys) external; + + /// @dev Allows any account to unfreeze validators which have been frozen, for a fee. + function unfreeze(bytes[] calldata valPubKeys) payable external; + + /// @dev Pauses the contract, restricted to contract owner. + function pause() external; + + /// @dev Unpauses the contract, restricted to contract owner. + function unpause() external; + + /// @dev Checks if a validator is opted-in. + function isValidatorOptedIn(bytes calldata valPubKey) external view returns (bool); + + /// @dev Returns operator registration info. + function getOperatorRegInfo(address operator) external view returns (OperatorRegistrationInfo memory); + + /// @dev Returns validator registration info. + function getValidatorRegInfo(bytes calldata valPubKey) external view returns (ValidatorRegistrationInfo memory); + + /// @dev Returns LST restaker registration info. + function getLSTRestakerRegInfo(address lstRestaker) external view returns (LSTRestakerRegistrationInfo memory); + + /// @dev Returns the address of AVS directory. + function avsDirectory() external view returns (address); + + /// @dev Sets the AVS directory, restricted to contract owner. + function setAVSDirectory(IAVSDirectory avsDirectory_) external; + + /// @dev Sets the strategy manager, restricted to contract owner. + function setStrategyManager(IStrategyManager strategyManager_) external; + + /// @dev Sets the delegation manager, restricted to contract owner. + function setDelegationManager(IDelegationManager delegationManager_) external; + + /// @dev Sets the EigenPod manager, restricted to contract owner. + function setEigenPodManager(IEigenPodManager eigenPodManager_) external; + + /// @dev Sets the restakeable strategies, restricted to contract owner. + function setRestakeableStrategies(address[] calldata restakeableStrategies_) external; + + /// @dev Sets the freeze oracle account, restricted to contract owner. + function setFreezeOracle(address freezeOracle_) external; + + /// @dev Sets the unfreeze fee, restricted to contract owner. + function setUnfreezeFee(uint256 unfreezeFee_) external; + + /// @dev Sets the unfreeze receiver, restricted to contract owner. + function setUnfreezeReceiver(address unfreezeReceiver_) external; + + /// @dev Sets the unfreeze period in blocks, restricted to contract owner. + function setUnfreezePeriodBlocks(uint256 unfreezePeriodBlocks_) external; + + /// @dev Sets the operator deregistration period in blocks, restricted to contract owner. + function setOperatorDeregPeriodBlocks(uint256 operatorDeregPeriodBlocks_) external; + + /// @dev Sets the validator deregistration period in blocks, restricted to contract owner. + function setValidatorDeregPeriodBlocks(uint256 validatorDeregPeriodBlocks_) external; + + /// @dev Sets the LST restaker deregistration period in blocks, restricted to contract owner. + function setLstRestakerDeregPeriodBlocks(uint256 lstRestakerDeregPeriodBlocks_) external; + + /// @dev Updates the eigenlayer metadata URI, restricted to contract owner. + function updateMetadataURI(string memory metadataURI_) external; +} diff --git a/contracts/contracts/interfaces/IValidatorOptInRouter.sol b/contracts/contracts/interfaces/IValidatorOptInRouter.sol new file mode 100644 index 000000000..5a4928c48 --- /dev/null +++ b/contracts/contracts/interfaces/IValidatorOptInRouter.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: BSL 1.1 +pragma solidity ^0.8.20; + +interface IValidatorOptInRouter { + /// @notice Initializes the contract with the validator registry and mev-commit AVS contracts. + function initialize( + address _validatorRegistry, + address _mevCommitAVS, + address _owner + ) external; + + /// @notice Allows the owner to set the validator registry V1 contract. + function setValidatorRegistryV1(address _validatorRegistry) external; + + /// @notice Allows the owner to set the mev-commit AVS contract. + function setMevCommitAVS(address _mevCommitAVS) external; + + /// @notice Returns an array of bools indicating whether each validator pubkey is opted in to mev-commit. + function areValidatorsOptedIn(bytes[] calldata valBLSPubKeys) external view returns (bool[] memory); +} diff --git a/contracts/contracts/interfaces/IValidatorRegistryV1.sol b/contracts/contracts/interfaces/IValidatorRegistryV1.sol index 694bdd5f1..49a36ae1a 100644 --- a/contracts/contracts/interfaces/IValidatorRegistryV1.sol +++ b/contracts/contracts/interfaces/IValidatorRegistryV1.sol @@ -5,7 +5,7 @@ import { EventHeightLib } from "../utils/EventHeight.sol"; /// @title IValidatorRegistryV1 /// @notice Interface for the ValidatorRegistryV1 contract. -contract IValidatorRegistryV1 { +interface IValidatorRegistryV1 { /// @dev Event emitted when a validator is staked. event Staked(address indexed msgSender, address indexed withdrawalAddress, bytes valBLSPubKey, uint256 amount); @@ -44,4 +44,89 @@ contract IValidatorRegistryV1 { address withdrawalAddress; EventHeightLib.EventHeight unstakeHeight; } + + /// @dev Initializes the contract with the provided parameters. + function initialize( + uint256 _minStake, + uint256 _slashAmount, + address _slashOracle, + address _slashReceiver, + uint256 _unstakePeriodBlocks, + address _owner + ) external; + + /* + * @dev Stakes ETH on behalf of one or multiple validators via their BLS pubkey. + * @param blsPubKeys The validator BLS public keys to stake. + */ + function stake(bytes[] calldata blsPubKeys) external payable; + + /* + * @dev Stakes ETH on behalf of one or multiple validators via their BLS pubkey, + * and specifies an address other than msg.sender to be the withdrawal address. + * @param blsPubKeys The validator BLS public keys to stake. + * @param withdrawalAddress The address to receive the staked ETH. + */ + function delegateStake(bytes[] calldata blsPubKeys, address withdrawalAddress) external payable; + + /* + * @dev Adds ETH to the staked balance of one or multiple validators via their BLS pubkey. + * @dev A staking entry must already exist for each provided BLS pubkey. + * @param blsPubKeys The BLS public keys to add stake to. + */ + function addStake(bytes[] calldata blsPubKeys) external payable; + + /* + * @dev Unstakes ETH on behalf of one or multiple validators via their BLS pubkey. + * @param blsPubKeys The BLS public keys to unstake. + */ + function unstake(bytes[] calldata blsPubKeys) external; + + /* + * @dev Withdraws ETH on behalf of one or multiple validators via their BLS pubkey. + * @param blsPubKeys The BLS public keys to withdraw. + */ + function withdraw(bytes[] calldata blsPubKeys) external; + + /* + * @dev Allows oracle to slash some portion of stake for one or multiple validators via their BLS pubkey. + * @param blsPubKeys The BLS public keys to slash. + */ + function slash(bytes[] calldata blsPubKeys) external; + + /// @dev Enables the owner to pause the contract. + function pause() external; + + /// @dev Enables the owner to unpause the contract. + function unpause() external; + + /// @dev Enables the owner to set the minimum stake parameter. + function setMinStake(uint256 newMinStake) external; + + /// @dev Enables the owner to set the slash amount parameter. + function setSlashAmount(uint256 newSlashAmount) external; + + /// @dev Enables the owner to set the slash oracle parameter. + function setSlashOracle(address newSlashOracle) external; + + /// @dev Enables the owner to set the slash receiver parameter. + function setSlashReceiver(address newSlashReceiver) external; + + /// @dev Enables the owner to set the unstake period parameter. + function setUnstakePeriodBlocks(uint256 newUnstakePeriodBlocks) external; + + /// @dev Returns true if a validator is considered "opted-in" to mev-commit via this registry. + function isValidatorOptedIn(bytes calldata valBLSPubKey) external view returns (bool); + + /// @dev Returns stored staked validator struct for a given BLS pubkey. + function getStakedValidator(bytes calldata valBLSPubKey) external view returns (StakedValidator memory); + + /// @dev Returns the staked amount for a given BLS pubkey. + function getStakedAmount(bytes calldata valBLSPubKey) external view returns (uint256); + + /// @dev Returns true if a validator is currently unstaking. + function isUnstaking(bytes calldata valBLSPubKey) external view returns (bool); + + /// @dev Returns the number of blocks remaining until an unstaking validator can withdraw their staked ETH. + function getBlocksTillWithdrawAllowed(bytes calldata valBLSPubKey) external view returns (uint256); } diff --git a/contracts/contracts/validator-registry/README.md b/contracts/contracts/validator-registry/README.md index eded2ac4c..7fb1dea70 100644 --- a/contracts/contracts/validator-registry/README.md +++ b/contracts/contracts/validator-registry/README.md @@ -1,24 +1,35 @@ -# Validator Registry v1 Design doc +# Validator Registry Design doc -The v1 validator registry allows validators to _opt-in to mev-commit_ by staking ETH directly with the contract. This stake is separate from what the validator has already staked with the beacon chain. +Validators are able to _opt-in to mev-commit_ in one of two ways: -This _simple staking_ model serves as an alternative to a validator opting-in to mev-commit via restaking ETH and/or LSTs. +1. Restaking with the `MevCommitAVS` contract. +2. Simple staking with the `V1ValidatorRegistry` contract. -## Staking +The `ValidatorOptInRouter` contract acts as a query router between both solutions, allowing any actor to query whether a group of validator pubkeys is opted-in to mev-commit. + +## Mev-commit AVS - Restaking Solution + +For more details on the Mev-commit AVS, please refer to the [Mev-commit AVS README](avs/README.md). + +## V1 Validator Registry - Simple Staking Solution + +The v1 validator registry allows validators to _opt-in to mev-commit_ by staking native ETH directly with the contract. This stake is separate from a validator's 32 ETH already staked with the beacon chain. + +### Staking Staking involves an account depositing ETH into the contract on behalf of one or more validator BLS pubkeys. Validator pubkeys are only verified by length, and not verified as a pubkey residing from an active validator on the beacon chain. Therefore stake associated with a non-active or otherwise invalid validator pubkey **can be slashed by the oracle to prevent spam**. For the `stake` function, the account which stakes each validator pubkey is the withdrawal address for that validator. The `delegateStake` function allows only the contract owner to stake on behalf of other specified withdrawal accounts. -## Unstaking +### Unstaking Unstaking involves the withdrawal account for a validator pubkey calling `Unstake` for that validator. This transaction does not move funds. It does mark the validator as no longer "opted-in", and starts the process for a later withdrawal. -## Withdrawals +### Withdrawals After a validator has been unstaked, and `unstakePeriodBlocks` amount of blocks have passed, the withdrawal account for a validator can call `withdraw`. This will transfer the validator's ETH back to their withdrawal address. -## Slashing +### Slashing Note the permissioned oracle account for this contract can slash any validator that proposes a block which does not deliver preconfs from the mev-commit network. This corresponds to some configurable portion of the validator's stake being slashed (immediately sent to the contracts' `slashReceiver`). diff --git a/contracts/contracts/validator-registry/ValidatorOptInRouter.sol b/contracts/contracts/validator-registry/ValidatorOptInRouter.sol new file mode 100644 index 000000000..9e8e6cbdf --- /dev/null +++ b/contracts/contracts/validator-registry/ValidatorOptInRouter.sol @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: BSL 1.1 +pragma solidity ^0.8.20; + +import {ValidatorOptInRouterStorage} from "./ValidatorOptInRouterStorage.sol"; +import {IValidatorOptInRouter} from "../interfaces/IValidatorOptInRouter.sol"; +import {IValidatorRegistryV1} from "../interfaces/IValidatorRegistryV1.sol"; +import {IMevCommitAVS} from "../interfaces/IMevCommitAVS.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; + +/// @title ValidatorOptInRouter +/// @notice This contract acts as the top level source of truth for whether a validator +/// is opted in to mev-commit from either the v1 validator registry or the mev-commit AVS. +contract ValidatorOptInRouter is IValidatorOptInRouter, ValidatorOptInRouterStorage, + OwnableUpgradeable, UUPSUpgradeable { + + /// @dev See https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable#initializing_the_implementation_contract + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /// @notice Initializes the contract with the validator registry and mev-commit AVS contracts. + function initialize( + address _validatorRegistry, + address _mevCommitAVS, + address _owner + ) external initializer { + validatorRegistryV1 = IValidatorRegistryV1(_validatorRegistry); + mevCommitAVS = IMevCommitAVS(_mevCommitAVS); + __Ownable_init(_owner); + __UUPSUpgradeable_init(); + } + + /* + * @dev implements _authorizeUpgrade from UUPSUpgradeable to enable only + * the owner to upgrade the implementation contract. + */ + function _authorizeUpgrade(address) internal override onlyOwner {} + + /// @notice Allows the owner to set the validator registry V1 contract. + function setValidatorRegistryV1(address _validatorRegistry) external onlyOwner { + validatorRegistryV1 = IValidatorRegistryV1(_validatorRegistry); + } + + /// @notice Allows the owner to set the mev-commit AVS contract. + function setMevCommitAVS(address _mevCommitAVS) external onlyOwner { + mevCommitAVS = IMevCommitAVS(_mevCommitAVS); + } + + /// @notice Returns an array of bools indicating whether each validator pubkey is opted in to mev-commit. + function areValidatorsOptedIn(bytes[] calldata valBLSPubKeys) external view returns (bool[] memory) { + bool[] memory optedIn = new bool[](valBLSPubKeys.length); + for (uint256 i = 0; i < valBLSPubKeys.length; i++) { + optedIn[i] = _isValidatorOptedIn(valBLSPubKeys[i]); + } + return optedIn; + } + + /// @notice Internal function to check if a validator is opted in to mev-commit with either simple staking or restaking. + function _isValidatorOptedIn(bytes calldata valBLSPubKey) internal view returns (bool) { + bool simpleStakeOptedIn = validatorRegistryV1.isValidatorOptedIn(valBLSPubKey); + bool restakeOptedIn = mevCommitAVS.isValidatorOptedIn(valBLSPubKey); + return simpleStakeOptedIn || restakeOptedIn; + } + + /// @dev Fallback function to revert all calls, ensuring no unintended interactions. + fallback() external payable { + revert("Invalid call"); + } + + /// @dev Receive function is disabled for this contract to prevent unintended interactions. + receive() external payable { + revert("Invalid call"); + } +} diff --git a/contracts/contracts/validator-registry/ValidatorOptInRouterStorage.sol b/contracts/contracts/validator-registry/ValidatorOptInRouterStorage.sol new file mode 100644 index 000000000..7665fc04b --- /dev/null +++ b/contracts/contracts/validator-registry/ValidatorOptInRouterStorage.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: BSL 1.1 +pragma solidity ^0.8.20; + +import {IValidatorRegistryV1} from "../interfaces/IValidatorRegistryV1.sol"; +import {IMevCommitAVS} from "../interfaces/IMevCommitAVS.sol"; + +/// @title ValidatorOptInRouterStorage +/// @notice Storage components of the ValidatorOptInRouter contract. +contract ValidatorOptInRouterStorage { + /// @notice The address of the V1 validator registry contract. + IValidatorRegistryV1 public validatorRegistryV1; + /// @notice The address of the mev-commit AVS contract. + IMevCommitAVS public mevCommitAVS; +} diff --git a/contracts/contracts/validator-registry/avs/MevCommitAVS.sol b/contracts/contracts/validator-registry/avs/MevCommitAVS.sol new file mode 100644 index 000000000..7f364a63a --- /dev/null +++ b/contracts/contracts/validator-registry/avs/MevCommitAVS.sol @@ -0,0 +1,605 @@ +// SPDX-License-Identifier: BSL 1.1 +pragma solidity ^0.8.20; + +import {IMevCommitAVS} from "../../interfaces/IMevCommitAVS.sol"; +import {MevCommitAVSStorage} from "./MevCommitAVSStorage.sol"; +import {EventHeightLib} from "../../utils/EventHeight.sol"; +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; +import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; +import {IEigenPodManager} from "eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol"; +import {IEigenPod} from "eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol"; +import {IAVSDirectory} from "eigenlayer-contracts/src/contracts/interfaces/IAVSDirectory.sol"; +import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import {IStrategyManager} from "eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; + +/// @title MevCommitAVS +/// @notice This contract serves as the entrypoint for operators, validators and LST restakers to register with +/// the mev-commit protocol via an eigenlayer AVS. +contract MevCommitAVS is IMevCommitAVS, MevCommitAVSStorage, + OwnableUpgradeable, PausableUpgradeable, UUPSUpgradeable { + + /// @dev Modifier to ensure the provided operator is registered with MevCommitAVS. + modifier onlyRegisteredOperator(address operator) { + require(operatorRegistrations[operator].exists, "operator must be registered"); + _; + } + + /// @dev Modifier to ensure the sender is not a registered operator with MevCommitAVS. + modifier onlyNonRegisteredOperator() { + require(!operatorRegistrations[msg.sender].exists, "sender must not be registered operator"); + _; + } + + /// @dev Modifier to ensure all provided validators are registered with MevCommitAVS. + modifier onlyRegisteredValidators(bytes[] calldata valPubKeys) { + for (uint256 i = 0; i < valPubKeys.length; i++) { + require(validatorRegistrations[valPubKeys[i]].exists, "validator must be registered"); + } + _; + } + + /// @dev Modifier to ensure all provided validators are not registered with MevCommitAVS. + modifier onlyNonRegisteredValidators(bytes[] calldata valPubKeys) { + for (uint256 i = 0; i < valPubKeys.length; i++) { + require(!validatorRegistrations[valPubKeys[i]].exists, "validator must not be registered"); + } + _; + } + + /// @dev Modifier to ensure the sender is a registered LST restaker with MevCommitAVS. + modifier onlyRegisteredLstRestaker() { + require(lstRestakerRegistrations[msg.sender].exists, "sender must be registered LST restaker"); + _; + } + + /// @dev Modifier to ensure the sender is not a registered LST restaker with MevCommitAVS. + modifier onlyNonRegisteredLstRestaker() { + require(!lstRestakerRegistrations[msg.sender].exists, "sender must not be registered LST restaker"); + _; + } + + /// @dev Modifier to ensure the sender is the MevCommitAVS freeze oracle account. + modifier onlyFreezeOracle() { + require(msg.sender == freezeOracle, "sender must be freeze oracle"); + _; + } + + /// @dev Modifier to ensure the sender is registered as an operator with the eigenlayer core contracts. + modifier onlyEigenCoreOperator() { + require(_delegationManager.isOperator(msg.sender), "sender must be an eigenlayer operator"); + _; + } + + /// @dev Modifier to ensure the sender is the given operator + modifier onlyOperator(address operator) { + require(msg.sender == operator, "sender must be operator"); + _; + } + + /// @dev Modifier to ensure the sender is either the given pod owner, + /// or the delegated operator for the given pod owner. + modifier onlyPodOwnerOrOperator(address podOwner) { + require(msg.sender == podOwner || msg.sender == _delegationManager.delegatedTo(podOwner), + "sender must be podOwner or delegated operator"); + _; + } + + /// @dev Modifier to ensure the sender is either the pod owner or operator of all the given validators. + modifier onlyPodOwnerOrOperatorOfValidators(bytes[] calldata valPubKeys) { + for (uint256 i = 0; i < valPubKeys.length; i++) { + IMevCommitAVS.ValidatorRegistrationInfo memory regInfo = validatorRegistrations[valPubKeys[i]]; + require(msg.sender == regInfo.podOwner || msg.sender == _delegationManager.delegatedTo(regInfo.podOwner), + "sender must be podOwner or delegated operator of validator"); + } + _; + } + + /// @dev Modifier to ensure the sender is delegated to a registered operator. + modifier onlySenderWithRegisteredOperator() { + address delegatedOperator = _delegationManager.delegatedTo(msg.sender); + require(operatorRegistrations[delegatedOperator].exists, + "sender must be delegated to an operator that is registered with MevCommitAVS"); + _; + } + + /// @dev Modifier to ensure all provided validators are frozen. + modifier onlyFrozenValidators(bytes[] calldata valPubKeys) { + for (uint256 i = 0; i < valPubKeys.length; i++) { + require(validatorRegistrations[valPubKeys[i]].freezeHeight.exists, "validator must be frozen"); + } + _; + } + + /// @dev See https://docs.openzeppelin.com/upgrades-plugins/1.x/writing-upgradeable#initializing_the_implementation_contract + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /// @dev Initializes the contract with provided parameters. + function initialize( + address owner_, + IDelegationManager delegationManager_, + IEigenPodManager eigenPodManager_, + IStrategyManager strategyManager_, + IAVSDirectory avsDirectory_, + address[] calldata restakeableStrategies_, + address freezeOracle_, + uint256 unfreezeFee_, + address unfreezeReceiver_, + uint256 unfreezePeriodBlocks_, + uint256 operatorDeregPeriodBlocks_, + uint256 validatorDeregPeriodBlocks_, + uint256 lstRestakerDeregPeriodBlocks_, + string calldata metadataURI_ + ) external initializer { + _setDelegationManager(delegationManager_); + _setEigenPodManager(eigenPodManager_); + _setStrategyManager(strategyManager_); + _setAVSDirectory(avsDirectory_); + _setRestakeableStrategies(restakeableStrategies_); + _setFreezeOracle(freezeOracle_); + _setUnfreezeFee(unfreezeFee_); + _setUnfreezeReceiver(unfreezeReceiver_); + _setUnfreezePeriodBlocks(unfreezePeriodBlocks_); + _setOperatorDeregPeriodBlocks(operatorDeregPeriodBlocks_); + _setValidatorDeregPeriodBlocks(validatorDeregPeriodBlocks_); + _setLstRestakerDeregPeriodBlocks(lstRestakerDeregPeriodBlocks_); + if (bytes(metadataURI_).length > 0) { + _updateMetadataURI(metadataURI_); + } + __Ownable_init(owner_); + __UUPSUpgradeable_init(); + __Pausable_init(); + } + + /// @dev Authorizes contract upgrades, restricted to contract owner. + function _authorizeUpgrade(address newImplementation) internal override onlyOwner { } + + /// @dev Registers an operator with the MevCommitAVS. + function registerOperator ( + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external whenNotPaused() onlyNonRegisteredOperator() onlyEigenCoreOperator() { + _registerOperator(operatorSignature); + } + + /// @dev Allows an operator to request deregistration from the MevCommitAVS. + function requestOperatorDeregistration(address operator + ) external whenNotPaused() onlyRegisteredOperator(operator) onlyOperator(operator) { + _requestOperatorDeregistration(operator); + } + + /// @dev Allows an operator to deregister from the MevCommitAVS. + function deregisterOperator(address operator + ) external whenNotPaused() onlyRegisteredOperator(operator) onlyOperator(operator) { + _deregisterOperator(operator); + } + + /// @dev Registers sets of validator pubkeys associated to one or more pod owners. + /// @notice The underlying _registerValidatorsByPodOwner enforces the sender is either + /// the provided pod owner, or the delegated operator for each pod owner. + function registerValidatorsByPodOwners( + bytes[][] calldata valPubKeys, + address[] calldata podOwners + ) external whenNotPaused() { + for (uint256 i = 0; i < podOwners.length; i++) { + _registerValidatorsByPodOwner(valPubKeys[i], podOwners[i]); + } + } + + /// @dev Allows a validator to request deregistration from the MevCommitAVS. + /// @notice For each validator the underlying _requestValidatorDeregistration enforces the sender is either + /// the podOwner, delegated operator, or the contract owner. + function requestValidatorsDeregistration(bytes[] calldata valPubKeys) + external whenNotPaused() onlyRegisteredValidators(valPubKeys) onlyPodOwnerOrOperatorOfValidators(valPubKeys) { + for (uint256 i = 0; i < valPubKeys.length; i++) { + _requestValidatorDeregistration(valPubKeys[i]); + } + } + + /// @dev Allows a validator to deregister from the MevCommitAVS. + /// @notice For each validator the underlying _deregisterValidator enforces the sender is either + /// the podOwner, delegated operator, or the contract owner. + function deregisterValidators(bytes[] calldata valPubKeys) + external whenNotPaused() onlyRegisteredValidators(valPubKeys) onlyPodOwnerOrOperatorOfValidators(valPubKeys) { + for (uint256 i = 0; i < valPubKeys.length; i++) { + _deregisterValidator(valPubKeys[i]); + } + } + + /// @dev Registers sender as an LST restaker with chosen validators. + function registerLSTRestaker(bytes[] calldata chosenValidators) + external whenNotPaused() onlyNonRegisteredLstRestaker() onlySenderWithRegisteredOperator() { + _registerLSTRestaker(chosenValidators); + } + + /// @dev Allows an LST restaker to request deregistration from the MevCommitAVS. + function requestLSTRestakerDeregistration() external whenNotPaused() onlyRegisteredLstRestaker() { + _requestLSTRestakerDeregistration(); + } + + /// @dev Allows an LST restaker to deregister from the MevCommitAVS. + function deregisterLSTRestaker() external whenNotPaused() onlyRegisteredLstRestaker() { + _deregisterLSTRestaker(); + } + + /// @dev Allows the freeze oracle account to freeze validators which disobey the mev-commit protocol. + function freeze(bytes[] calldata valPubKeys) external + whenNotPaused() onlyRegisteredValidators(valPubKeys) onlyFreezeOracle() { + for (uint256 i = 0; i < valPubKeys.length; i++) { + _freeze(valPubKeys[i]); + } + } + + /// @dev Allows any account to unfreeze validators which have been frozen, for a fee. + function unfreeze(bytes[] calldata valPubKey) payable external + whenNotPaused() onlyRegisteredValidators(valPubKey) onlyFrozenValidators(valPubKey) { + require(msg.value >= unfreezeFee * valPubKey.length, + "sender must pay at least the unfreeze fee for each validator"); + uint256 feePerVal = msg.value / valPubKey.length; + for (uint256 i = 0; i < valPubKey.length; i++) { + _unfreeze(valPubKey[i]); + payable(unfreezeReceiver).transfer(feePerVal); + } + } + + /// @dev Pauses the contract, restricted to contract owner. + function pause() external onlyOwner { + _pause(); + } + + /// @dev Unpauses the contract, restricted to contract owner. + function unpause() external onlyOwner { + _unpause(); + } + + /// @dev Sets the AVS directory, restricted to contract owner. + function setAVSDirectory(IAVSDirectory avsDirectory_) external onlyOwner { + _setAVSDirectory(avsDirectory_); + } + + /// @dev Sets the strategy manager, restricted to contract owner. + function setStrategyManager(IStrategyManager strategyManager_) external onlyOwner { + _setStrategyManager(strategyManager_); + } + + /// @dev Sets the delegation manager, restricted to contract owner. + function setDelegationManager(IDelegationManager delegationManager_) external onlyOwner { + _setDelegationManager(delegationManager_); + } + + /// @dev Sets the EigenPod manager, restricted to contract owner. + function setEigenPodManager(IEigenPodManager eigenPodManager_) external onlyOwner { + _setEigenPodManager(eigenPodManager_); + } + + /// @dev Sets the restakeable strategies, restricted to contract owner. + function setRestakeableStrategies(address[] calldata restakeableStrategies_) external onlyOwner { + _setRestakeableStrategies(restakeableStrategies_); + } + + /// @dev Sets the freeze oracle account, restricted to contract owner. + function setFreezeOracle(address freezeOracle_) external onlyOwner { + _setFreezeOracle(freezeOracle_); + } + + /// @dev Sets the unfreeze fee, restricted to contract owner. + function setUnfreezeFee(uint256 unfreezeFee_) external onlyOwner { + _setUnfreezeFee(unfreezeFee_); + } + + /// @dev Sets the unfreeze receiver, restricted to contract owner. + function setUnfreezeReceiver(address unfreezeReceiver_) external onlyOwner { + _setUnfreezeReceiver(unfreezeReceiver_); + } + + /// @dev Sets the unfreeze period in blocks, restricted to contract owner. + function setUnfreezePeriodBlocks(uint256 unfreezePeriodBlocks_) external onlyOwner { + _setUnfreezePeriodBlocks(unfreezePeriodBlocks_); + } + + /// @dev Sets the operator deregistration period inblocks, restricted to contract owner. + function setOperatorDeregPeriodBlocks(uint256 operatorDeregPeriodBlocks_) external onlyOwner { + _setOperatorDeregPeriodBlocks(operatorDeregPeriodBlocks_); + } + + /// @dev Sets the validator deregistration period in blocks, restricted to contract owner. + function setValidatorDeregPeriodBlocks(uint256 validatorDeregPeriodBlocks_) external onlyOwner { + _setValidatorDeregPeriodBlocks(validatorDeregPeriodBlocks_); + } + + /// @dev Sets the LST restaker deregistration period in blocks, restricted to contract owner. + function setLstRestakerDeregPeriodBlocks(uint256 lstRestakerDeregPeriodBlocks_) external onlyOwner { + _setLstRestakerDeregPeriodBlocks(lstRestakerDeregPeriodBlocks_); + } + + /// @dev Updates the eigenlayer metadata URI, restricted to contract owner. + function updateMetadataURI(string memory metadataURI_) external onlyOwner { + _updateMetadataURI(metadataURI_); + } + + /// @dev Internal function to register an operator. + function _registerOperator(ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature) internal { + _eigenAVSDirectory.registerOperatorToAVS(msg.sender, operatorSignature); + operatorRegistrations[msg.sender] = OperatorRegistrationInfo({ + exists: true, + deregRequestHeight: EventHeightLib.EventHeight({ + exists: false, + blockHeight: 0 + }) + }); + emit OperatorRegistered(msg.sender); + } + + /// @dev Internal function to request deregistration of an operator. + function _requestOperatorDeregistration(address operator) internal { + require(!operatorRegistrations[operator].deregRequestHeight.exists, + "operator must not have already requested deregistration"); + EventHeightLib.set(operatorRegistrations[operator].deregRequestHeight, block.number); + emit OperatorDeregistrationRequested(operator); + } + + /// @dev Internal function to deregister an operator. + function _deregisterOperator(address operator) internal { + require(operatorRegistrations[operator].deregRequestHeight.exists, "operator must have requested deregistration"); + require(block.number >= operatorRegistrations[operator].deregRequestHeight.blockHeight + operatorDeregPeriodBlocks, + "deregistration must happen at least operatorDeregPeriodBlocks after deregistration request height"); + _eigenAVSDirectory.deregisterOperatorFromAVS(operator); + delete operatorRegistrations[operator]; + emit OperatorDeregistered(operator); + } + + /// @dev Internal function to register validators by their pod owner. + /// @notice Invalid pubkeys should not correspond to VALIDATOR_STATUS.ACTIVE due to validations in EigenPod.sol + function _registerValidatorsByPodOwner( + bytes[] calldata valPubKeys, + address podOwner + ) internal onlyNonRegisteredValidators(valPubKeys) onlyPodOwnerOrOperator(podOwner) { + require(operatorRegistrations[_delegationManager.delegatedTo(podOwner)].exists, + "delegated operator must be registered with MevCommitAVS"); + IEigenPod pod = _eigenPodManager.getPod(podOwner); + for (uint256 i = 0; i < valPubKeys.length; i++) { + require(pod.validatorPubkeyToInfo(valPubKeys[i]).status == IEigenPod.VALIDATOR_STATUS.ACTIVE, + "validator must be active under pod"); + _registerValidator(valPubKeys[i], podOwner); + } + } + + /// @dev Internal function to register a validator. + function _registerValidator(bytes calldata valPubKey, address podOwner) internal { + validatorRegistrations[valPubKey] = ValidatorRegistrationInfo({ + exists: true, + podOwner: podOwner, + freezeHeight: EventHeightLib.EventHeight({ + exists: false, + blockHeight: 0 + }), + deregRequestHeight: EventHeightLib.EventHeight({ + exists: false, + blockHeight: 0 + }) + }); + emit ValidatorRegistered(valPubKey, podOwner); + } + + /// @dev Internal function to request deregistration of a validator. + function _requestValidatorDeregistration(bytes calldata valPubKey) internal { + require(!validatorRegistrations[valPubKey].deregRequestHeight.exists, + "validator must not have already requested deregistration"); + EventHeightLib.set(validatorRegistrations[valPubKey].deregRequestHeight, block.number); + emit ValidatorDeregistrationRequested(valPubKey, validatorRegistrations[valPubKey].podOwner); + } + + /// @dev Internal function to deregister a validator. + function _deregisterValidator(bytes calldata valPubKey) internal { + require(!validatorRegistrations[valPubKey].freezeHeight.exists, "frozen validator cannot deregister"); + require(validatorRegistrations[valPubKey].deregRequestHeight.exists, + "validator must have requested deregistration"); + require(block.number >= validatorRegistrations[valPubKey].deregRequestHeight.blockHeight + validatorDeregPeriodBlocks, + "deregistration must happen at least validatorDeregPeriodBlocks after deregistration request height"); + address podOwner = validatorRegistrations[valPubKey].podOwner; + delete validatorRegistrations[valPubKey]; + emit ValidatorDeregistered(valPubKey, podOwner); + } + + /// @dev Internal function to register an LST restaker. + function _registerLSTRestaker(bytes[] calldata chosenValidators) internal { + require(chosenValidators.length > 0, "LST restaker must choose at least one validator"); + uint256 stratLen = _strategyManager.stakerStrategyListLength(msg.sender); + require(stratLen > 0, "LST restaker must have deposited into at least one strategy"); + lstRestakerRegistrations[msg.sender] = LSTRestakerRegistrationInfo({ + exists: true, + chosenValidators: chosenValidators, + numChosen: chosenValidators.length, + deregRequestHeight: EventHeightLib.EventHeight({ + exists: false, + blockHeight: 0 + }) + }); + for (uint256 i = 0; i < chosenValidators.length; i++) { + emit LSTRestakerRegistered(chosenValidators[i], chosenValidators.length, msg.sender); + } + } + + /// @dev Internal function to request deregistration of an LST restaker. + function _requestLSTRestakerDeregistration() internal { + LSTRestakerRegistrationInfo storage reg = lstRestakerRegistrations[msg.sender]; + require(!reg.deregRequestHeight.exists, "LST restaker must not have already requested deregistration"); + EventHeightLib.set(reg.deregRequestHeight, block.number); + for (uint256 i = 0; i < reg.numChosen; i++) { + emit LSTRestakerDeregistrationRequested(reg.chosenValidators[i], reg.numChosen, msg.sender); + } + } + + /// @dev Internal function to deregister an LST restaker. + function _deregisterLSTRestaker() internal { + LSTRestakerRegistrationInfo storage reg = lstRestakerRegistrations[msg.sender]; + require(reg.deregRequestHeight.exists, "LST restaker must have requested deregistration"); + require(block.number >= reg.deregRequestHeight.blockHeight + lstRestakerDeregPeriodBlocks, + "deregistration must happen at least lstRestakerDeregPeriodBlocks after deregistration request height"); + for (uint256 i = 0; i < reg.numChosen; i++) { + emit LSTRestakerDeregistered(reg.chosenValidators[i], reg.numChosen, msg.sender); + } + delete lstRestakerRegistrations[msg.sender]; + } + + /// @dev Internal function to freeze a validator. + function _freeze(bytes calldata valPubKey) internal { + require(!validatorRegistrations[valPubKey].freezeHeight.exists, "validator must not already be frozen"); + EventHeightLib.set(validatorRegistrations[valPubKey].freezeHeight, block.number); + emit ValidatorFrozen(valPubKey, validatorRegistrations[valPubKey].podOwner); + } + + /// @dev Internal function to unfreeze a validator. + function _unfreeze(bytes calldata valPubKey) internal { + require(block.number >= validatorRegistrations[valPubKey].freezeHeight.blockHeight + unfreezePeriodBlocks, + "unfreeze must happen at least unfreezePeriodBlocks after freeze height"); + EventHeightLib.del(validatorRegistrations[valPubKey].freezeHeight); + emit ValidatorUnfrozen(valPubKey, validatorRegistrations[valPubKey].podOwner); + } + + /// @dev Internal function to set the AVS directory. + function _setAVSDirectory(IAVSDirectory avsDirectory_) internal { + _eigenAVSDirectory = avsDirectory_; + emit AVSDirectorySet(address(_eigenAVSDirectory)); + } + + /// @dev Internal function to set the strategy manager. + function _setStrategyManager(IStrategyManager strategyManager_) internal { + _strategyManager = strategyManager_; + emit StrategyManagerSet(address(strategyManager_)); + } + + /// @dev Internal function to set the delegation manager. + function _setDelegationManager(IDelegationManager delegationManager_) internal { + _delegationManager = delegationManager_; + emit DelegationManagerSet(address(delegationManager_)); + } + + /// @dev Internal function to set the EigenPod manager. + function _setEigenPodManager(IEigenPodManager eigenPodManager_) internal { + _eigenPodManager = eigenPodManager_; + emit EigenPodManagerSet(address(eigenPodManager_)); + } + + /// @dev Internal function to set the restakeable strategies. + function _setRestakeableStrategies(address[] calldata restakeableStrategies_) internal { + restakeableStrategies = restakeableStrategies_; + emit RestakeableStrategiesSet(restakeableStrategies); + } + + /// @dev Internal function to set the freeze oracle account. + function _setFreezeOracle(address _freezeOracle) internal { + freezeOracle = _freezeOracle; + emit FreezeOracleSet(_freezeOracle); + } + + /// @dev Internal function to set the unfreeze fee. + function _setUnfreezeFee(uint256 _unfreezeFee) internal { + unfreezeFee = _unfreezeFee; + emit UnfreezeFeeSet(_unfreezeFee); + } + + /// @dev Internal function to set the unfreeze receiver. + function _setUnfreezeReceiver(address _unfreezeReceiver) internal { + unfreezeReceiver = _unfreezeReceiver; + emit UnfreezeReceiverSet(_unfreezeReceiver); + } + + /// @dev Internal function to set the unfreeze period in blocks. + function _setUnfreezePeriodBlocks(uint256 _unfreezePeriodBlocks) internal { + unfreezePeriodBlocks = _unfreezePeriodBlocks; + emit UnfreezePeriodBlocksSet(_unfreezePeriodBlocks); + } + + /// @dev Internal function to set the operator deregistration period in blocks. + function _setOperatorDeregPeriodBlocks(uint256 _operatorDeregPeriodBlocks) internal { + operatorDeregPeriodBlocks = _operatorDeregPeriodBlocks; + emit OperatorDeregPeriodBlocksSet(_operatorDeregPeriodBlocks); + } + + /// @dev Internal function to set the validator deregistration period in blocks. + function _setValidatorDeregPeriodBlocks(uint256 _validatorDeregPeriodBlocks) internal { + validatorDeregPeriodBlocks = _validatorDeregPeriodBlocks; + emit ValidatorDeregPeriodBlocksSet(_validatorDeregPeriodBlocks); + } + + /// @dev Internal function to set the LST restaker deregistration period in blocks. + function _setLstRestakerDeregPeriodBlocks(uint256 _lstRestakerDeregPeriodBlocks) internal { + lstRestakerDeregPeriodBlocks = _lstRestakerDeregPeriodBlocks; + emit LSTRestakerDeregPeriodBlocksSet(_lstRestakerDeregPeriodBlocks); + } + + /// @dev Internal function to update the eigenlayer metadata URI. + function _updateMetadataURI(string memory _metadataURI) internal { + _eigenAVSDirectory.updateAVSMetadataURI(_metadataURI); + } + + /// @dev Returns the list of restakeable strategies. + function getRestakeableStrategies() external view returns (address[] memory) { + return _getRestakeableStrategies(); + } + + /// @dev Returns the restakeable strategies for a given operator. + function getOperatorRestakedStrategies(address operator) external view returns (address[] memory) { + if (!operatorRegistrations[operator].exists) { + return new address[](0); + } + return _getRestakeableStrategies(); + } + + /// @dev Checks if a validator is opted-in. + function isValidatorOptedIn(bytes calldata valPubKey) external view returns (bool) { + return _isValidatorOptedIn(valPubKey); + } + + /// @dev Returns operator registration info. + function getOperatorRegInfo(address operator) external view returns (OperatorRegistrationInfo memory) { + return operatorRegistrations[operator]; + } + + /// @dev Returns validator registration info. + function getValidatorRegInfo(bytes calldata valPubKey) external view returns (ValidatorRegistrationInfo memory) { + return validatorRegistrations[valPubKey]; + } + + /// @dev Returns LST restaker registration info. + function getLSTRestakerRegInfo(address lstRestaker) + external view returns (LSTRestakerRegistrationInfo memory) { + return lstRestakerRegistrations[lstRestaker]; + } + + /// @dev Returns the address of AVS directory. + function avsDirectory() external view returns (address) { + return address(_eigenAVSDirectory); + } + + /// @dev Internal function to check if a validator is opted-in. + function _isValidatorOptedIn(bytes calldata valPubKey) internal view returns (bool) { + bool isValRegistered = validatorRegistrations[valPubKey].exists; + bool isFrozen = validatorRegistrations[valPubKey].freezeHeight.exists; + bool isDeregRequested = validatorRegistrations[valPubKey].deregRequestHeight.exists; + IEigenPod pod = _eigenPodManager.getPod(validatorRegistrations[valPubKey].podOwner); + bool isValActive = pod.validatorPubkeyToInfo(valPubKey).status == IEigenPod.VALIDATOR_STATUS.ACTIVE; + address delegatedOperator = _delegationManager.delegatedTo(validatorRegistrations[valPubKey].podOwner); + bool isOperatorRegistered = operatorRegistrations[delegatedOperator].exists; + return isValRegistered && !isFrozen && !isDeregRequested && isValActive && isOperatorRegistered; + } + + /// @dev Internal function to get the list of restakeable strategies. + function _getRestakeableStrategies() internal view returns (address[] memory) { + return restakeableStrategies; + } + + /// @dev Fallback function to prevent unintended contract interactions. + fallback() external payable { + revert("Invalid call"); + } + + /// @dev Receive function to prevent unintended contract interactions. + receive() external payable { + revert("Invalid call"); + } +} diff --git a/contracts/contracts/validator-registry/avs/MevCommitAVSStorage.sol b/contracts/contracts/validator-registry/avs/MevCommitAVSStorage.sol new file mode 100644 index 000000000..7bd5814e7 --- /dev/null +++ b/contracts/contracts/validator-registry/avs/MevCommitAVSStorage.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BSL 1.1 +pragma solidity ^0.8.20; + + +import {IMevCommitAVS} from "../../interfaces/IMevCommitAVS.sol"; +import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; +import {IDelegationManager} from "eigenlayer-contracts/src/contracts/interfaces/IDelegationManager.sol"; +import {IEigenPodManager} from "eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol"; +import {IStrategyManager} from "eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; +import {IAVSDirectory} from "eigenlayer-contracts/src/contracts/interfaces/IAVSDirectory.sol"; + +abstract contract MevCommitAVSStorage { + + /// @notice reference to eigenlayer core delegation manager contract + IDelegationManager internal _delegationManager; + + /// @notice reference to eigenlayer core eigenpod manager contract + IEigenPodManager internal _eigenPodManager; + + /// @notice reference to eigenlayer core strategy manager contract + IStrategyManager internal _strategyManager; + + /// @notice reference to eigenlayer core AVS directory contract + IAVSDirectory internal _eigenAVSDirectory; + + /// @notice Mapping of operator addresses to their registration info + mapping(address => IMevCommitAVS.OperatorRegistrationInfo) public operatorRegistrations; + + /// @notice Mapping of validator pubkeys to their registration info + mapping(bytes => IMevCommitAVS.ValidatorRegistrationInfo) public validatorRegistrations; + + /// @notice Mapping of LST restaker address to their registration info + mapping(address => IMevCommitAVS.LSTRestakerRegistrationInfo) public lstRestakerRegistrations; + + /// @notice List of restakeable strategy addresses + address[] public restakeableStrategies; + + /// @notice Address of the oracle responsible for freezing validators. + address public freezeOracle; + + /// @notice Fee required to unfreeze a validator. + uint256 public unfreezeFee; + + /// @notice Address that will receive unfreeze fees from frozen validators. + address public unfreezeReceiver; + + /** + * @notice Number of blocks a validator must remain frozen before it can be unfrozen. + * This is param is optional to allow frozen validators to pay the fee immediately. + */ + uint256 public unfreezePeriodBlocks; + + /// @notice Number of blocks an operator must wait after requesting deregistration before it is finalized. + uint256 public operatorDeregPeriodBlocks; + + /// @notice Number of blocks a validator must wait after requesting deregistration before it is finalized. + uint256 public validatorDeregPeriodBlocks; + + /// @notice Number of blocks a LST restaker must wait after requesting deregistration before it is finalized. + uint256 public lstRestakerDeregPeriodBlocks; +} diff --git a/contracts/contracts/validator-registry/avs/README.md b/contracts/contracts/validator-registry/avs/README.md new file mode 100644 index 000000000..31e7516bb --- /dev/null +++ b/contracts/contracts/validator-registry/avs/README.md @@ -0,0 +1,117 @@ +# Mev-commit AVS Implementation + +## Overview + +The `MevCommitAVS` contract(s) will be deployed on L1 to act as a tie-in to the eigenlayer core contracts, enabling validators to opt-in to the mev-commit protocol via restaking. It serves as the next iteration of our validator registry. Notion has a more detailed protocol design doc, whereas this doc is specific to the implementation. See the following files for current implementation: + +* [IMevCommitAVS.sol](../interfaces/IMevCommitAVS.sol) +* [MevCommitAVS.sol](./MevCommitAVS.sol) +* [MevCommitAVSStorage.sol](./MevCommitAVSStorage.sol) + +## Operator registration + +Operators will not yet be assigned concrete tasks as a part of our AVS, however they are nonetheless able to register with our AVS to abide by the `IAVSDirectory.registerOperatorToAVS` and `IAVSDirectory.deregisterOperatorFromAVS` functions that any AVS must implement. Registration is simple for Operators and only requires providing a valid signature. To deregister, Operators must first `requestOperatorDeregistration`, wait a configurable amount of blocks, then call `deregisterOperator`. No staking is required of Operators. + +Operators mainly serve the purpose of (optionally) being able to register validators on their behalf, if the relevant validator is delegated to them. Future iterations of our AVS can assign Operators required oracle tasks, as further discussed in the _Future Upgrades_ section. + +## Validator Opt-in + +Recall that a native-restaking enabled validator opting-in to mev-commit requires two steps: + +1. The validator must delegate their native stake to an Operator who's registered with the mev-commit AVS. +2. The validator must separately *register* with the mev-commit AVS, confirming their attestation to follow the rules of the protocol. + +Multiple validator public keys can be registered at once, alongside their associated eigenpod owner `podOwner` address. Note each eigenpod owner account can represent one or many restaked validators: + +```solidity +function registerValidatorsByPodOwner(bytes[] calldata valPubKeys, address podOwner); +``` + +This function stores relevant state and ensures that the provided pubkeys are indeed actively restaked with `podOwner`'s eigenPod. Note two entities are able to register validator pub keys in this way: + +1. The eigenpod owner account itself. +2. An Operator account, so long as the relevant eigenpod is delegated to that Operator. + +Note if an Operator is registering pubkeys on behalf of validators, it's expected that the Operator manages those validators itself, or represents the validators to an extent that the Operator can realistically attest to the validator following the rules of mev-commit (staking-as-a-service providers for example). This trustful relationship between validators and their delegated Operator piggybacks off already agreed upon trust assumptions with eigenlayer delegation. + +Deregistration requires calling `requestValidatorsDeregistration`, waiting a configurable amount of blocks, then calling `deregisterValidators`. These functions are similarly callable by the eigenpod owner OR delegated operator. + +## LST Restaker Registration + +LST restakers are also able to register with our avs by: + +1. Depositing into at least one strategy with eigenlayer core. +2. Delegating to an Operator who's registered with the mev-commit AVS. +3. Calling `registerLSTRestaker` with one or more chosen validator pubkey(s). + +```solidity +function registerLSTRestaker(bytes[] calldata chosenValidators) external onlyNonRegisteredLstRestaker() onlySenderWithRegisteredOperator() +``` + +LST restakers will receive points/rewards commensurate with their chosen validator(s) being opted-in over time. Nothing enforces that validators chosen by LST restakers must be "opted-in" as described above. That is, responsibility is left up to the LST restaker as to choosing validators that are, and will stay, opted-in. When an LST restaker chooses multiple validators, attribution is split evenly between the validators. + +Validator opt-in state can be queried with `isValidatorOptedIn()`. This query offers concrete criteria that must be true for an LST restaker to accrue points/rewards over time from a chosen validator. + +```solidity +function isValidatorOptedIn(bytes calldata valPubKey) returns (bool) { + bool isValRegistered = validatorRegistrations[valPubKey].exists; + bool isFrozen = validatorRegistrations[valPubKey].freezeHeight.exists; + bool isDeregRequested = validatorRegistrations[valPubKey].deregRequestHeight.exists; + IEigenPod pod = _eigenPodManager.getPod(validatorRegistrations[valPubKey].podOwner); + bool isValActive = pod.validatorPubkeyToInfo(valPubKey).status == IEigenPod.VALIDATOR_STATUS.ACTIVE; + address delegatedOperator = _delegationManager.delegatedTo(validatorRegistrations[valPubKey].podOwner); + bool isOperatorRegistered = operatorRegistrations[delegatedOperator].exists; + return isValRegistered && !isFrozen && !isDeregRequested && isValActive && isOperatorRegistered; +} +``` + +Since validators are chosen in sets, an LST restaker can only choose a new set of validators by deregistering, and registering again with the new set. This simplifies contract implementation and enforces an LST restaker is responsible for the actions of its chosen validator(s). + +Points/rewards for LST restakers would be computed off-chain, with heavy use of indexed events. As there is not an efficient on-chain mapping from each validator to the set of LST restakers who've chosen that validator. When a rewards/points system is introduced, it may consider the following information (and possibly more): + +* Opt-in state over time of the LST restaker's chosen validator(s), as defined above. +* The block height when the LST restaker registered with the AVS, requested deregistration, and/or deregistered. +* The amount and denomination of LST that the restaker delegated to a mev-commit registered Operator over time. Changes in LST delegation via the eigenlayer core contracts will affect point/reward accrual. +* Operator deregistration events, if for example an LST restaker's delegated Operator is deregistered with the mev-commit AVS. +* Correctly proposed blocks by the LST restaker's chosen validator(s). + +Deregistration requires the restaker calling `requestLSTRestakerDeregistration`, waiting a configurable amount of blocks, then calling `deregisterLSTRestaker`. + +## Freezing + +A permissioned oracle account is able to `freeze` any registered validator for acting maliciously against agreements to the mev-commit protocol: + +```solidity +function freeze(bytes calldata valPubKey) external onlyFreezeOracle(); +``` + +While frozen, a validator will not accrue points or rewards. A validator cannot deregister from the AVS while frozen. + +To exit the frozen state, a configurable unfreeze period must first pass. Then any account can call `unfreeze`: + +```solidity +function unfreeze(bytes[] calldata valPubKey) payable external; +``` + +where a minimum of `unfreezeFee` must be included in the transaction. If the validator was in the `REQUESTED_DEREGISTRATION` state prior to being frozen, the validator will be returned to the `REGISTERED` state. That is, a validator must *not* be frozen for a full deregistration period, before it's able to deregister. + +The points/rewards for LST restakers will consider freeze related events. However, LST restakers are allowed to deregister from the AVS even if any of their chosen validator(s) are frozen. + +Freezing is the mechanism that punishes a validator prior to eigenlayer core contracts having slashing. For now freezing corresponds to a public, reputational slash for the validator (and relevant LST restakers), and a lack of potential points accrual. + +## Design Intentions + +When looking through this design doc one may ask, _why do validators and LST restakers have to delegate to an Operator through the eigenlayer core contracts, AND separately register with the AVS contract?_ + +The answer is that **stakers** are the L1 entities that enable credible commitments through our AVS, not Operators. It would be challenging to slash/freeze entirely through Operators, in that an Operator can potentially represent thousands of validators and LST restakers from different organizations, home-staking setups, etc. + +Further, we need some sort of explicit mechanism for **stakers** (not Operators) to attest to following the rules of mev-commit, at the risk of being slashed. Eigenlayer's current design does not offer this on a per-AVS basis. + +## Future Upgrades + +* Operators could be given the task of replacing the oracle service that currently freezes (or will eventually slash) validators. This could rely on honest Operator majority, or a multi-tier slashing system where EIGEN holders are able to slash Operators, while the Operator set is able to slash validators. +* Operators could further be required to run a validator node for the existing mev-commit chain, an evm sidechain which manages preconf settlement. Thus decentralizing preconf settlement. + +## Open Questions + +* Will upcoming Eigenlayer upgrades allow for slashing stakers (validators or LST restakers) directly? Or will Operators be the only slashable entities? If the latter is true, our AVS design will need to drastically change, and may necessitate more complexity. diff --git a/contracts/lib/eigenlayer-contracts b/contracts/lib/eigenlayer-contracts new file mode 160000 index 000000000..a888a1cd1 --- /dev/null +++ b/contracts/lib/eigenlayer-contracts @@ -0,0 +1 @@ +Subproject commit a888a1cd1479438dda4b138245a69177b125a973 diff --git a/contracts/remappings.txt b/contracts/remappings.txt index a5b554454..66962a5d2 100644 --- a/contracts/remappings.txt +++ b/contracts/remappings.txt @@ -4,3 +4,4 @@ ds-test/=lib/forge-std/lib/ds-test/src/ erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/ forge-std/=lib/forge-std/src/ @openzeppelin-contracts/=lib/openzeppelin-contracts/ +eigenlayer-contracts/=lib/eigenlayer-contracts/ diff --git a/contracts/scripts/validator-registry/avs/ReleaseAddrConsts.sol b/contracts/scripts/validator-registry/avs/ReleaseAddrConsts.sol new file mode 100644 index 000000000..23ff0c0e0 --- /dev/null +++ b/contracts/scripts/validator-registry/avs/ReleaseAddrConsts.sol @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +// TODO: Confirm every addr here with the markdown + +/// @notice Constants from https://github.com/Layr-Labs/eigenlayer-contracts?tab=readme-ov-file#deployments +library EigenMainnetReleaseConsts { + + address internal constant DELEGATION_MANAGER = 0x39053D51B77DC0d36036Fc1fCc8Cb819df8Ef37A; + address internal constant STRATEGY_MANAGER = 0x858646372CC42E1A627fcE94aa7A7033e7CF075A; + address internal constant EIGENPOD_MANAGER = 0x91E677b07F7AF907ec9a428aafA9fc14a0d3A338; + address internal constant AVS_DIRECTORY = 0x135DDa560e946695d6f155dACaFC6f1F25C1F5AF; + address internal constant SLASHER = 0xD92145c07f8Ed1D392c1B88017934E301CC1c3Cd; + + address internal constant STRATEGY_BASE_CBETH = 0x54945180dB7943c0ed0FEE7EdaB2Bd24620256bc; + address internal constant STRATEGY_BASE_STETH = 0x93c4b944D05dfe6df7645A86cd2206016c51564D; + address internal constant STRATEGY_BASE_RETH = 0x1BeE69b7dFFfA4E2d53C2a2Df135C388AD25dCD2; + address internal constant STRATEGY_BASE_ETHX = 0x9d7eD45EE2E8FC5482fa2428f15C971e6369011d; + address internal constant STRATEGY_BASE_ANKRETH = 0x13760F50a9d7377e4F20CB8CF9e4c26586c658ff; + address internal constant STRATEGY_BASE_OETH = 0xa4C637e0F704745D182e4D38cAb7E7485321d059; + address internal constant STRATEGY_BASE_OSETH = 0x57ba429517c3473B6d34CA9aCd56c0e735b94c02; + address internal constant STRATEGY_BASE_SWETH = 0x0Fe4F44beE93503346A3Ac9EE5A26b130a5796d6; + address internal constant STRATEGY_BASE_WBETH = 0x7CA911E83dabf90C90dD3De5411a10F1A6112184; + address internal constant STRATEGY_BASE_SFRXETH = 0x8CA7A5d6f3acd3A7A8bC468a8CD0FB14B6BD28b6; + address internal constant STRATEGY_BASE_LSETH = 0xAe60d8180437b5C34bB956822ac2710972584473; + address internal constant STRATEGY_BASE_METH = 0x298aFB19A105D59E74658C4C334Ff360BadE6dd2; + address internal constant BEACON_CHAIN_ETH = 0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0; +} + +/// @notice Constants from https://github.com/Layr-Labs/eigenlayer-contracts?tab=readme-ov-file#current-testnet-deployment +library EigenHoleskyReleaseConsts { + + address internal constant DELEGATION_MANAGER = 0xA44151489861Fe9e3055d95adC98FbD462B948e7; + address internal constant STRATEGY_MANAGER = 0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6; + address internal constant EIGENPOD_MANAGER = 0x30770d7E3e71112d7A6b7259542D1f680a70e315; + address internal constant AVS_DIRECTORY = 0x055733000064333CaDDbC92763c58BF0192fFeBf; + address internal constant SLASHER = 0xcAe751b75833ef09627549868A04E32679386e7C; + address internal constant REWARDS_COORDINATOR = 0xAcc1fb458a1317E886dB376Fc8141540537E68fE; + + address internal constant STRATEGY_BASE_CBETH = 0x70EB4D3c164a6B4A5f908D4FBb5a9cAfFb66bAB6; + address internal constant STRATEGY_BASE_STETH = 0x7D704507b76571a51d9caE8AdDAbBFd0ba0e63d3; + address internal constant STRATEGY_BASE_RETH = 0x3A8fBdf9e77DFc25d09741f51d3E181b25d0c4E0; + address internal constant STRATEGY_BASE_ETHX = 0x31B6F59e1627cEfC9fA174aD03859fC337666af7; + address internal constant STRATEGY_BASE_ANKRETH = 0x7673a47463F80c6a3553Db9E54c8cDcd5313d0ac; + address internal constant STRATEGY_BASE_OETH = 0x80528D6e9A2BAbFc766965E0E26d5aB08D9CFaF9; + address internal constant STRATEGY_BASE_OSETH = 0x46281E3B7fDcACdBa44CADf069a94a588Fd4C6Ef; + address internal constant STRATEGY_BASE_SWETH = 0x9281ff96637710Cd9A5CAcce9c6FAD8C9F54631c; + address internal constant STRATEGY_BASE_WBETH = 0x80528D6e9A2BAbFc766965E0E26d5aB08D9CFaF9; + address internal constant STRATEGY_BASE_SFRXETH = 0x9281ff96637710Cd9A5CAcce9c6FAD8C9F54631c; + address internal constant STRATEGY_BASE_LSETH = 0x05037A81BD7B4C9E0F7B430f1F2A22c31a2FD943; + address internal constant STRATEGY_BASE_METH = 0x05037A81BD7B4C9E0F7B430f1F2A22c31a2FD943; + address internal constant BEACON_CHAIN_ETH = 0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0; +} diff --git a/contracts/test/validator-registry/avs/AVSDirectoryMock.sol b/contracts/test/validator-registry/avs/AVSDirectoryMock.sol new file mode 100644 index 000000000..950fefb7f --- /dev/null +++ b/contracts/test/validator-registry/avs/AVSDirectoryMock.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BSL 1.1 +pragma solidity ^0.8.20; + +import "forge-std/Test.sol"; +import {IAVSDirectory} from "eigenlayer-contracts/src/contracts/interfaces/IAVSDirectory.sol"; +import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; + +// Eigenlayer core does not define their own mock for AVSDirectory.sol, hence we define our own. +contract AVSDirectoryMock is IAVSDirectory, Test { + mapping(address => bool) public isOperatorRegistered; + + function registerOperator(address operator) external { + isOperatorRegistered[operator] = true; + } + + function deregisterOperator(address operator) external { + isOperatorRegistered[operator] = false; + } + + function isRegisteredOperator(address operator) external view returns (bool) { + return isOperatorRegistered[operator]; + } + + function registerOperatorToAVS( + address operator, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external override { + require(operator != address(0), "Operator cannot be zero"); + require(operatorSignature.salt != bytes32(0), "Salt cannot be zero"); + isOperatorRegistered[operator] = true; + emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.REGISTERED); + } + + function deregisterOperatorFromAVS(address operator) external override { + isOperatorRegistered[operator] = false; + emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.UNREGISTERED); + } + + function updateAVSMetadataURI(string calldata metadataURI) external override { + emit AVSMetadataURIUpdated(msg.sender, metadataURI); + } + + function operatorSaltIsSpent(address operator, bytes32 salt) external pure override returns (bool) { + require(operator != address(0), "Operator cannot be zero"); + require(salt != bytes32(0), "Salt cannot be zero"); + return false; + } + + function calculateOperatorAVSRegistrationDigestHash( + address operator, + address avs, + bytes32 salt, + uint256 expiry + ) external pure override returns (bytes32) { + return keccak256(abi.encodePacked(operator, avs, salt, expiry)); + } + + function OPERATOR_AVS_REGISTRATION_TYPEHASH() external pure override returns (bytes32) { + return keccak256("OperatorAVSRegistration(address operator,address avs,bytes32 salt,uint256 expiry)"); + } +} diff --git a/contracts/test/validator-registry/avs/EigenPodManagerMock.sol b/contracts/test/validator-registry/avs/EigenPodManagerMock.sol new file mode 100644 index 000000000..9e1611504 --- /dev/null +++ b/contracts/test/validator-registry/avs/EigenPodManagerMock.sol @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.9; + +import "forge-std/Test.sol"; +import {EigenPodMock} from "./EigenPodMock.sol"; +import {IEigenPodManager} from "eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol"; +import {IEigenPod} from "eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol"; +import {IStrategy} from "eigenlayer-contracts/src/contracts/interfaces/IStrategy.sol"; +import "@openzeppelin/contracts/proxy/beacon/IBeacon.sol"; +import {IBeaconChainOracle} from "eigenlayer-contracts/src/contracts/interfaces/IBeaconChainOracle.sol"; +import {IETHPOSDeposit} from "eigenlayer-contracts/src/contracts/interfaces/IETHPOSDeposit.sol"; +import {ISlasher} from "eigenlayer-contracts/src/contracts/interfaces/ISlasher.sol"; +import {IStrategyManager} from "eigenlayer-contracts/src/contracts/interfaces/IStrategyManager.sol"; +import {IPauserRegistry} from "eigenlayer-contracts/src/contracts/interfaces/IPauserRegistry.sol"; + +// Similar to eigenlayer core's EigenPodManagerMock but their mocks don't use virtual functions. +contract EigenPodManagerMock is IEigenPodManager, Test { + + mapping(address => EigenPodMock) public pods; + + function setMockPod(address podOwner, EigenPodMock pod) external { + pods[podOwner] = pod; + } + + function getPod(address podOwner) external view returns(IEigenPod) { + return pods[podOwner]; + } + + IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); + + IBeacon public eigenPodBeacon; + + IETHPOSDeposit public ethPOS; + + mapping(address => int256) public podShares; + + function slasher() external view returns(ISlasher) {} + + function createPod() external returns(address) {} + + function stake(bytes calldata /*pubkey*/, bytes calldata /*signature*/, bytes32 /*depositDataRoot*/) external payable {} + + function recordBeaconChainETHBalanceUpdate(address /*podOwner*/, int256 /*sharesDelta*/) external pure {} + + function updateBeaconChainOracle(IBeaconChainOracle /*newBeaconChainOracle*/) external pure {} + + function ownerToPod(address /*podOwner*/) external pure returns(IEigenPod) { + return IEigenPod(address(0)); + } + + function beaconChainOracle() external pure returns(IBeaconChainOracle) { + return IBeaconChainOracle(address(0)); + } + + function getBlockRootAtTimestamp(uint64 /*timestamp*/) external pure returns(bytes32) { + return bytes32(0); + } + + function strategyManager() external pure returns(IStrategyManager) { + return IStrategyManager(address(0)); + } + + function hasPod(address /*podOwner*/) external pure returns (bool) { + return false; + } + + function pause(uint256 /*newPausedStatus*/) external{} + + function pauseAll() external{} + + function paused() external pure returns (uint256) { + return 0; + } + + function paused(uint8 /*index*/) external pure returns (bool) { + return false; + } + + function setPauserRegistry(IPauserRegistry /*newPauserRegistry*/) external {} + + function pauserRegistry() external pure returns (IPauserRegistry) { + return IPauserRegistry(address(0)); + } + + function unpause(uint256 /*newPausedStatus*/) external{} + + function podOwnerShares(address podOwner) external view returns (int256) { + return podShares[podOwner]; + } + + function setPodOwnerShares(address podOwner, int256 shares) external { + podShares[podOwner] = shares; + } + + function addShares(address /*podOwner*/, uint256 shares) external pure returns (uint256) { + // this is the "increase in delegateable tokens" + return (shares); + } + + function withdrawSharesAsTokens(address podOwner, address destination, uint256 shares) external {} + + function removeShares(address podOwner, uint256 shares) external {} + + function numPods() external view returns (uint256) {} + + function denebForkTimestamp() external pure returns (uint64) { + return type(uint64).max; + } + + function setDenebForkTimestamp(uint64 timestamp) external{} +} \ No newline at end of file diff --git a/contracts/test/validator-registry/avs/EigenPodMock.sol b/contracts/test/validator-registry/avs/EigenPodMock.sol new file mode 100644 index 000000000..8275200e5 --- /dev/null +++ b/contracts/test/validator-registry/avs/EigenPodMock.sol @@ -0,0 +1,81 @@ +// SPDX-License-Identifier: BSL 1.1 +pragma solidity ^0.8.20; + +import "forge-std/Test.sol"; +import "eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol"; +import {IEigenPodManager} from "eigenlayer-contracts/src/contracts/interfaces/IEigenPodManager.sol"; + +// Similar to eigenlayer core's EigenPodMock but their mocks don't use virtual functions. +contract EigenPodMock is IEigenPod, Test { + mapping(bytes => ValidatorInfo) public validatorInfo; + + function setMockValidatorInfo(bytes memory validatorPubkey, ValidatorInfo memory info) external { + validatorInfo[validatorPubkey] = info; + } + + function validatorPubkeyToInfo(bytes memory validatorPubkey) + external view virtual override returns(ValidatorInfo memory) { + return validatorInfo[validatorPubkey]; + } + + function MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR() external view returns(uint64) {} + + function nonBeaconChainETHBalanceWei() external view returns(uint256) {} + + function withdrawableRestakedExecutionLayerGwei() external view returns(uint64) {} + + function initialize(address owner) external {} + + function stake(bytes calldata pubkey, bytes calldata signature, bytes32 depositDataRoot) external payable {} + + function withdrawRestakedBeaconChainETH(address recipient, uint256 amount) external {} + + function eigenPodManager() external view returns (IEigenPodManager) {} + + function podOwner() external view returns (address) {} + + function hasRestaked() external view returns (bool) {} + + function mostRecentWithdrawalTimestamp() external view returns (uint64) {} + + function validatorPubkeyHashToInfo(bytes32 validatorPubkeyHash) external view returns (ValidatorInfo memory) {} + + function provenWithdrawal(bytes32 validatorPubkeyHash, uint64 slot) external view returns (bool) {} + + function validatorStatus(bytes32 pubkeyHash) external view returns(VALIDATOR_STATUS) {} + + function verifyWithdrawalCredentials( + uint64 oracleTimestamp, + BeaconChainProofs.StateRootProof calldata stateRootProof, + uint40[] calldata validatorIndices, + bytes[] calldata withdrawalCredentialProofs, + bytes32[][] calldata validatorFields + ) external {} + + function verifyBalanceUpdates( + uint64 oracleTimestamp, + uint40[] calldata validatorIndices, + BeaconChainProofs.StateRootProof calldata stateRootProof, + bytes[] calldata validatorFieldsProofs, + bytes32[][] calldata validatorFields + ) external {} + + function verifyAndProcessWithdrawals( + uint64 oracleTimestamp, + BeaconChainProofs.StateRootProof calldata stateRootProof, + BeaconChainProofs.WithdrawalProof[] calldata withdrawalProofs, + bytes[] calldata validatorFieldsProofs, + bytes32[][] calldata validatorFields, + bytes32[][] calldata withdrawalFields + ) external {} + + function activateRestaking() external {} + + function withdrawBeforeRestaking() external {} + + function withdrawNonBeaconChainETHBalanceWei(address recipient, uint256 amountToWithdraw) external {} + + function recoverTokens(IERC20[] memory tokenList, uint256[] memory amountsToWithdraw, address recipient) external {} + + function validatorStatus(bytes calldata pubkey) external view returns (VALIDATOR_STATUS){} +} diff --git a/contracts/test/validator-registry/avs/MevCommitAVSTest.sol b/contracts/test/validator-registry/avs/MevCommitAVSTest.sol new file mode 100644 index 000000000..f41c23f21 --- /dev/null +++ b/contracts/test/validator-registry/avs/MevCommitAVSTest.sol @@ -0,0 +1,932 @@ +// SPDX-License-Identifier: BSL 1.1 +pragma solidity ^0.8.20; + +import "forge-std/Test.sol"; +import "../../../contracts/validator-registry/avs/MevCommitAVS.sol"; +import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; +import {Upgrades} from "openzeppelin-foundry-upgrades/Upgrades.sol"; +import {ISignatureUtils} from "eigenlayer-contracts/src/contracts/interfaces/ISignatureUtils.sol"; +import {StrategyManagerMock} from "eigenlayer-contracts/src/test/mocks/StrategyManagerMock.sol"; +import {DelegationManagerMock} from "eigenlayer-contracts/src/test/mocks/DelegationManagerMock.sol"; +import {EigenPodManagerMock} from "./EigenPodManagerMock.sol"; +import {EigenPodMock} from "./EigenPodMock.sol"; +import {IEigenPod} from "eigenlayer-contracts/src/contracts/interfaces/IEigenPod.sol"; +import {AVSDirectoryMock} from "./AVSDirectoryMock.sol"; + +contract MevCommitAVSTest is Test { + MevCommitAVS public mevCommitAVS; + + address public owner; + StrategyManagerMock public strategyManagerMock; + DelegationManagerMock public delegationManagerMock; + EigenPodManagerMock public eigenPodManagerMock; + AVSDirectoryMock public avsDirectoryMock; + address[] public restakeableStrategies; + address public freezeOracle; + uint256 public unfreezeFee; + address public unfreezeReceiver; + uint256 public unfreezePeriodBlocks; + uint256 public operatorDeregPeriodBlocks; + uint256 public validatorDeregPeriodBlocks; + uint256 public lstRestakerDeregPeriodBlocks; + string public metadataUrl; + + event OperatorRegistered(address indexed operator); + event OperatorDeregistrationRequested(address indexed operator); + event OperatorDeregistered(address indexed operator); + event ValidatorRegistered(bytes indexed validatorPubKey, address indexed podOwner); + event ValidatorDeregistrationRequested(bytes indexed validatorPubKey, address indexed podOwner); + event ValidatorDeregistered(bytes indexed validatorPubKey, address indexed podOwner); + event LSTRestakerRegistered(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker); + event LSTRestakerDeregistrationRequested(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker); + event LSTRestakerDeregistered(bytes indexed chosenValidator, uint256 numChosen, address indexed lstRestaker); + event ValidatorFrozen(bytes indexed validatorPubKey, address indexed podOwner); + event ValidatorUnfrozen(bytes indexed validatorPubKey, address indexed podOwner); + event AVSDirectorySet(address indexed avsDirectory); + event StrategyManagerSet(address indexed strategyManager); + event DelegationManagerSet(address indexed delegationManager); + event EigenPodManagerSet(address indexed eigenPodManager); + event RestakeableStrategiesSet(address[] indexed restakeableStrategies); + event FreezeOracleSet(address indexed freezeOracle); + event UnfreezeFeeSet(uint256 unfreezeFee); + event UnfreezeReceiverSet(address indexed unfreezeReceiver); + event UnfreezePeriodBlocksSet(uint256 unfreezePeriodBlocks); + event OperatorDeregPeriodBlocksSet(uint256 operatorDeregPeriodBlocks); + event ValidatorDeregPeriodBlocksSet(uint256 validatorDeregPeriodBlocks); + event LSTRestakerDeregPeriodBlocksSet(uint256 lstRestakerDeregPeriodBlocks); + + function setUp() public { + owner = address(0x123456); + strategyManagerMock = new StrategyManagerMock(); + delegationManagerMock = new DelegationManagerMock(); + eigenPodManagerMock = new EigenPodManagerMock(); + avsDirectoryMock = new AVSDirectoryMock(); + restakeableStrategies = [address(0x1), address(0x2), address(0x3)]; + freezeOracle = address(0x5); + unfreezeFee = 1 ether; + unfreezeReceiver = address(0x6); + unfreezePeriodBlocks = 100; + operatorDeregPeriodBlocks = 200; + validatorDeregPeriodBlocks = 300; + lstRestakerDeregPeriodBlocks = 400; + metadataUrl = "https://raw.githubusercontent.com/primev/mev-commit/main/static/avs-metadata.json"; + + address proxy = Upgrades.deployUUPSProxy( + "MevCommitAVS.sol", + abi.encodeCall(MevCommitAVS.initialize, ( + owner, + delegationManagerMock, + eigenPodManagerMock, + strategyManagerMock, + avsDirectoryMock, + restakeableStrategies, + freezeOracle, + unfreezeFee, + unfreezeReceiver, + unfreezePeriodBlocks, + operatorDeregPeriodBlocks, + validatorDeregPeriodBlocks, + lstRestakerDeregPeriodBlocks, + metadataUrl + )) + ); + mevCommitAVS = MevCommitAVS(payable(proxy)); + } + + function testRegisterOperator() public { + + address operator = address(0x888); + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = ISignatureUtils.SignatureWithSaltAndExpiry({ + signature: bytes("signature"), + salt: bytes32("salt"), + expiry: block.timestamp + 1 days + }); + + vm.prank(owner); + mevCommitAVS.pause(); + vm.expectRevert(PausableUpgradeable.EnforcedPause.selector); + vm.prank(operator); + mevCommitAVS.registerOperator(operatorSignature); + vm.prank(owner); + mevCommitAVS.unpause(); + + vm.expectRevert("sender must be an eigenlayer operator"); + vm.prank(operator); + mevCommitAVS.registerOperator(operatorSignature); + + delegationManagerMock.setIsOperator(operator, true); + + vm.expectEmit(true, true, true, true); + emit OperatorRegistered(operator); + vm.prank(operator); + mevCommitAVS.registerOperator(operatorSignature); + + IMevCommitAVS.OperatorRegistrationInfo memory reg = mevCommitAVS.getOperatorRegInfo(operator); + assertTrue(reg.exists); + assertFalse(reg.deregRequestHeight.exists); + + vm.expectRevert("sender must not be registered operator"); + vm.prank(operator); + mevCommitAVS.registerOperator(operatorSignature); + } + + function testRequestOperatorDeregistration() public { + vm.roll(108); + + address operator = address(0x888); + + vm.prank(owner); + mevCommitAVS.pause(); + vm.expectRevert(PausableUpgradeable.EnforcedPause.selector); + vm.prank(operator); + mevCommitAVS.requestOperatorDeregistration(operator); + vm.prank(owner); + mevCommitAVS.unpause(); + + vm.expectRevert("operator must be registered"); + vm.prank(operator); + mevCommitAVS.requestOperatorDeregistration(operator); + + testRegisterOperator(); + + address otherAcct = address(0x777); + vm.expectRevert("sender must be operator"); + vm.prank(otherAcct); + mevCommitAVS.requestOperatorDeregistration(operator); + + IMevCommitAVS.OperatorRegistrationInfo memory reg = mevCommitAVS.getOperatorRegInfo(operator); + assertTrue(reg.exists); + assertFalse(reg.deregRequestHeight.exists); + + vm.expectEmit(true, true, true, true); + emit OperatorDeregistrationRequested(operator); + vm.prank(operator); + mevCommitAVS.requestOperatorDeregistration(operator); + + reg = mevCommitAVS.getOperatorRegInfo(operator); + assertTrue(reg.exists); + assertTrue(reg.deregRequestHeight.exists); + assertEq(reg.deregRequestHeight.blockHeight, 108); + + vm.expectRevert("operator must not have already requested deregistration"); + vm.prank(operator); + mevCommitAVS.requestOperatorDeregistration(operator); + } + + function testDeregisterOperator() public { + vm.roll(11); + + address operator = address(0x888); + + vm.prank(owner); + mevCommitAVS.pause(); + vm.expectRevert(PausableUpgradeable.EnforcedPause.selector); + vm.prank(operator); + mevCommitAVS.deregisterOperator(operator); + vm.prank(owner); + mevCommitAVS.unpause(); + + vm.expectRevert("operator must be registered"); + vm.prank(operator); + mevCommitAVS.deregisterOperator(operator); + + testRegisterOperator(); + + address otherAcct = address(0x777); + vm.expectRevert("sender must be operator"); + vm.prank(otherAcct); + mevCommitAVS.deregisterOperator(operator); + + vm.expectRevert("operator must have requested deregistration"); + vm.prank(operator); + mevCommitAVS.deregisterOperator(operator); + + vm.prank(operator); + mevCommitAVS.requestOperatorDeregistration(operator); + + vm.expectRevert("deregistration must happen at least operatorDeregPeriodBlocks after deregistration request height"); + vm.prank(operator); + mevCommitAVS.deregisterOperator(operator); + + IMevCommitAVS.OperatorRegistrationInfo memory operatorRegInfo = mevCommitAVS.getOperatorRegInfo(operator); + assertTrue(operatorRegInfo.exists); + assertTrue(operatorRegInfo.deregRequestHeight.exists); + assertEq(operatorRegInfo.deregRequestHeight.blockHeight, 11); + + avsDirectoryMock.registerOperator(operator); + + vm.roll(11 + operatorDeregPeriodBlocks); + + vm.expectEmit(true, true, true, true); + emit OperatorDeregistered(operator); + vm.prank(operator); + mevCommitAVS.deregisterOperator(operator); + assertFalse(avsDirectoryMock.isRegisteredOperator(operator)); + + operatorRegInfo = mevCommitAVS.getOperatorRegInfo(operator); + assertFalse(operatorRegInfo.exists); + assertFalse(operatorRegInfo.deregRequestHeight.exists); + assertEq(operatorRegInfo.deregRequestHeight.blockHeight, 0); + } + + function testRegisterValidatorsByPodOwners() public { + vm.roll(55); + + address operator = address(0x888); + address podOwner = address(0x420); + ISignatureUtils.SignatureWithExpiry memory sig = ISignatureUtils.SignatureWithExpiry({ + signature: bytes("signature"), + expiry: 10 + }); + vm.prank(podOwner); + delegationManagerMock.delegateTo(operator, sig, bytes32("salt")); + + bytes[] memory valPubkeys = new bytes[](2); + valPubkeys[0] = bytes("valPubkey1"); + valPubkeys[1] = bytes("valPubkey2"); + bytes[][] memory arrayValPubkeys = new bytes[][](1); + arrayValPubkeys[0] = valPubkeys; + address[] memory podOwners = new address[](1); + podOwners[0] = podOwner; + + address otherAcct = address(0x777); + + vm.prank(owner); + mevCommitAVS.pause(); + vm.expectRevert(PausableUpgradeable.EnforcedPause.selector); + vm.prank(otherAcct); + mevCommitAVS.registerValidatorsByPodOwners(arrayValPubkeys, podOwners); + vm.prank(owner); + mevCommitAVS.unpause(); + + vm.expectRevert("sender must be podOwner or delegated operator"); + vm.prank(otherAcct); + mevCommitAVS.registerValidatorsByPodOwners(arrayValPubkeys, podOwners); + + vm.expectRevert("delegated operator must be registered with MevCommitAVS"); + vm.prank(podOwner); + mevCommitAVS.registerValidatorsByPodOwners(arrayValPubkeys, podOwners); + + testRegisterOperator(); + + EigenPodMock mockPod = new EigenPodMock(); + mockPod.setMockValidatorInfo(valPubkeys[0], IEigenPod.ValidatorInfo({ + validatorIndex: 1, + restakedBalanceGwei: 1, + mostRecentBalanceUpdateTimestamp: 1, + status: IEigenPod.VALIDATOR_STATUS.INACTIVE + })); + eigenPodManagerMock.setMockPod(podOwner, mockPod); + + vm.expectRevert("validator must be active under pod"); + vm.prank(podOwner); + mevCommitAVS.registerValidatorsByPodOwners(arrayValPubkeys, podOwners); + + mockPod.setMockValidatorInfo(valPubkeys[0], IEigenPod.ValidatorInfo({ + validatorIndex: 1, + restakedBalanceGwei: 1, + mostRecentBalanceUpdateTimestamp: 1, + status: IEigenPod.VALIDATOR_STATUS.ACTIVE + })); + + mockPod.setMockValidatorInfo(valPubkeys[1], IEigenPod.ValidatorInfo({ + validatorIndex: 2, + restakedBalanceGwei: 1, + mostRecentBalanceUpdateTimestamp: 1, + status: IEigenPod.VALIDATOR_STATUS.ACTIVE + })); + + IMevCommitAVS.ValidatorRegistrationInfo memory regInfo0 = mevCommitAVS.getValidatorRegInfo(valPubkeys[0]); + IMevCommitAVS.ValidatorRegistrationInfo memory regInfo1 = mevCommitAVS.getValidatorRegInfo(valPubkeys[1]); + assertFalse(regInfo0.exists); + assertFalse(regInfo1.exists); + assertEq(regInfo0.podOwner, address(0)); + assertEq(regInfo1.podOwner, address(0)); + assertFalse(regInfo0.freezeHeight.exists); + assertFalse(regInfo1.freezeHeight.exists); + assertFalse(regInfo0.deregRequestHeight.exists); + assertFalse(regInfo1.deregRequestHeight.exists); + + vm.expectEmit(true, true, true, true); + emit ValidatorRegistered(valPubkeys[0], podOwner); + vm.expectEmit(true, true, true, true); + emit ValidatorRegistered(valPubkeys[1], podOwner); + vm.prank(podOwner); + mevCommitAVS.registerValidatorsByPodOwners(arrayValPubkeys, podOwners); + + regInfo0 = mevCommitAVS.getValidatorRegInfo(valPubkeys[0]); + regInfo1 = mevCommitAVS.getValidatorRegInfo(valPubkeys[1]); + assertTrue(regInfo0.exists); + assertTrue(regInfo1.exists); + assertEq(regInfo0.podOwner, podOwner); + assertEq(regInfo1.podOwner, podOwner); + assertFalse(regInfo0.freezeHeight.exists); + assertFalse(regInfo1.freezeHeight.exists); + assertFalse(regInfo0.deregRequestHeight.exists); + assertFalse(regInfo1.deregRequestHeight.exists); + + vm.expectRevert("validator must not be registered"); + vm.prank(podOwner); + mevCommitAVS.registerValidatorsByPodOwners(arrayValPubkeys, podOwners); + } + + function testRequestValidatorsDeregistration() public { + + address operator = address(0x888); + address podOwner = address(0x420); + + bytes[] memory valPubkeys = new bytes[](2); + valPubkeys[0] = bytes("valPubkey1"); + valPubkeys[1] = bytes("valPubkey2"); + + vm.prank(owner); + mevCommitAVS.pause(); + vm.expectRevert(PausableUpgradeable.EnforcedPause.selector); + vm.prank(podOwner); + mevCommitAVS.requestValidatorsDeregistration(valPubkeys); + vm.prank(owner); + mevCommitAVS.unpause(); + + vm.expectRevert("validator must be registered"); + vm.prank(podOwner); + mevCommitAVS.requestValidatorsDeregistration(valPubkeys); + + testRegisterValidatorsByPodOwners(); + vm.roll(103); + + vm.expectEmit(true, true, true, true); + emit ValidatorDeregistrationRequested(valPubkeys[0], podOwner); + bytes[] memory valPubkeys2 = new bytes[](1); + valPubkeys2[0] = bytes("valPubkey1"); + vm.prank(podOwner); + mevCommitAVS.requestValidatorsDeregistration(valPubkeys2); + + vm.expectEmit(true, true, true, true); + emit ValidatorDeregistrationRequested(valPubkeys[1], podOwner); + bytes[] memory valPubkeys3 = new bytes[](1); + valPubkeys3[0] = bytes("valPubkey2"); + vm.prank(operator); + mevCommitAVS.requestValidatorsDeregistration(valPubkeys3); + + IMevCommitAVS.ValidatorRegistrationInfo memory regInfo0 = mevCommitAVS.getValidatorRegInfo(valPubkeys[0]); + IMevCommitAVS.ValidatorRegistrationInfo memory regInfo1 = mevCommitAVS.getValidatorRegInfo(valPubkeys[1]); + assertTrue(regInfo0.exists); + assertTrue(regInfo1.exists); + assertEq(regInfo0.podOwner, podOwner); + assertEq(regInfo1.podOwner, podOwner); + assertTrue(regInfo0.deregRequestHeight.exists); + assertTrue(regInfo1.deregRequestHeight.exists); + assertEq(regInfo0.deregRequestHeight.blockHeight, 103); + assertEq(regInfo1.deregRequestHeight.blockHeight, 103); + assertFalse(regInfo0.freezeHeight.exists); + assertFalse(regInfo1.freezeHeight.exists); + + vm.expectRevert("validator must not have already requested deregistration"); + vm.prank(podOwner); + mevCommitAVS.requestValidatorsDeregistration(valPubkeys); + } + + function testDeregisterValidator() public { + + address operator = address(0x888); + address podOwner = address(0x420); + bytes[] memory valPubkeys = new bytes[](1); + valPubkeys[0] = bytes("valPubkey1"); + + vm.prank(owner); + mevCommitAVS.pause(); + vm.expectRevert(PausableUpgradeable.EnforcedPause.selector); + vm.prank(podOwner); + mevCommitAVS.deregisterValidators(valPubkeys); + vm.prank(owner); + mevCommitAVS.unpause(); + + vm.expectRevert("validator must be registered"); + vm.prank(podOwner); + mevCommitAVS.deregisterValidators(valPubkeys); + + testRegisterValidatorsByPodOwners(); + + address otherAcct = address(0x777); + vm.expectRevert("sender must be podOwner or delegated operator of validator"); + vm.prank(otherAcct); + mevCommitAVS.deregisterValidators(valPubkeys); + + vm.expectRevert("validator must have requested deregistration"); + vm.prank(podOwner); + mevCommitAVS.deregisterValidators(valPubkeys); + + bytes[] memory valPubkeys2 = new bytes[](2); + valPubkeys2[0] = bytes("valPubkey1"); + valPubkeys2[1] = bytes("valPubkey2"); + vm.prank(podOwner); + mevCommitAVS.requestValidatorsDeregistration(valPubkeys2); + + IMevCommitAVS.ValidatorRegistrationInfo memory regInfo0 = mevCommitAVS.getValidatorRegInfo(valPubkeys2[0]); + IMevCommitAVS.ValidatorRegistrationInfo memory regInfo1 = mevCommitAVS.getValidatorRegInfo(valPubkeys2[1]); + assertTrue(regInfo0.deregRequestHeight.exists); + assertTrue(regInfo1.deregRequestHeight.exists); + + vm.expectRevert("deregistration must happen at least validatorDeregPeriodBlocks after deregistration request height"); + vm.prank(operator); + mevCommitAVS.deregisterValidators(valPubkeys2); + + vm.roll(103 + validatorDeregPeriodBlocks); + vm.expectEmit(true, true, true, true); + emit ValidatorDeregistered(valPubkeys2[0], podOwner); + vm.expectEmit(true, true, true, true); + emit ValidatorDeregistered(valPubkeys2[1], podOwner); + vm.prank(operator); + mevCommitAVS.deregisterValidators(valPubkeys2); + + regInfo0 = mevCommitAVS.getValidatorRegInfo(valPubkeys2[0]); + regInfo1 = mevCommitAVS.getValidatorRegInfo(valPubkeys2[1]); + assertFalse(regInfo0.exists); + assertFalse(regInfo1.exists); + } + + function testRegisterLSTRestaker() public { + + address operator = address(0x888); + address lstRestaker = address(0x34443); + address otherAcct = address(0x777); + bytes[] memory chosenVals = new bytes[](0); + + vm.prank(owner); + mevCommitAVS.pause(); + vm.expectRevert(PausableUpgradeable.EnforcedPause.selector); + vm.prank(lstRestaker); + mevCommitAVS.registerLSTRestaker(chosenVals); + vm.prank(owner); + mevCommitAVS.unpause(); + + vm.expectRevert("sender must be delegated to an operator that is registered with MevCommitAVS"); + vm.prank(otherAcct); + mevCommitAVS.registerLSTRestaker(chosenVals); + + testRegisterValidatorsByPodOwners(); + + ISignatureUtils.SignatureWithExpiry memory sig = ISignatureUtils.SignatureWithExpiry({ + signature: bytes("signature"), + expiry: 10 + }); + vm.prank(lstRestaker); + delegationManagerMock.delegateTo(operator, sig, bytes32("salt")); + + vm.expectRevert("LST restaker must choose at least one validator"); + vm.prank(lstRestaker); + mevCommitAVS.registerLSTRestaker(chosenVals); + + bytes[] memory chosenVals2 = new bytes[](2); + chosenVals2[0] = bytes("valPubkey1"); + chosenVals2[1] = bytes("valPubkey2"); + vm.expectRevert("LST restaker must have deposited into at least one strategy"); + vm.prank(lstRestaker); + mevCommitAVS.registerLSTRestaker(chosenVals2); + + assertFalse(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).exists); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators.length, 0); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).numChosen, 0); + assertFalse(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).deregRequestHeight.exists); + + strategyManagerMock.setStakerStrategyListLengthReturnValue(3); + vm.expectEmit(true, true, true, true); + emit LSTRestakerRegistered(chosenVals2[0], 2, lstRestaker); + vm.expectEmit(true, true, true, true); + emit LSTRestakerRegistered(chosenVals2[1], 2, lstRestaker); + vm.prank(lstRestaker); + mevCommitAVS.registerLSTRestaker(chosenVals2); + + assertTrue(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).exists); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators.length, 2); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).numChosen, 2); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators[0], chosenVals2[0]); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators[1], chosenVals2[1]); + assertFalse(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).deregRequestHeight.exists); + + vm.expectRevert("sender must not be registered LST restaker"); + vm.prank(lstRestaker); + mevCommitAVS.registerLSTRestaker(chosenVals2); + } + + function testRequestLSTRestakerDeregistration() public { + address otherAcct = address(0x777); + + vm.prank(owner); + mevCommitAVS.pause(); + vm.expectRevert(PausableUpgradeable.EnforcedPause.selector); + vm.prank(otherAcct); + mevCommitAVS.requestLSTRestakerDeregistration(); + vm.prank(owner); + mevCommitAVS.unpause(); + + vm.expectRevert("sender must be registered LST restaker"); + vm.prank(otherAcct); + mevCommitAVS.requestLSTRestakerDeregistration(); + + testRegisterLSTRestaker(); + vm.roll(177); + + address lstRestaker = address(0x34443); + bytes[] memory chosenVals = new bytes[](2); + chosenVals[0] = bytes("valPubkey1"); + chosenVals[1] = bytes("valPubkey2"); + vm.expectEmit(true, true, true, true); + emit LSTRestakerDeregistrationRequested(chosenVals[0], 2, lstRestaker); + vm.expectEmit(true, true, true, true); + emit LSTRestakerDeregistrationRequested(chosenVals[1], 2, lstRestaker); + vm.prank(lstRestaker); + mevCommitAVS.requestLSTRestakerDeregistration(); + + assertTrue(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).exists); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators.length, 2); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).numChosen, 2); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators[0], chosenVals[0]); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators[1], chosenVals[1]); + assertTrue(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).deregRequestHeight.exists); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).deregRequestHeight.blockHeight, 177); + + vm.expectRevert("LST restaker must not have already requested deregistration"); + vm.prank(lstRestaker); + mevCommitAVS.requestLSTRestakerDeregistration(); + } + + function testDeregisterLSTRestaker() public { + + address otherAcct = address(0x777); + + vm.prank(owner); + mevCommitAVS.pause(); + vm.expectRevert(PausableUpgradeable.EnforcedPause.selector); + vm.prank(otherAcct); + mevCommitAVS.deregisterLSTRestaker(); + vm.prank(owner); + mevCommitAVS.unpause(); + + vm.expectRevert("sender must be registered LST restaker"); + vm.prank(otherAcct); + mevCommitAVS.deregisterLSTRestaker(); + + testRegisterLSTRestaker(); + + vm.roll(302); + + address lstRestaker = address(0x34443); + vm.expectRevert("LST restaker must have requested deregistration"); + vm.prank(lstRestaker); + mevCommitAVS.deregisterLSTRestaker(); + + vm.prank(lstRestaker); + mevCommitAVS.requestLSTRestakerDeregistration(); + + vm.expectRevert("deregistration must happen at least lstRestakerDeregPeriodBlocks after deregistration request height"); + vm.prank(lstRestaker); + mevCommitAVS.deregisterLSTRestaker(); + + vm.roll(302 + lstRestakerDeregPeriodBlocks); + + bytes[] memory chosenVals = new bytes[](2); + chosenVals[0] = bytes("valPubkey1"); + chosenVals[1] = bytes("valPubkey2"); + + assertTrue(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).exists); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators.length, 2); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).numChosen, 2); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators[0], chosenVals[0]); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators[1], chosenVals[1]); + assertTrue(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).deregRequestHeight.exists); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).deregRequestHeight.blockHeight, 302); + + vm.expectEmit(true, true, true, true); + emit LSTRestakerDeregistered(chosenVals[0], 2, lstRestaker); + vm.expectEmit(true, true, true, true); + emit LSTRestakerDeregistered(chosenVals[1], 2, lstRestaker); + vm.prank(lstRestaker); + mevCommitAVS.deregisterLSTRestaker(); + + assertFalse(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).exists); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators.length, 0); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).numChosen, 0); + assertFalse(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).deregRequestHeight.exists); + } + + function testFreeze() public { + bytes[] memory valPubkeys = new bytes[](2); + valPubkeys[0] = bytes("valPubkey1"); + valPubkeys[1] = bytes("valPubkey2"); + + vm.prank(owner); + mevCommitAVS.pause(); + vm.expectRevert(PausableUpgradeable.EnforcedPause.selector); + vm.prank(freezeOracle); + mevCommitAVS.freeze(valPubkeys); + vm.prank(owner); + mevCommitAVS.unpause(); + + vm.expectRevert("validator must be registered"); + vm.prank(freezeOracle); + mevCommitAVS.freeze(valPubkeys); + + testRegisterValidatorsByPodOwners(); + + vm.roll(403); + + address operator = address(0x888); + bytes[] memory valPubkeys2 = new bytes[](1); + valPubkeys2[0] = bytes("valPubkey1"); + vm.prank(operator); + mevCommitAVS.requestValidatorsDeregistration(valPubkeys2); + + address podOwner = address(0x420); + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).exists); + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).exists); + assertEq(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).podOwner, podOwner); + assertEq(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).podOwner, podOwner); + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).deregRequestHeight.exists); + assertEq(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).deregRequestHeight.blockHeight, 403); + assertFalse(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).deregRequestHeight.exists); + assertFalse(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).freezeHeight.exists); + assertFalse(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).freezeHeight.exists); + + vm.roll(461); + + vm.expectEmit(true, true, true, true); + emit ValidatorFrozen(valPubkeys[0], podOwner); + vm.expectEmit(true, true, true, true); + emit ValidatorFrozen(valPubkeys[1], podOwner); + vm.prank(freezeOracle); + mevCommitAVS.freeze(valPubkeys); + + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).exists); + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).exists); + assertEq(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).podOwner, podOwner); + assertEq(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).podOwner, podOwner); + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).freezeHeight.exists); + assertEq(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).freezeHeight.blockHeight, 461); + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).freezeHeight.exists); + assertEq(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).freezeHeight.blockHeight, 461); + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).deregRequestHeight.exists); + assertEq(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).deregRequestHeight.blockHeight, 403); + assertFalse(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).deregRequestHeight.exists); + + vm.expectRevert("validator must not already be frozen"); + vm.prank(freezeOracle); + mevCommitAVS.freeze(valPubkeys); + } + + function testFrozenValidatorsCantDeregister() public { + testFreeze(); + + bytes[] memory valPubkeys = new bytes[](1); + valPubkeys[0] = bytes("valPubkey1"); + IMevCommitAVS.ValidatorRegistrationInfo memory regInfo = mevCommitAVS.getValidatorRegInfo(valPubkeys[0]); + assertTrue(regInfo.deregRequestHeight.exists); + + vm.roll(block.number + validatorDeregPeriodBlocks); + + address podOwner = address(0x420); + vm.expectRevert("frozen validator cannot deregister"); + vm.prank(podOwner); + mevCommitAVS.deregisterValidators(valPubkeys); + } + + function testFrozenValidatorDoesntAffectLSTRestaker() public { + testFreeze(); + bytes[] memory valPubkeys = new bytes[](2); + valPubkeys[0] = bytes("valPubkey1"); + valPubkeys[1] = bytes("valPubkey2"); + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).freezeHeight.exists); + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).freezeHeight.exists); + + address lstRestaker = address(0x34443); + address operator = address(0x888); + ISignatureUtils.SignatureWithExpiry memory sig = ISignatureUtils.SignatureWithExpiry({ + signature: bytes("signature"), + expiry: 10 + }); + vm.prank(lstRestaker); + delegationManagerMock.delegateTo(operator, sig, bytes32("salt")); + strategyManagerMock.setStakerStrategyListLengthReturnValue(3); + + vm.prank(lstRestaker); + mevCommitAVS.registerLSTRestaker(valPubkeys); + + assertTrue(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).exists); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators[0], valPubkeys[0]); + assertEq(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).chosenValidators[1], valPubkeys[1]); + + vm.prank(lstRestaker); + mevCommitAVS.requestLSTRestakerDeregistration(); + + assertTrue(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).deregRequestHeight.exists); + + vm.roll(block.number + lstRestakerDeregPeriodBlocks); + + vm.prank(lstRestaker); + mevCommitAVS.deregisterLSTRestaker(); + + assertFalse(mevCommitAVS.getLSTRestakerRegInfo(lstRestaker).exists); + } + + function testUnfreeze() public { + + bytes[] memory valPubkeys = new bytes[](2); + valPubkeys[0] = bytes("valPubkey1"); + valPubkeys[1] = bytes("valPubkey2"); + + address newAccount = address(0x333333333); + + vm.prank(owner); + mevCommitAVS.pause(); + vm.expectRevert(PausableUpgradeable.EnforcedPause.selector); + vm.prank(newAccount); + mevCommitAVS.unfreeze(valPubkeys); + vm.prank(owner); + mevCommitAVS.unpause(); + + vm.expectRevert("validator must be registered"); + vm.prank(newAccount); + mevCommitAVS.unfreeze(valPubkeys); + + testRegisterValidatorsByPodOwners(); + + vm.expectRevert("validator must be frozen"); + vm.prank(newAccount); + mevCommitAVS.unfreeze(valPubkeys); + + vm.prank(freezeOracle); + mevCommitAVS.freeze(valPubkeys); + + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).exists); + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).freezeHeight.exists); + + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).exists); + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).freezeHeight.exists); + + vm.expectRevert("sender must pay at least the unfreeze fee for each validator"); + vm.prank(newAccount); + mevCommitAVS.unfreeze(valPubkeys); + + vm.deal(newAccount, 2 * unfreezeFee); + + uint256 singleUnfreezeFee = unfreezeFee; + vm.expectRevert("sender must pay at least the unfreeze fee for each validator"); + vm.prank(newAccount); + mevCommitAVS.unfreeze{value: singleUnfreezeFee}(valPubkeys); + + uint256 doubleUnfreezeFee = unfreezeFee * 2; + vm.expectRevert("unfreeze must happen at least unfreezePeriodBlocks after freeze height"); + vm.prank(newAccount); + mevCommitAVS.unfreeze{value: doubleUnfreezeFee}(valPubkeys); + + vm.roll(block.number + unfreezePeriodBlocks); + + assertEq(address(mevCommitAVS).balance, 0); + assertEq(address(newAccount).balance, unfreezeFee * 2); + assertEq(address(unfreezeReceiver).balance, 0); + + address podOwner = address(0x420); + vm.expectEmit(true, true, true, true); + emit ValidatorUnfrozen(valPubkeys[0], podOwner); + vm.expectEmit(true, true, true, true); + emit ValidatorUnfrozen(valPubkeys[1], podOwner); + vm.prank(newAccount); + mevCommitAVS.unfreeze{value: doubleUnfreezeFee}(valPubkeys); + + assertEq(address(mevCommitAVS).balance, 0); + assertEq(address(newAccount).balance, 0); + assertEq(address(unfreezeReceiver).balance, unfreezeFee * 2); + + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).exists); + assertFalse(mevCommitAVS.getValidatorRegInfo(valPubkeys[0]).freezeHeight.exists); + + assertTrue(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).exists); + assertFalse(mevCommitAVS.getValidatorRegInfo(valPubkeys[1]).freezeHeight.exists); + } + + function testSetters() public { + IAVSDirectory newAVSDirectory = new AVSDirectoryMock(); + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setAVSDirectory(newAVSDirectory); + vm.expectEmit(true, true, true, true); + emit AVSDirectorySet(address(newAVSDirectory)); + vm.prank(owner); + mevCommitAVS.setAVSDirectory(newAVSDirectory); + + IStrategyManager newStrategyManager = IStrategyManager(address(0x8)); + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setStrategyManager(newStrategyManager); + vm.expectEmit(true, true, true, true); + emit StrategyManagerSet(address(newStrategyManager)); + vm.prank(owner); + mevCommitAVS.setStrategyManager(newStrategyManager); + + IDelegationManager newDelegationManager = IDelegationManager(address(0x9)); + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setDelegationManager(newDelegationManager); + vm.expectEmit(true, true, true, true); + emit DelegationManagerSet(address(newDelegationManager)); + vm.prank(owner); + mevCommitAVS.setDelegationManager(newDelegationManager); + + IEigenPodManager newEigenPodManager = IEigenPodManager(address(0xA)); + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setEigenPodManager(newEigenPodManager); + vm.expectEmit(true, true, true, true); + emit EigenPodManagerSet(address(newEigenPodManager)); + vm.prank(owner); + mevCommitAVS.setEigenPodManager(newEigenPodManager); + + address[] memory newRestakeableStrategies = new address[](2); + newRestakeableStrategies[0] = address(0xB); + newRestakeableStrategies[1] = address(0xC); + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setRestakeableStrategies(newRestakeableStrategies); + vm.expectEmit(true, true, true, true); + emit RestakeableStrategiesSet(newRestakeableStrategies); + vm.prank(owner); + mevCommitAVS.setRestakeableStrategies(newRestakeableStrategies); + + address newFreezeOracle = address(0xD); + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setFreezeOracle(newFreezeOracle); + vm.expectEmit(true, true, true, true); + emit FreezeOracleSet(newFreezeOracle); + vm.prank(owner); + mevCommitAVS.setFreezeOracle(newFreezeOracle); + assertEq(mevCommitAVS.freezeOracle(), newFreezeOracle); + + uint256 newUnfreezeFee = 2 ether; + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setUnfreezeFee(newUnfreezeFee); + vm.expectEmit(true, true, true, true); + emit UnfreezeFeeSet(newUnfreezeFee); + vm.prank(owner); + mevCommitAVS.setUnfreezeFee(newUnfreezeFee); + assertEq(mevCommitAVS.unfreezeFee(), newUnfreezeFee); + + address newUnfreezeReceiver = address(0xE); + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setUnfreezeReceiver(newUnfreezeReceiver); + vm.expectEmit(true, true, true, true); + emit UnfreezeReceiverSet(newUnfreezeReceiver); + vm.prank(owner); + mevCommitAVS.setUnfreezeReceiver(newUnfreezeReceiver); + assertEq(mevCommitAVS.unfreezeReceiver(), newUnfreezeReceiver); + + uint256 newUnfreezePeriodBlocks = 200; + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setUnfreezePeriodBlocks(newUnfreezePeriodBlocks); + vm.expectEmit(true, true, true, true); + emit UnfreezePeriodBlocksSet(newUnfreezePeriodBlocks); + vm.prank(owner); + mevCommitAVS.setUnfreezePeriodBlocks(newUnfreezePeriodBlocks); + assertEq(mevCommitAVS.unfreezePeriodBlocks(), newUnfreezePeriodBlocks); + + uint256 newOperatorDeregPeriodBlocks = 300; + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setOperatorDeregPeriodBlocks(newOperatorDeregPeriodBlocks); + vm.expectEmit(true, true, true, true); + emit OperatorDeregPeriodBlocksSet(newOperatorDeregPeriodBlocks); + vm.prank(owner); + mevCommitAVS.setOperatorDeregPeriodBlocks(newOperatorDeregPeriodBlocks); + assertEq(mevCommitAVS.operatorDeregPeriodBlocks(), newOperatorDeregPeriodBlocks); + + uint256 newValidatorDeregPeriodBlocks = 400; + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setValidatorDeregPeriodBlocks(newValidatorDeregPeriodBlocks); + vm.expectEmit(true, true, true, true); + emit ValidatorDeregPeriodBlocksSet(newValidatorDeregPeriodBlocks); + vm.prank(owner); + mevCommitAVS.setValidatorDeregPeriodBlocks(newValidatorDeregPeriodBlocks); + assertEq(mevCommitAVS.validatorDeregPeriodBlocks(), newValidatorDeregPeriodBlocks); + + uint256 newLstRestakerDeregPeriodBlocks = 500; + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.setLstRestakerDeregPeriodBlocks(newLstRestakerDeregPeriodBlocks); + vm.expectEmit(true, true, true, true); + emit LSTRestakerDeregPeriodBlocksSet(newLstRestakerDeregPeriodBlocks); + vm.prank(owner); + mevCommitAVS.setLstRestakerDeregPeriodBlocks(newLstRestakerDeregPeriodBlocks); + assertEq(mevCommitAVS.lstRestakerDeregPeriodBlocks(), newLstRestakerDeregPeriodBlocks); + + string memory newMetadataURI = "https://new-metadata-uri.com"; + vm.prank(address(0x1)); + vm.expectRevert(); + mevCommitAVS.updateMetadataURI(newMetadataURI); + vm.prank(owner); + mevCommitAVS.updateMetadataURI(newMetadataURI); + } +} diff --git a/static/avs-metadata.json b/static/avs-metadata.json new file mode 100644 index 000000000..447af286b --- /dev/null +++ b/static/avs-metadata.json @@ -0,0 +1,7 @@ +{ + "name": "Mev-commit", + "website": "https://docs.primev.xyz/concepts/what-is-mev-commit", + "description": "Mev-commit is a peer-to-peer (P2P) networking platform designed to facilitate real-time interactions and coordination between mev actors and execution providers. It provides a robust network for exchanging execution bids and cryptographic commitments, which are used to specify execution requirements in detail and to receive credible commitments that act as promises to fulfill bid requirements. Mev-commit allows actors to engage in “fast games” such as preconfirmations through real-time cryptographic commitments and settles results using a high throughput blockchain for permissionless access.", + "logo": "https://raw.githubusercontent.com/primev/mev-commit/main/static/primev-logo.png", + "twitter": "https://x.com/primev_xyz" +} diff --git a/static/primev-logo.png b/static/primev-logo.png new file mode 100644 index 000000000..a1c4ebaf5 Binary files /dev/null and b/static/primev-logo.png differ