diff --git a/.gitmodules b/.gitmodules index 78e0d77c0..bec264d5a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -22,3 +22,6 @@ [submodule "contracts/lib/openzeppelin-upgrades"] path = contracts/lib/openzeppelin-upgrades url = https://github.com/OpenZeppelin/openzeppelin-upgrades.git +[submodule "contracts/lib/burners"] + path = contracts/lib/burners + url = https://github.com/symbioticfi/burners diff --git a/contracts-abi/abi/MevCommitMiddleware.abi b/contracts-abi/abi/MevCommitMiddleware.abi index 3109e6dbb..447492859 100644 --- a/contracts-abi/abi/MevCommitMiddleware.abi +++ b/contracts-abi/abi/MevCommitMiddleware.abi @@ -45,6 +45,19 @@ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "burnerRouterFactory", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract IRegistry" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "deregisterOperators", @@ -199,6 +212,11 @@ "type": "address", "internalType": "contract IRegistry" }, + { + "name": "_burnerRouterFactory", + "type": "address", + "internalType": "contract IRegistry" + }, { "name": "_network", "type": "address", @@ -214,6 +232,16 @@ "type": "address", "internalType": "address" }, + { + "name": "_slashReceiver", + "type": "address", + "internalType": "address" + }, + { + "name": "_minBurnerRouterDelay", + "type": "uint256", + "internalType": "uint256" + }, { "name": "_owner", "type": "address", @@ -261,6 +289,62 @@ ], "stateMutability": "view" }, + { + "type": "function", + "name": "isVaultBurnerValid", + "inputs": [ + { + "name": "vault", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isVaultBurnerValidAgainstOperator", + "inputs": [ + { + "name": "vault", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "minBurnerRouterDelay", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "network", @@ -548,6 +632,32 @@ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "setBurnerRouterFactory", + "inputs": [ + { + "name": "_burnerRouterFactory", + "type": "address", + "internalType": "contract IRegistry" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setMinBurnerRouterDelay", + "inputs": [ + { + "name": "minBurnerRouterDelay_", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "setNetwork", @@ -613,6 +723,19 @@ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "setSlashReceiver", + "inputs": [ + { + "name": "slashReceiver_", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "setVaultFactory", @@ -652,6 +775,19 @@ ], "stateMutability": "view" }, + { + "type": "function", + "name": "slashReceiver", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "slashRecords", @@ -945,6 +1081,19 @@ ], "stateMutability": "view" }, + { + "type": "event", + "name": "BurnerRouterFactorySet", + "inputs": [ + { + "name": "burnerRouterFactory", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, { "type": "event", "name": "Initialized", @@ -958,6 +1107,19 @@ ], "anonymous": false }, + { + "type": "event", + "name": "MinBurnerRouterDelaySet", + "inputs": [ + { + "name": "minBurnerRouterDelay", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, { "type": "event", "name": "NetworkRegistrySet", @@ -1152,6 +1314,19 @@ ], "anonymous": false }, + { + "type": "event", + "name": "SlashReceiverSet", + "inputs": [ + { + "name": "slashReceiver", + "type": "address", + "indexed": false, + "internalType": "address" + } + ], + "anonymous": false + }, { "type": "event", "name": "Unpaused", @@ -1539,6 +1714,33 @@ "name": "InvalidReceive", "inputs": [] }, + { + "type": "error", + "name": "InvalidVaultBurner", + "inputs": [ + { + "name": "vault", + "type": "address", + "internalType": "address" + } + ] + }, + { + "type": "error", + "name": "InvalidVaultBurnerConsideringOperator", + "inputs": [ + { + "name": "vault", + "type": "address", + "internalType": "address" + }, + { + "name": "operator", + "type": "address", + "internalType": "address" + } + ] + }, { "type": "error", "name": "InvalidVaultEpochDuration", diff --git a/contracts-abi/clients/MevCommitMiddleware/MevCommitMiddleware.go b/contracts-abi/clients/MevCommitMiddleware/MevCommitMiddleware.go index 91fe0ee65..9685174be 100644 --- a/contracts-abi/clients/MevCommitMiddleware/MevCommitMiddleware.go +++ b/contracts-abi/clients/MevCommitMiddleware/MevCommitMiddleware.go @@ -48,7 +48,7 @@ type TimestampOccurrenceOccurrence struct { // MevcommitmiddlewareMetaData contains all meta data concerning the Mevcommitmiddleware contract. var MevcommitmiddlewareMetaData = &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\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blacklistOperators\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperators\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterValidators\",\"inputs\":[{\"name\":\"blsPubkeys\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterVaults\",\"inputs\":[{\"name\":\"vaults\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getLatestSlashAmount\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint160\",\"internalType\":\"uint160\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNumSlashableVals\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPositionInValset\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashAmountAt\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint160\",\"internalType\":\"uint160\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_networkRegistry\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"},{\"name\":\"_operatorRegistry\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"},{\"name\":\"_vaultFactory\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"},{\"name\":\"_network\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_slashPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_slashOracle\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isValidatorOptedIn\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isValidatorSlashable\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"network\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"networkRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorRecords\",\"inputs\":[{\"name\":\"operatorAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"deregRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isBlacklisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"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\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"potentialSlashableValidators\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pubkeyAtPositionInValset\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperators\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerValidators\",\"inputs\":[{\"name\":\"blsPubkeys\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"vaults\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerVaults\",\"inputs\":[{\"name\":\"vaults\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"slashAmounts\",\"type\":\"uint160[]\",\"internalType\":\"uint160[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestOperatorDeregistrations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestValDeregistrations\",\"inputs\":[{\"name\":\"blsPubkeys\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestVaultDeregistrations\",\"inputs\":[{\"name\":\"vaults\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNetwork\",\"inputs\":[{\"name\":\"_network\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNetworkRegistry\",\"inputs\":[{\"name\":\"_networkRegistry\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorRegistry\",\"inputs\":[{\"name\":\"_operatorRegistry\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSlashOracle\",\"inputs\":[{\"name\":\"slashOracle_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSlashPeriodSeconds\",\"inputs\":[{\"name\":\"slashPeriodSeconds_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setVaultFactory\",\"inputs\":[{\"name\":\"_vaultFactory\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slashPeriodSeconds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slashRecords\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"numSlashed\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"numRegistered\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slashValidators\",\"inputs\":[{\"name\":\"blsPubkeys\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"captureTimestamps\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unblacklistOperators\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateSlashAmounts\",\"inputs\":[{\"name\":\"vaults\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"slashAmounts\",\"type\":\"uint160[]\",\"internalType\":\"uint160[]\"}],\"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\":\"validatorRecords\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deregRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"valsetLength\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"vaultFactory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"vaultRecords\",\"inputs\":[{\"name\":\"vaultAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deregRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"slashAmountHistory\",\"type\":\"tuple\",\"internalType\":\"structCheckpoints.Trace160\",\"components\":[{\"name\":\"_checkpoints\",\"type\":\"tuple[]\",\"internalType\":\"structCheckpoints.Checkpoint160[]\",\"components\":[{\"name\":\"_key\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"_value\",\"type\":\"uint160\",\"internalType\":\"uint160\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"wouldVaultBeValidWith\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"potentialSLashPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NetworkRegistrySet\",\"inputs\":[{\"name\":\"networkRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NetworkSet\",\"inputs\":[{\"name\":\"network\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorBlacklisted\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"OperatorRegistrySet\",\"inputs\":[{\"name\":\"operatorRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorUnblacklisted\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"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\":\"SlashOracleSet\",\"inputs\":[{\"name\":\"slashOracle\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashPeriodBlocksSet\",\"inputs\":[{\"name\":\"slashPeriodBlocks\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashPeriodSecondsSet\",\"inputs\":[{\"name\":\"slashPeriodSeconds\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"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\":\"ValRecordAdded\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"position\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValRecordDeleted\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"msgSender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorDeregistrationRequested\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"msgSender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"position\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorPositionsSwapped\",\"inputs\":[{\"name\":\"blsPubkeys\",\"type\":\"bytes[]\",\"indexed\":false,\"internalType\":\"bytes[]\"},{\"name\":\"vaults\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"operators\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"newPositions\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorSlashed\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"slashedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultDeregistered\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultDeregistrationRequested\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultFactorySet\",\"inputs\":[{\"name\":\"vaultFactory\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultRegistered\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"slashAmount\",\"type\":\"uint160\",\"indexed\":false,\"internalType\":\"uint160\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultSlashAmountUpdated\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"slashAmount\",\"type\":\"uint160\",\"indexed\":false,\"internalType\":\"uint160\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CaptureTimestampMustBeNonZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointUnorderedInsertion\",\"inputs\":[]},{\"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\":\"FailedToAddValidatorToValset\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FullRestakeDelegatorNotSupported\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FutureTimestampDisallowed\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidArrayLengths\",\"inputs\":[{\"name\":\"vaultLen\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pubkeyLen\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPubKeyLength\",\"inputs\":[{\"name\":\"expectedLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actualLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidVaultEpochDuration\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"vaultEpochDurationSec\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"slashPeriodSec\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MissingOperatorRecord\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MissingValRecord\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MissingValidatorRecord\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MissingVaultRecord\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NetworkNotEntity\",\"inputs\":[{\"name\":\"network\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NoRegisteredValidators\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NoSlashAmountAtTimestamp\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlySlashOracle\",\"inputs\":[{\"name\":\"slashOracle\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyVetoSlashersRequireExecution\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"slasherType\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OperatorAlreadyBlacklisted\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorDeregRequestExists\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorIsBlacklisted\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorNotBlacklisted\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorNotEntity\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorNotReadyToDeregister\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"currentTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deregRequestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"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\":\"SafeCastOverflowedUintDowncast\",\"inputs\":[{\"name\":\"bits\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"SlashAmountMustBeNonZero\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"SlasherNotSetForVault\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"UnknownDelegatorType\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatorType\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UnknownSlasherType\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"slasherType\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ValidatorDeregRequestExists\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotInValset\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotReadyToDeregister\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"currentTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deregRequestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotRemovedFromValset\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashable\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ValidatorRecordAlreadyExists\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ValidatorsNotSlashable\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"numRequested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"potentialSlashableVals\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"VaultAlreadyRegistered\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"VaultDeregNotRequested\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"VaultDeregRequestExists\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"VaultNotEntity\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"VaultNotReadyToDeregister\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"currentTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deregRequestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"VaultNotRegistered\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"VetoDurationTooShort\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"vetoDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"VetoSlasherMustHaveZeroResolver\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroUintNotAllowed\",\"inputs\":[]}]", + 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\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"blacklistOperators\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnerRouterFactory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperators\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterValidators\",\"inputs\":[{\"name\":\"blsPubkeys\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterVaults\",\"inputs\":[{\"name\":\"vaults\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getLatestSlashAmount\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint160\",\"internalType\":\"uint160\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getNumSlashableVals\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPositionInValset\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashAmountAt\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint160\",\"internalType\":\"uint160\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_networkRegistry\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"},{\"name\":\"_operatorRegistry\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"},{\"name\":\"_vaultFactory\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"},{\"name\":\"_burnerRouterFactory\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"},{\"name\":\"_network\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_slashPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_slashOracle\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_slashReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_minBurnerRouterDelay\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isValidatorOptedIn\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isValidatorSlashable\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isVaultBurnerValid\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isVaultBurnerValidAgainstOperator\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minBurnerRouterDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"network\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"networkRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorRecords\",\"inputs\":[{\"name\":\"operatorAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"deregRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"isBlacklisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"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\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"potentialSlashableValidators\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pubkeyAtPositionInValset\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperators\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerValidators\",\"inputs\":[{\"name\":\"blsPubkeys\",\"type\":\"bytes[][]\",\"internalType\":\"bytes[][]\"},{\"name\":\"vaults\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerVaults\",\"inputs\":[{\"name\":\"vaults\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"slashAmounts\",\"type\":\"uint160[]\",\"internalType\":\"uint160[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestOperatorDeregistrations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestValDeregistrations\",\"inputs\":[{\"name\":\"blsPubkeys\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"requestVaultDeregistrations\",\"inputs\":[{\"name\":\"vaults\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setBurnerRouterFactory\",\"inputs\":[{\"name\":\"_burnerRouterFactory\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinBurnerRouterDelay\",\"inputs\":[{\"name\":\"minBurnerRouterDelay_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNetwork\",\"inputs\":[{\"name\":\"_network\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNetworkRegistry\",\"inputs\":[{\"name\":\"_networkRegistry\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorRegistry\",\"inputs\":[{\"name\":\"_operatorRegistry\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSlashOracle\",\"inputs\":[{\"name\":\"slashOracle_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSlashPeriodSeconds\",\"inputs\":[{\"name\":\"slashPeriodSeconds_\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setSlashReceiver\",\"inputs\":[{\"name\":\"slashReceiver_\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setVaultFactory\",\"inputs\":[{\"name\":\"_vaultFactory\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slashPeriodSeconds\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slashReceiver\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slashRecords\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"blockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"numSlashed\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"numRegistered\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"slashValidators\",\"inputs\":[{\"name\":\"blsPubkeys\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"captureTimestamps\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unblacklistOperators\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateSlashAmounts\",\"inputs\":[{\"name\":\"vaults\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"slashAmounts\",\"type\":\"uint160[]\",\"internalType\":\"uint160[]\"}],\"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\":\"validatorRecords\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deregRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"valsetLength\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"vaultFactory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"vaultRecords\",\"inputs\":[{\"name\":\"vaultAddress\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"deregRequestOccurrence\",\"type\":\"tuple\",\"internalType\":\"structTimestampOccurrence.Occurrence\",\"components\":[{\"name\":\"exists\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"slashAmountHistory\",\"type\":\"tuple\",\"internalType\":\"structCheckpoints.Trace160\",\"components\":[{\"name\":\"_checkpoints\",\"type\":\"tuple[]\",\"internalType\":\"structCheckpoints.Checkpoint160[]\",\"components\":[{\"name\":\"_key\",\"type\":\"uint96\",\"internalType\":\"uint96\"},{\"name\":\"_value\",\"type\":\"uint160\",\"internalType\":\"uint160\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"wouldVaultBeValidWith\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"potentialSLashPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"BurnerRouterFactorySet\",\"inputs\":[{\"name\":\"burnerRouterFactory\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinBurnerRouterDelaySet\",\"inputs\":[{\"name\":\"minBurnerRouterDelay\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NetworkRegistrySet\",\"inputs\":[{\"name\":\"networkRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NetworkSet\",\"inputs\":[{\"name\":\"network\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorBlacklisted\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"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\":\"OperatorRegistrySet\",\"inputs\":[{\"name\":\"operatorRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorUnblacklisted\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"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\":\"SlashOracleSet\",\"inputs\":[{\"name\":\"slashOracle\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashPeriodBlocksSet\",\"inputs\":[{\"name\":\"slashPeriodBlocks\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashPeriodSecondsSet\",\"inputs\":[{\"name\":\"slashPeriodSeconds\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashReceiverSet\",\"inputs\":[{\"name\":\"slashReceiver\",\"type\":\"address\",\"indexed\":false,\"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\":\"ValRecordAdded\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"position\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValRecordDeleted\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"msgSender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorDeregistrationRequested\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"msgSender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"position\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorPositionsSwapped\",\"inputs\":[{\"name\":\"blsPubkeys\",\"type\":\"bytes[]\",\"indexed\":false,\"internalType\":\"bytes[]\"},{\"name\":\"vaults\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"operators\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"address[]\"},{\"name\":\"newPositions\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorSlashed\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"slashedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultDeregistered\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultDeregistrationRequested\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultFactorySet\",\"inputs\":[{\"name\":\"vaultFactory\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultRegistered\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"slashAmount\",\"type\":\"uint160\",\"indexed\":false,\"internalType\":\"uint160\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"VaultSlashAmountUpdated\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"slashAmount\",\"type\":\"uint160\",\"indexed\":false,\"internalType\":\"uint160\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"CaptureTimestampMustBeNonZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointUnorderedInsertion\",\"inputs\":[]},{\"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\":\"FailedToAddValidatorToValset\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FullRestakeDelegatorNotSupported\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"FutureTimestampDisallowed\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidArrayLengths\",\"inputs\":[{\"name\":\"vaultLen\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"pubkeyLen\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidBLSPubKeyLength\",\"inputs\":[{\"name\":\"expectedLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"actualLength\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"InvalidFallback\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidReceive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidVaultBurner\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidVaultBurnerConsideringOperator\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"InvalidVaultEpochDuration\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"vaultEpochDurationSec\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"slashPeriodSec\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"MissingOperatorRecord\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"MissingValRecord\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MissingValidatorRecord\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"MissingVaultRecord\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NetworkNotEntity\",\"inputs\":[{\"name\":\"network\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NoRegisteredValidators\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"NoSlashAmountAtTimestamp\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlySlashOracle\",\"inputs\":[{\"name\":\"slashOracle\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OnlyVetoSlashersRequireExecution\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"slasherType\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OperatorAlreadyBlacklisted\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorDeregRequestExists\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorIsBlacklisted\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorNotBlacklisted\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorNotEntity\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OperatorNotReadyToDeregister\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"currentTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deregRequestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"OperatorNotRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"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\":\"SafeCastOverflowedUintDowncast\",\"inputs\":[{\"name\":\"bits\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"SlashAmountMustBeNonZero\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"SlasherNotSetForVault\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"UnknownDelegatorType\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatorType\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"UnknownSlasherType\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"slasherType\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ValidatorDeregRequestExists\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotInValset\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotReadyToDeregister\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"currentTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deregRequestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotRemovedFromValset\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashable\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ValidatorRecordAlreadyExists\",\"inputs\":[{\"name\":\"blsPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"type\":\"error\",\"name\":\"ValidatorsNotSlashable\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"numRequested\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"potentialSlashableVals\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"VaultAlreadyRegistered\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"VaultDeregNotRequested\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"VaultDeregRequestExists\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"VaultNotEntity\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"VaultNotReadyToDeregister\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"currentTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deregRequestTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"VaultNotRegistered\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"VetoDurationTooShort\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"vetoDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"type\":\"error\",\"name\":\"VetoSlasherMustHaveZeroResolver\",\"inputs\":[{\"name\":\"vault\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ZeroAddressNotAllowed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroUintNotAllowed\",\"inputs\":[]}]", } // MevcommitmiddlewareABI is the input ABI used to generate the binding from. @@ -228,6 +228,37 @@ func (_Mevcommitmiddleware *MevcommitmiddlewareCallerSession) UPGRADEINTERFACEVE return _Mevcommitmiddleware.Contract.UPGRADEINTERFACEVERSION(&_Mevcommitmiddleware.CallOpts) } +// BurnerRouterFactory is a free data retrieval call binding the contract method 0xc70a3c5f. +// +// Solidity: function burnerRouterFactory() view returns(address) +func (_Mevcommitmiddleware *MevcommitmiddlewareCaller) BurnerRouterFactory(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Mevcommitmiddleware.contract.Call(opts, &out, "burnerRouterFactory") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// BurnerRouterFactory is a free data retrieval call binding the contract method 0xc70a3c5f. +// +// Solidity: function burnerRouterFactory() view returns(address) +func (_Mevcommitmiddleware *MevcommitmiddlewareSession) BurnerRouterFactory() (common.Address, error) { + return _Mevcommitmiddleware.Contract.BurnerRouterFactory(&_Mevcommitmiddleware.CallOpts) +} + +// BurnerRouterFactory is a free data retrieval call binding the contract method 0xc70a3c5f. +// +// Solidity: function burnerRouterFactory() view returns(address) +func (_Mevcommitmiddleware *MevcommitmiddlewareCallerSession) BurnerRouterFactory() (common.Address, error) { + return _Mevcommitmiddleware.Contract.BurnerRouterFactory(&_Mevcommitmiddleware.CallOpts) +} + // GetLatestSlashAmount is a free data retrieval call binding the contract method 0xb39edc0f. // // Solidity: function getLatestSlashAmount(address vault) view returns(uint160) @@ -414,6 +445,99 @@ func (_Mevcommitmiddleware *MevcommitmiddlewareCallerSession) IsValidatorSlashab return _Mevcommitmiddleware.Contract.IsValidatorSlashable(&_Mevcommitmiddleware.CallOpts, blsPubkey) } +// IsVaultBurnerValid is a free data retrieval call binding the contract method 0x80bd4e93. +// +// Solidity: function isVaultBurnerValid(address vault) view returns(bool) +func (_Mevcommitmiddleware *MevcommitmiddlewareCaller) IsVaultBurnerValid(opts *bind.CallOpts, vault common.Address) (bool, error) { + var out []interface{} + err := _Mevcommitmiddleware.contract.Call(opts, &out, "isVaultBurnerValid", vault) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsVaultBurnerValid is a free data retrieval call binding the contract method 0x80bd4e93. +// +// Solidity: function isVaultBurnerValid(address vault) view returns(bool) +func (_Mevcommitmiddleware *MevcommitmiddlewareSession) IsVaultBurnerValid(vault common.Address) (bool, error) { + return _Mevcommitmiddleware.Contract.IsVaultBurnerValid(&_Mevcommitmiddleware.CallOpts, vault) +} + +// IsVaultBurnerValid is a free data retrieval call binding the contract method 0x80bd4e93. +// +// Solidity: function isVaultBurnerValid(address vault) view returns(bool) +func (_Mevcommitmiddleware *MevcommitmiddlewareCallerSession) IsVaultBurnerValid(vault common.Address) (bool, error) { + return _Mevcommitmiddleware.Contract.IsVaultBurnerValid(&_Mevcommitmiddleware.CallOpts, vault) +} + +// IsVaultBurnerValidAgainstOperator is a free data retrieval call binding the contract method 0x7d194fdf. +// +// Solidity: function isVaultBurnerValidAgainstOperator(address vault, address operator) view returns(bool) +func (_Mevcommitmiddleware *MevcommitmiddlewareCaller) IsVaultBurnerValidAgainstOperator(opts *bind.CallOpts, vault common.Address, operator common.Address) (bool, error) { + var out []interface{} + err := _Mevcommitmiddleware.contract.Call(opts, &out, "isVaultBurnerValidAgainstOperator", vault, operator) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsVaultBurnerValidAgainstOperator is a free data retrieval call binding the contract method 0x7d194fdf. +// +// Solidity: function isVaultBurnerValidAgainstOperator(address vault, address operator) view returns(bool) +func (_Mevcommitmiddleware *MevcommitmiddlewareSession) IsVaultBurnerValidAgainstOperator(vault common.Address, operator common.Address) (bool, error) { + return _Mevcommitmiddleware.Contract.IsVaultBurnerValidAgainstOperator(&_Mevcommitmiddleware.CallOpts, vault, operator) +} + +// IsVaultBurnerValidAgainstOperator is a free data retrieval call binding the contract method 0x7d194fdf. +// +// Solidity: function isVaultBurnerValidAgainstOperator(address vault, address operator) view returns(bool) +func (_Mevcommitmiddleware *MevcommitmiddlewareCallerSession) IsVaultBurnerValidAgainstOperator(vault common.Address, operator common.Address) (bool, error) { + return _Mevcommitmiddleware.Contract.IsVaultBurnerValidAgainstOperator(&_Mevcommitmiddleware.CallOpts, vault, operator) +} + +// MinBurnerRouterDelay is a free data retrieval call binding the contract method 0x8f55b4f0. +// +// Solidity: function minBurnerRouterDelay() view returns(uint256) +func (_Mevcommitmiddleware *MevcommitmiddlewareCaller) MinBurnerRouterDelay(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Mevcommitmiddleware.contract.Call(opts, &out, "minBurnerRouterDelay") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MinBurnerRouterDelay is a free data retrieval call binding the contract method 0x8f55b4f0. +// +// Solidity: function minBurnerRouterDelay() view returns(uint256) +func (_Mevcommitmiddleware *MevcommitmiddlewareSession) MinBurnerRouterDelay() (*big.Int, error) { + return _Mevcommitmiddleware.Contract.MinBurnerRouterDelay(&_Mevcommitmiddleware.CallOpts) +} + +// MinBurnerRouterDelay is a free data retrieval call binding the contract method 0x8f55b4f0. +// +// Solidity: function minBurnerRouterDelay() view returns(uint256) +func (_Mevcommitmiddleware *MevcommitmiddlewareCallerSession) MinBurnerRouterDelay() (*big.Int, error) { + return _Mevcommitmiddleware.Contract.MinBurnerRouterDelay(&_Mevcommitmiddleware.CallOpts) +} + // Network is a free data retrieval call binding the contract method 0x6739afca. // // Solidity: function network() view returns(address) @@ -805,6 +929,37 @@ func (_Mevcommitmiddleware *MevcommitmiddlewareCallerSession) SlashPeriodSeconds return _Mevcommitmiddleware.Contract.SlashPeriodSeconds(&_Mevcommitmiddleware.CallOpts) } +// SlashReceiver is a free data retrieval call binding the contract method 0x1bc4e5fb. +// +// Solidity: function slashReceiver() view returns(address) +func (_Mevcommitmiddleware *MevcommitmiddlewareCaller) SlashReceiver(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _Mevcommitmiddleware.contract.Call(opts, &out, "slashReceiver") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// SlashReceiver is a free data retrieval call binding the contract method 0x1bc4e5fb. +// +// Solidity: function slashReceiver() view returns(address) +func (_Mevcommitmiddleware *MevcommitmiddlewareSession) SlashReceiver() (common.Address, error) { + return _Mevcommitmiddleware.Contract.SlashReceiver(&_Mevcommitmiddleware.CallOpts) +} + +// SlashReceiver is a free data retrieval call binding the contract method 0x1bc4e5fb. +// +// Solidity: function slashReceiver() view returns(address) +func (_Mevcommitmiddleware *MevcommitmiddlewareCallerSession) SlashReceiver() (common.Address, error) { + return _Mevcommitmiddleware.Contract.SlashReceiver(&_Mevcommitmiddleware.CallOpts) +} + // SlashRecords is a free data retrieval call binding the contract method 0x1da9f192. // // Solidity: function slashRecords(address vault, address operator, uint256 blockNumber) view returns(bool exists, uint256 numSlashed, uint256 numRegistered) @@ -1158,25 +1313,25 @@ func (_Mevcommitmiddleware *MevcommitmiddlewareTransactorSession) DeregisterVaul return _Mevcommitmiddleware.Contract.DeregisterVaults(&_Mevcommitmiddleware.TransactOpts, vaults) } -// Initialize is a paid mutator transaction binding the contract method 0x0eaf43f2. +// Initialize is a paid mutator transaction binding the contract method 0xc6636056. // -// Solidity: function initialize(address _networkRegistry, address _operatorRegistry, address _vaultFactory, address _network, uint256 _slashPeriodSeconds, address _slashOracle, address _owner) returns() -func (_Mevcommitmiddleware *MevcommitmiddlewareTransactor) Initialize(opts *bind.TransactOpts, _networkRegistry common.Address, _operatorRegistry common.Address, _vaultFactory common.Address, _network common.Address, _slashPeriodSeconds *big.Int, _slashOracle common.Address, _owner common.Address) (*types.Transaction, error) { - return _Mevcommitmiddleware.contract.Transact(opts, "initialize", _networkRegistry, _operatorRegistry, _vaultFactory, _network, _slashPeriodSeconds, _slashOracle, _owner) +// Solidity: function initialize(address _networkRegistry, address _operatorRegistry, address _vaultFactory, address _burnerRouterFactory, address _network, uint256 _slashPeriodSeconds, address _slashOracle, address _slashReceiver, uint256 _minBurnerRouterDelay, address _owner) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareTransactor) Initialize(opts *bind.TransactOpts, _networkRegistry common.Address, _operatorRegistry common.Address, _vaultFactory common.Address, _burnerRouterFactory common.Address, _network common.Address, _slashPeriodSeconds *big.Int, _slashOracle common.Address, _slashReceiver common.Address, _minBurnerRouterDelay *big.Int, _owner common.Address) (*types.Transaction, error) { + return _Mevcommitmiddleware.contract.Transact(opts, "initialize", _networkRegistry, _operatorRegistry, _vaultFactory, _burnerRouterFactory, _network, _slashPeriodSeconds, _slashOracle, _slashReceiver, _minBurnerRouterDelay, _owner) } -// Initialize is a paid mutator transaction binding the contract method 0x0eaf43f2. +// Initialize is a paid mutator transaction binding the contract method 0xc6636056. // -// Solidity: function initialize(address _networkRegistry, address _operatorRegistry, address _vaultFactory, address _network, uint256 _slashPeriodSeconds, address _slashOracle, address _owner) returns() -func (_Mevcommitmiddleware *MevcommitmiddlewareSession) Initialize(_networkRegistry common.Address, _operatorRegistry common.Address, _vaultFactory common.Address, _network common.Address, _slashPeriodSeconds *big.Int, _slashOracle common.Address, _owner common.Address) (*types.Transaction, error) { - return _Mevcommitmiddleware.Contract.Initialize(&_Mevcommitmiddleware.TransactOpts, _networkRegistry, _operatorRegistry, _vaultFactory, _network, _slashPeriodSeconds, _slashOracle, _owner) +// Solidity: function initialize(address _networkRegistry, address _operatorRegistry, address _vaultFactory, address _burnerRouterFactory, address _network, uint256 _slashPeriodSeconds, address _slashOracle, address _slashReceiver, uint256 _minBurnerRouterDelay, address _owner) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareSession) Initialize(_networkRegistry common.Address, _operatorRegistry common.Address, _vaultFactory common.Address, _burnerRouterFactory common.Address, _network common.Address, _slashPeriodSeconds *big.Int, _slashOracle common.Address, _slashReceiver common.Address, _minBurnerRouterDelay *big.Int, _owner common.Address) (*types.Transaction, error) { + return _Mevcommitmiddleware.Contract.Initialize(&_Mevcommitmiddleware.TransactOpts, _networkRegistry, _operatorRegistry, _vaultFactory, _burnerRouterFactory, _network, _slashPeriodSeconds, _slashOracle, _slashReceiver, _minBurnerRouterDelay, _owner) } -// Initialize is a paid mutator transaction binding the contract method 0x0eaf43f2. +// Initialize is a paid mutator transaction binding the contract method 0xc6636056. // -// Solidity: function initialize(address _networkRegistry, address _operatorRegistry, address _vaultFactory, address _network, uint256 _slashPeriodSeconds, address _slashOracle, address _owner) returns() -func (_Mevcommitmiddleware *MevcommitmiddlewareTransactorSession) Initialize(_networkRegistry common.Address, _operatorRegistry common.Address, _vaultFactory common.Address, _network common.Address, _slashPeriodSeconds *big.Int, _slashOracle common.Address, _owner common.Address) (*types.Transaction, error) { - return _Mevcommitmiddleware.Contract.Initialize(&_Mevcommitmiddleware.TransactOpts, _networkRegistry, _operatorRegistry, _vaultFactory, _network, _slashPeriodSeconds, _slashOracle, _owner) +// Solidity: function initialize(address _networkRegistry, address _operatorRegistry, address _vaultFactory, address _burnerRouterFactory, address _network, uint256 _slashPeriodSeconds, address _slashOracle, address _slashReceiver, uint256 _minBurnerRouterDelay, address _owner) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareTransactorSession) Initialize(_networkRegistry common.Address, _operatorRegistry common.Address, _vaultFactory common.Address, _burnerRouterFactory common.Address, _network common.Address, _slashPeriodSeconds *big.Int, _slashOracle common.Address, _slashReceiver common.Address, _minBurnerRouterDelay *big.Int, _owner common.Address) (*types.Transaction, error) { + return _Mevcommitmiddleware.Contract.Initialize(&_Mevcommitmiddleware.TransactOpts, _networkRegistry, _operatorRegistry, _vaultFactory, _burnerRouterFactory, _network, _slashPeriodSeconds, _slashOracle, _slashReceiver, _minBurnerRouterDelay, _owner) } // Pause is a paid mutator transaction binding the contract method 0x8456cb59. @@ -1347,6 +1502,48 @@ func (_Mevcommitmiddleware *MevcommitmiddlewareTransactorSession) RequestVaultDe return _Mevcommitmiddleware.Contract.RequestVaultDeregistrations(&_Mevcommitmiddleware.TransactOpts, vaults) } +// SetBurnerRouterFactory is a paid mutator transaction binding the contract method 0xd0352521. +// +// Solidity: function setBurnerRouterFactory(address _burnerRouterFactory) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareTransactor) SetBurnerRouterFactory(opts *bind.TransactOpts, _burnerRouterFactory common.Address) (*types.Transaction, error) { + return _Mevcommitmiddleware.contract.Transact(opts, "setBurnerRouterFactory", _burnerRouterFactory) +} + +// SetBurnerRouterFactory is a paid mutator transaction binding the contract method 0xd0352521. +// +// Solidity: function setBurnerRouterFactory(address _burnerRouterFactory) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareSession) SetBurnerRouterFactory(_burnerRouterFactory common.Address) (*types.Transaction, error) { + return _Mevcommitmiddleware.Contract.SetBurnerRouterFactory(&_Mevcommitmiddleware.TransactOpts, _burnerRouterFactory) +} + +// SetBurnerRouterFactory is a paid mutator transaction binding the contract method 0xd0352521. +// +// Solidity: function setBurnerRouterFactory(address _burnerRouterFactory) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareTransactorSession) SetBurnerRouterFactory(_burnerRouterFactory common.Address) (*types.Transaction, error) { + return _Mevcommitmiddleware.Contract.SetBurnerRouterFactory(&_Mevcommitmiddleware.TransactOpts, _burnerRouterFactory) +} + +// SetMinBurnerRouterDelay is a paid mutator transaction binding the contract method 0x9c8c3022. +// +// Solidity: function setMinBurnerRouterDelay(uint256 minBurnerRouterDelay_) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareTransactor) SetMinBurnerRouterDelay(opts *bind.TransactOpts, minBurnerRouterDelay_ *big.Int) (*types.Transaction, error) { + return _Mevcommitmiddleware.contract.Transact(opts, "setMinBurnerRouterDelay", minBurnerRouterDelay_) +} + +// SetMinBurnerRouterDelay is a paid mutator transaction binding the contract method 0x9c8c3022. +// +// Solidity: function setMinBurnerRouterDelay(uint256 minBurnerRouterDelay_) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareSession) SetMinBurnerRouterDelay(minBurnerRouterDelay_ *big.Int) (*types.Transaction, error) { + return _Mevcommitmiddleware.Contract.SetMinBurnerRouterDelay(&_Mevcommitmiddleware.TransactOpts, minBurnerRouterDelay_) +} + +// SetMinBurnerRouterDelay is a paid mutator transaction binding the contract method 0x9c8c3022. +// +// Solidity: function setMinBurnerRouterDelay(uint256 minBurnerRouterDelay_) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareTransactorSession) SetMinBurnerRouterDelay(minBurnerRouterDelay_ *big.Int) (*types.Transaction, error) { + return _Mevcommitmiddleware.Contract.SetMinBurnerRouterDelay(&_Mevcommitmiddleware.TransactOpts, minBurnerRouterDelay_) +} + // SetNetwork is a paid mutator transaction binding the contract method 0xa1d71142. // // Solidity: function setNetwork(address _network) returns() @@ -1452,6 +1649,27 @@ func (_Mevcommitmiddleware *MevcommitmiddlewareTransactorSession) SetSlashPeriod return _Mevcommitmiddleware.Contract.SetSlashPeriodSeconds(&_Mevcommitmiddleware.TransactOpts, slashPeriodSeconds_) } +// SetSlashReceiver is a paid mutator transaction binding the contract method 0x1a6933d5. +// +// Solidity: function setSlashReceiver(address slashReceiver_) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareTransactor) SetSlashReceiver(opts *bind.TransactOpts, slashReceiver_ common.Address) (*types.Transaction, error) { + return _Mevcommitmiddleware.contract.Transact(opts, "setSlashReceiver", slashReceiver_) +} + +// SetSlashReceiver is a paid mutator transaction binding the contract method 0x1a6933d5. +// +// Solidity: function setSlashReceiver(address slashReceiver_) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareSession) SetSlashReceiver(slashReceiver_ common.Address) (*types.Transaction, error) { + return _Mevcommitmiddleware.Contract.SetSlashReceiver(&_Mevcommitmiddleware.TransactOpts, slashReceiver_) +} + +// SetSlashReceiver is a paid mutator transaction binding the contract method 0x1a6933d5. +// +// Solidity: function setSlashReceiver(address slashReceiver_) returns() +func (_Mevcommitmiddleware *MevcommitmiddlewareTransactorSession) SetSlashReceiver(slashReceiver_ common.Address) (*types.Transaction, error) { + return _Mevcommitmiddleware.Contract.SetSlashReceiver(&_Mevcommitmiddleware.TransactOpts, slashReceiver_) +} + // SetVaultFactory is a paid mutator transaction binding the contract method 0x3ea7fbdb. // // Solidity: function setVaultFactory(address _vaultFactory) returns() @@ -1641,6 +1859,140 @@ func (_Mevcommitmiddleware *MevcommitmiddlewareTransactorSession) Receive() (*ty return _Mevcommitmiddleware.Contract.Receive(&_Mevcommitmiddleware.TransactOpts) } +// MevcommitmiddlewareBurnerRouterFactorySetIterator is returned from FilterBurnerRouterFactorySet and is used to iterate over the raw logs and unpacked data for BurnerRouterFactorySet events raised by the Mevcommitmiddleware contract. +type MevcommitmiddlewareBurnerRouterFactorySetIterator struct { + Event *MevcommitmiddlewareBurnerRouterFactorySet // 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 *MevcommitmiddlewareBurnerRouterFactorySetIterator) 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(MevcommitmiddlewareBurnerRouterFactorySet) + 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(MevcommitmiddlewareBurnerRouterFactorySet) + 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 *MevcommitmiddlewareBurnerRouterFactorySetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitmiddlewareBurnerRouterFactorySetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitmiddlewareBurnerRouterFactorySet represents a BurnerRouterFactorySet event raised by the Mevcommitmiddleware contract. +type MevcommitmiddlewareBurnerRouterFactorySet struct { + BurnerRouterFactory common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBurnerRouterFactorySet is a free log retrieval operation binding the contract event 0x9c214079845899d94b3bd881a14e996ebd153ef99fdc98ee4681eacf19c62f38. +// +// Solidity: event BurnerRouterFactorySet(address burnerRouterFactory) +func (_Mevcommitmiddleware *MevcommitmiddlewareFilterer) FilterBurnerRouterFactorySet(opts *bind.FilterOpts) (*MevcommitmiddlewareBurnerRouterFactorySetIterator, error) { + + logs, sub, err := _Mevcommitmiddleware.contract.FilterLogs(opts, "BurnerRouterFactorySet") + if err != nil { + return nil, err + } + return &MevcommitmiddlewareBurnerRouterFactorySetIterator{contract: _Mevcommitmiddleware.contract, event: "BurnerRouterFactorySet", logs: logs, sub: sub}, nil +} + +// WatchBurnerRouterFactorySet is a free log subscription operation binding the contract event 0x9c214079845899d94b3bd881a14e996ebd153ef99fdc98ee4681eacf19c62f38. +// +// Solidity: event BurnerRouterFactorySet(address burnerRouterFactory) +func (_Mevcommitmiddleware *MevcommitmiddlewareFilterer) WatchBurnerRouterFactorySet(opts *bind.WatchOpts, sink chan<- *MevcommitmiddlewareBurnerRouterFactorySet) (event.Subscription, error) { + + logs, sub, err := _Mevcommitmiddleware.contract.WatchLogs(opts, "BurnerRouterFactorySet") + 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(MevcommitmiddlewareBurnerRouterFactorySet) + if err := _Mevcommitmiddleware.contract.UnpackLog(event, "BurnerRouterFactorySet", 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 +} + +// ParseBurnerRouterFactorySet is a log parse operation binding the contract event 0x9c214079845899d94b3bd881a14e996ebd153ef99fdc98ee4681eacf19c62f38. +// +// Solidity: event BurnerRouterFactorySet(address burnerRouterFactory) +func (_Mevcommitmiddleware *MevcommitmiddlewareFilterer) ParseBurnerRouterFactorySet(log types.Log) (*MevcommitmiddlewareBurnerRouterFactorySet, error) { + event := new(MevcommitmiddlewareBurnerRouterFactorySet) + if err := _Mevcommitmiddleware.contract.UnpackLog(event, "BurnerRouterFactorySet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // MevcommitmiddlewareInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Mevcommitmiddleware contract. type MevcommitmiddlewareInitializedIterator struct { Event *MevcommitmiddlewareInitialized // Event containing the contract specifics and raw log @@ -1775,6 +2127,140 @@ func (_Mevcommitmiddleware *MevcommitmiddlewareFilterer) ParseInitialized(log ty return event, nil } +// MevcommitmiddlewareMinBurnerRouterDelaySetIterator is returned from FilterMinBurnerRouterDelaySet and is used to iterate over the raw logs and unpacked data for MinBurnerRouterDelaySet events raised by the Mevcommitmiddleware contract. +type MevcommitmiddlewareMinBurnerRouterDelaySetIterator struct { + Event *MevcommitmiddlewareMinBurnerRouterDelaySet // 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 *MevcommitmiddlewareMinBurnerRouterDelaySetIterator) 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(MevcommitmiddlewareMinBurnerRouterDelaySet) + 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(MevcommitmiddlewareMinBurnerRouterDelaySet) + 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 *MevcommitmiddlewareMinBurnerRouterDelaySetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitmiddlewareMinBurnerRouterDelaySetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitmiddlewareMinBurnerRouterDelaySet represents a MinBurnerRouterDelaySet event raised by the Mevcommitmiddleware contract. +type MevcommitmiddlewareMinBurnerRouterDelaySet struct { + MinBurnerRouterDelay *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterMinBurnerRouterDelaySet is a free log retrieval operation binding the contract event 0x1692318fc65bb45681dfd5556f2d21be7659c6809c725f503ad03240998b4b18. +// +// Solidity: event MinBurnerRouterDelaySet(uint256 minBurnerRouterDelay) +func (_Mevcommitmiddleware *MevcommitmiddlewareFilterer) FilterMinBurnerRouterDelaySet(opts *bind.FilterOpts) (*MevcommitmiddlewareMinBurnerRouterDelaySetIterator, error) { + + logs, sub, err := _Mevcommitmiddleware.contract.FilterLogs(opts, "MinBurnerRouterDelaySet") + if err != nil { + return nil, err + } + return &MevcommitmiddlewareMinBurnerRouterDelaySetIterator{contract: _Mevcommitmiddleware.contract, event: "MinBurnerRouterDelaySet", logs: logs, sub: sub}, nil +} + +// WatchMinBurnerRouterDelaySet is a free log subscription operation binding the contract event 0x1692318fc65bb45681dfd5556f2d21be7659c6809c725f503ad03240998b4b18. +// +// Solidity: event MinBurnerRouterDelaySet(uint256 minBurnerRouterDelay) +func (_Mevcommitmiddleware *MevcommitmiddlewareFilterer) WatchMinBurnerRouterDelaySet(opts *bind.WatchOpts, sink chan<- *MevcommitmiddlewareMinBurnerRouterDelaySet) (event.Subscription, error) { + + logs, sub, err := _Mevcommitmiddleware.contract.WatchLogs(opts, "MinBurnerRouterDelaySet") + 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(MevcommitmiddlewareMinBurnerRouterDelaySet) + if err := _Mevcommitmiddleware.contract.UnpackLog(event, "MinBurnerRouterDelaySet", 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 +} + +// ParseMinBurnerRouterDelaySet is a log parse operation binding the contract event 0x1692318fc65bb45681dfd5556f2d21be7659c6809c725f503ad03240998b4b18. +// +// Solidity: event MinBurnerRouterDelaySet(uint256 minBurnerRouterDelay) +func (_Mevcommitmiddleware *MevcommitmiddlewareFilterer) ParseMinBurnerRouterDelaySet(log types.Log) (*MevcommitmiddlewareMinBurnerRouterDelaySet, error) { + event := new(MevcommitmiddlewareMinBurnerRouterDelaySet) + if err := _Mevcommitmiddleware.contract.UnpackLog(event, "MinBurnerRouterDelaySet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // MevcommitmiddlewareNetworkRegistrySetIterator is returned from FilterNetworkRegistrySet and is used to iterate over the raw logs and unpacked data for NetworkRegistrySet events raised by the Mevcommitmiddleware contract. type MevcommitmiddlewareNetworkRegistrySetIterator struct { Event *MevcommitmiddlewareNetworkRegistrySet // Event containing the contract specifics and raw log @@ -3739,6 +4225,140 @@ func (_Mevcommitmiddleware *MevcommitmiddlewareFilterer) ParseSlashPeriodSeconds return event, nil } +// MevcommitmiddlewareSlashReceiverSetIterator is returned from FilterSlashReceiverSet and is used to iterate over the raw logs and unpacked data for SlashReceiverSet events raised by the Mevcommitmiddleware contract. +type MevcommitmiddlewareSlashReceiverSetIterator struct { + Event *MevcommitmiddlewareSlashReceiverSet // 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 *MevcommitmiddlewareSlashReceiverSetIterator) 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(MevcommitmiddlewareSlashReceiverSet) + 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(MevcommitmiddlewareSlashReceiverSet) + 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 *MevcommitmiddlewareSlashReceiverSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MevcommitmiddlewareSlashReceiverSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MevcommitmiddlewareSlashReceiverSet represents a SlashReceiverSet event raised by the Mevcommitmiddleware contract. +type MevcommitmiddlewareSlashReceiverSet struct { + SlashReceiver common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSlashReceiverSet is a free log retrieval operation binding the contract event 0x1299adc355601236099496a2d2b5de5dadc58ddf4628bd4e9ca3d2560931f9a6. +// +// Solidity: event SlashReceiverSet(address slashReceiver) +func (_Mevcommitmiddleware *MevcommitmiddlewareFilterer) FilterSlashReceiverSet(opts *bind.FilterOpts) (*MevcommitmiddlewareSlashReceiverSetIterator, error) { + + logs, sub, err := _Mevcommitmiddleware.contract.FilterLogs(opts, "SlashReceiverSet") + if err != nil { + return nil, err + } + return &MevcommitmiddlewareSlashReceiverSetIterator{contract: _Mevcommitmiddleware.contract, event: "SlashReceiverSet", logs: logs, sub: sub}, nil +} + +// WatchSlashReceiverSet is a free log subscription operation binding the contract event 0x1299adc355601236099496a2d2b5de5dadc58ddf4628bd4e9ca3d2560931f9a6. +// +// Solidity: event SlashReceiverSet(address slashReceiver) +func (_Mevcommitmiddleware *MevcommitmiddlewareFilterer) WatchSlashReceiverSet(opts *bind.WatchOpts, sink chan<- *MevcommitmiddlewareSlashReceiverSet) (event.Subscription, error) { + + logs, sub, err := _Mevcommitmiddleware.contract.WatchLogs(opts, "SlashReceiverSet") + 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(MevcommitmiddlewareSlashReceiverSet) + if err := _Mevcommitmiddleware.contract.UnpackLog(event, "SlashReceiverSet", 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 +} + +// ParseSlashReceiverSet is a log parse operation binding the contract event 0x1299adc355601236099496a2d2b5de5dadc58ddf4628bd4e9ca3d2560931f9a6. +// +// Solidity: event SlashReceiverSet(address slashReceiver) +func (_Mevcommitmiddleware *MevcommitmiddlewareFilterer) ParseSlashReceiverSet(log types.Log) (*MevcommitmiddlewareSlashReceiverSet, error) { + event := new(MevcommitmiddlewareSlashReceiverSet) + if err := _Mevcommitmiddleware.contract.UnpackLog(event, "SlashReceiverSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // MevcommitmiddlewareUnpausedIterator is returned from FilterUnpaused and is used to iterate over the raw logs and unpacked data for Unpaused events raised by the Mevcommitmiddleware contract. type MevcommitmiddlewareUnpausedIterator struct { Event *MevcommitmiddlewareUnpaused // Event containing the contract specifics and raw log diff --git a/contracts/contracts/interfaces/IMevCommitMiddleware.sol b/contracts/contracts/interfaces/IMevCommitMiddleware.sol index a4b2656fe..7f2c9c2f8 100644 --- a/contracts/contracts/interfaces/IMevCommitMiddleware.sol +++ b/contracts/contracts/interfaces/IMevCommitMiddleware.sol @@ -98,6 +98,9 @@ interface IMevCommitMiddleware { /// @notice Emmitted when the vault factory is set event VaultFactorySet(address vaultFactory); + /// @notice Emmitted when the burner router factory is set + event BurnerRouterFactorySet(address burnerRouterFactory); + /// @notice Emmitted when the network is set event NetworkSet(address network); @@ -110,6 +113,12 @@ interface IMevCommitMiddleware { /// @notice Emmitted when the slash oracle is set event SlashOracleSet(address slashOracle); + /// @notice Emmitted when the slash receiver is set + event SlashReceiverSet(address slashReceiver); + + /// @notice Emmitted when the minimum burner router delay is set + event MinBurnerRouterDelaySet(uint256 minBurnerRouterDelay); + /// @notice Emmitted when validator positions are swapped as a part of slashing /// @dev Each array index corresponds to a swap instance. ie. all lists should be of equal length. event ValidatorPositionsSwapped(bytes[] blsPubkeys, address[] vaults, address[] operators, uint256[] newPositions); @@ -182,6 +191,10 @@ interface IMevCommitMiddleware { error VaultDeregRequestExists(address vault); + error InvalidVaultBurner(address vault); + + error InvalidVaultBurnerConsideringOperator(address vault, address operator); + error ValidatorNotInValset(bytes blsPubkey, address vault, address operator); error NoSlashAmountAtTimestamp(address vault, uint256 timestamp); diff --git a/contracts/contracts/validator-registry/middleware/MevCommitMiddleware.sol b/contracts/contracts/validator-registry/middleware/MevCommitMiddleware.sol index 8f0b0d763..0ab6f335a 100644 --- a/contracts/contracts/validator-registry/middleware/MevCommitMiddleware.sol +++ b/contracts/contracts/validator-registry/middleware/MevCommitMiddleware.sol @@ -20,6 +20,7 @@ import {SafeCast} from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import {Errors} from "../../utils/Errors.sol"; import {IVetoSlasher} from "symbiotic-core/interfaces/slasher/IVetoSlasher.sol"; import {Checkpoints} from "@openzeppelin/contracts/utils/structs/Checkpoints.sol"; +import {IBurnerRouter} from "symbiotic-burners/interfaces/router/IBurnerRouter.sol"; /// @notice This contracts serve as an entrypoint for L1 validators /// to *opt-in* to mev-commit, ie. attest to the rules of mev-commit, @@ -60,25 +61,34 @@ contract MevCommitMiddleware is IMevCommitMiddleware, MevCommitMiddlewareStorage /// @param _networkRegistry Symbiotic core network registry contract. /// @param _operatorRegistry Symbiotic core operator registry contract. /// @param _vaultFactory Symbiotic core vault factory contract. + /// @param _burnerRouterFactory Symbiotic core burner router factory contract. /// @param _network Address of the mev-commit network EOA. /// @param _slashPeriodSeconds Oracle slashing must be invoked within `slashPeriodSeconds` of any event causing a validator to transition from *opted-in* to **not** *opted-in*. /// @param _slashOracle Address of the mev-commit oracle. + /// @param _slashReceiver Address of the mev-commit slash receiver. + /// @param _minBurnerRouterDelay Minimum burner router delay. /// @param _owner Contract owner address. function initialize( IRegistry _networkRegistry, IRegistry _operatorRegistry, IRegistry _vaultFactory, + IRegistry _burnerRouterFactory, address _network, uint256 _slashPeriodSeconds, address _slashOracle, + address _slashReceiver, + uint256 _minBurnerRouterDelay, address _owner ) public initializer { _setNetworkRegistry(_networkRegistry); _setOperatorRegistry(_operatorRegistry); _setVaultFactory(_vaultFactory); + _setBurnerRouterFactory(_burnerRouterFactory); _setNetwork(_network); _setSlashPeriodSeconds(_slashPeriodSeconds); _setSlashOracle(_slashOracle); + _setSlashReceiver(_slashReceiver); + _setMinBurnerRouterDelay(_minBurnerRouterDelay); __Pausable_init(); __UUPSUpgradeable_init(); __Ownable_init(_owner); @@ -192,6 +202,7 @@ contract MevCommitMiddleware is IMevCommitMiddleware, MevCommitMiddlewareStorage for (uint256 i = 0; i < vaultLen; ++i) { address vault = vaults[i]; _checkVault(vault); + require(_validateVaultBurnerAgainstOperator(vault, operator), InvalidVaultBurnerConsideringOperator(vault, operator)); uint256 potentialSlashableVals = _potentialSlashableVals(vault, operator); bytes[] calldata pubkeyArray = blsPubkeys[i]; uint256 numKeys = pubkeyArray.length; @@ -286,6 +297,11 @@ contract MevCommitMiddleware is IMevCommitMiddleware, MevCommitMiddlewareStorage _setVaultFactory(_vaultFactory); } + /// @dev Sets the burner router factory, restricted to contract owner. + function setBurnerRouterFactory(IRegistry _burnerRouterFactory) external onlyOwner { + _setBurnerRouterFactory(_burnerRouterFactory); + } + /// @dev Sets the network address, restricted to contract owner. function setNetwork(address _network) external onlyOwner { _setNetwork(_network); @@ -308,6 +324,20 @@ contract MevCommitMiddleware is IMevCommitMiddleware, MevCommitMiddlewareStorage _setSlashOracle(slashOracle_); } + /// @dev Sets the slash receiver, restricted to contract owner. + /// @dev In practice, this function should never be called. + /// @dev It exists for emergency scenarios only, with the assumption that changing the slash receiver + /// would invalidate all existing vaults, and they would need to update their burnerRouters. + function setSlashReceiver(address slashReceiver_) external onlyOwner { + _setSlashReceiver(slashReceiver_); + } + + /// @dev Sets the minimum burner router delay, restricted to contract owner. + /// @dev Calling this function may invalidate existing registered vaults. This exists for emergency scenarios only. + function setMinBurnerRouterDelay(uint256 minBurnerRouterDelay_) external onlyOwner { + _setMinBurnerRouterDelay(minBurnerRouterDelay_); + } + /// @dev Checks if a vault would be valid with a given slashPeriodSeconds. /// @return True if the vault would be valid, reverts otherwise. function wouldVaultBeValidWith(address vault, uint256 potentialSLashPeriodSeconds) external view returns (bool) { @@ -377,6 +407,14 @@ contract MevCommitMiddleware is IMevCommitMiddleware, MevCommitMiddlewareStorage return _getSlashAmountAt(vault, blockTimestamp); } + function isVaultBurnerValid(address vault) external view returns (bool) { + return _validateVaultBurner(vault); + } + + function isVaultBurnerValidAgainstOperator(address vault, address operator) external view returns (bool) { + return _validateVaultBurnerAgainstOperator(vault, operator); + } + function _setOperatorRecord(address operator) internal { operatorRecords[operator] = OperatorRecord({ exists: true, @@ -451,6 +489,7 @@ contract MevCommitMiddleware is IMevCommitMiddleware, MevCommitMiddlewareStorage require(vaultFactory.isEntity(vault), VaultNotEntity(vault)); require(slashAmount != 0, SlashAmountMustBeNonZero(vault)); _validateVaultParams(vault, slashPeriodSeconds); + require(_validateVaultBurner(vault), InvalidVaultBurner(vault)); _setVaultRecord(vault, slashAmount); emit VaultRegistered(vault, slashAmount); } @@ -583,6 +622,13 @@ contract MevCommitMiddleware is IMevCommitMiddleware, MevCommitMiddlewareStorage emit VaultFactorySet(address(_vaultFactory)); } + /// @dev Internal function to set the burner router factory. + function _setBurnerRouterFactory(IRegistry _burnerRouterFactory) internal { + require(_burnerRouterFactory != IRegistry(address(0)), ZeroAddressNotAllowed()); + burnerRouterFactory = _burnerRouterFactory; + emit BurnerRouterFactorySet(address(_burnerRouterFactory)); + } + /// @dev Internal function to set the network address, which must have registered with the NETWORK_REGISTRY. function _setNetwork(address _network) internal { require(_network != address(0), ZeroAddressNotAllowed()); @@ -605,6 +651,20 @@ contract MevCommitMiddleware is IMevCommitMiddleware, MevCommitMiddlewareStorage emit SlashOracleSet(slashOracle_); } + /// @dev Internal function to set the slash receiver. + function _setSlashReceiver(address slashReceiver_) internal { + require(slashReceiver_ != address(0), ZeroAddressNotAllowed()); + slashReceiver = slashReceiver_; + emit SlashReceiverSet(slashReceiver_); + } + + /// @dev Internal function to set the minimum burner router delay. + function _setMinBurnerRouterDelay(uint256 minBurnerRouterDelay_) internal { + require(minBurnerRouterDelay_ != 0, ZeroUintNotAllowed()); + minBurnerRouterDelay = minBurnerRouterDelay_; + emit MinBurnerRouterDelaySet(minBurnerRouterDelay_); + } + /// @dev Authorizes contract upgrades, restricted to contract owner. // solhint-disable-next-line no-empty-blocks function _authorizeUpgrade(address) internal override onlyOwner {} @@ -659,6 +719,30 @@ contract MevCommitMiddleware is IMevCommitMiddleware, MevCommitMiddlewareStorage require(!record.deregRequestOccurrence.exists, VaultDeregRequestExists(vault)); } + function _validateVaultBurner(address vault) internal view returns (bool) { + address burner = IVault(vault).burner(); + if (!burnerRouterFactory.isEntity(burner)) { + return false; + } + IBurnerRouter burnerRouter = IBurnerRouter(burner); + if (burnerRouter.networkReceiver(network) != slashReceiver) { + return false; + } + return burnerRouter.delay() >= minBurnerRouterDelay; + } + + function _validateVaultBurnerAgainstOperator(address vault, address operator) internal view returns (bool) { + bool isValidBurner = _validateVaultBurner(vault); + if (!isValidBurner) { + return false; + } + address burner = IVault(vault).burner(); + IBurnerRouter burnerRouter = IBurnerRouter(burner); + address operatorNetworkReceiver = burnerRouter.operatorNetworkReceiver(network, operator); + // Operator network receiver must be slashReceiver or null, but it cannot override a correct network receiver. + return operatorNetworkReceiver == address(0) || operatorNetworkReceiver == slashReceiver; + } + /// @dev Returns the one-indexed position of the blsPubkey in the set. /// @return 0 if the blsPubkey is not in the set. function _getPositionInValset(bytes calldata blsPubkey, @@ -764,6 +848,9 @@ contract MevCommitMiddleware is IMevCommitMiddleware, MevCommitMiddlewareStorage if (!_isValidatorSlashable(blsPubkey, valRecord.vault, valRecord.operator)) { return false; } + if (!_validateVaultBurnerAgainstOperator(valRecord.vault, valRecord.operator)) { + return false; + } return true; } } diff --git a/contracts/contracts/validator-registry/middleware/MevCommitMiddlewareStorage.sol b/contracts/contracts/validator-registry/middleware/MevCommitMiddlewareStorage.sol index 6fa859cb5..f0158afc4 100644 --- a/contracts/contracts/validator-registry/middleware/MevCommitMiddlewareStorage.sol +++ b/contracts/contracts/validator-registry/middleware/MevCommitMiddlewareStorage.sol @@ -34,6 +34,9 @@ abstract contract MevCommitMiddlewareStorage { /// @notice Symbiotic core vault factory. IRegistry public vaultFactory; + /// @notice Symbiotic core burner router factory. + IRegistry public burnerRouterFactory; + /// @notice The network address, which must have registered with the NETWORK_REGISTRY. address public network; @@ -45,6 +48,14 @@ abstract contract MevCommitMiddlewareStorage { /// @notice Address of the mev-commit slash oracle. address public slashOracle; + /// @notice Address of the mev-commit slash receiver. + /// @dev This address should be immutable in practice, as it is used to validate every vault. + /// @dev If this address is ever changed by the owner, all vaults would then need to update their burnerRouter. This is by-design. + address public slashReceiver; + + /// @notice Minimum burner router delay. + uint256 public minBurnerRouterDelay; + /// @notice Mapping of a validator's BLS public key to its validator record. mapping(bytes blsPubkey => IMevCommitMiddleware.ValidatorRecord) public validatorRecords; diff --git a/contracts/contracts/validator-registry/middleware/README.md b/contracts/contracts/validator-registry/middleware/README.md index 9c910a02c..f85619f2e 100644 --- a/contracts/contracts/validator-registry/middleware/README.md +++ b/contracts/contracts/validator-registry/middleware/README.md @@ -126,6 +126,28 @@ The described process considers Symbiotic's current design, where it's possible 1. `requestSlash` must be called before `epochDuration` - `vetoDuration` (equal to `slashPeriodSeconds` for our network) has passed since `captureTimestamp`, [source](https://github.com/symbioticfi/core/blob/629b9faac2377a9eb9cfdc6362b30d1dc1ef48f2/src/contracts/slasher/VetoSlasher.sol#L93). 2. `executeSlash` must be called before `epochDuration` has passed since `captureTimestamp`, [source](https://github.com/symbioticfi/core/blob/629b9faac2377a9eb9cfdc6362b30d1dc1ef48f2/src/contracts/slasher/VetoSlasher.sol#L152). +### Burner Router Requirements + +Any vault integrating with the mev-commit middleware contract must use a [burner router](https://docs.symbiotic.fi/modules/extensions/burners#burner-router). This is validated by the symbiotic core `BurnerRouterFactory` contract. Prior to vault and validator registration, the burner router must be configured as follows: + +* `IBurnerRouter.networkReceiver()` must be set to `MevCommitMiddlewareStorage.slashReceiver`. +* `IBurnerRouter.delay()` must be greater than `MevCommitMiddlewareStorage.minBurnerRouterDelay`, a suggested value for the latter param is `2 days`. +* `IBurnerRouter.operatorNetworkReceiver()` must be disable by setting to `address(0)`, or set to `MevCommitMiddlewareStorage.slashReceiver`. Essentially this value must not override a valid network receiver. + +Upon vault registration, and validator registration, these conditions are checked. If later on, these conditions are not met, all validators associated to a vault will no longer be opted-in, as enforced in `_isValidatorOptedIn`. + +### Vault Trust Assumptions + +For vaults that use burner routers, the following scenario is possible. The vault can create a network and specify its own receiver for that network, which will transfer funds to a vault-owned address. A validator represented by this vault could then act maliciously. As soon as the vault realizes/confirms that it has misbehaved w.r.t the mev-commit network, the vault would be slashed from its custom network, transferring vault collateral away from the vault, and thus avoiding losing funds to the mev-commit slash. + +Due to this scenario, the mev-commit network must fully trust all vaults that integrate with the middleware contract. Note `registerVaults` and related functions are `onlyOwner`, allowing the owner to choose its trusted vault set. + +To alleviate the described vault issue, the mev-commit middleware contract enforces a minimum burner router delay, allowing time for off-chain monitoring services to observe pending changes in vault state, and try to detect malicious behavior. Failed slashing attempts will also be monitored off-chain, and if a vault is found to be maliciously escaping slashing, they will be immediately deregistered, hopefully prior to enacting the malicious behavior with multiple validators. + +Further, the described scenario carries significant reputational risks. Large vaults engaging in such actions would essentially ruin their reputation and ability to continue operating in the Symbiotic ecosystem. Thus, we assume that well known vaults have little incentive to perform the attack. + +A future upgrade could introduce a trusted, primev curated vault, that would only integrate with mev-commit and select other trusted networks. + ### Configuration of slashPeriodSeconds `slashPeriodSeconds` must be set such that a mev-commit bidder knows all _currently opted-in_ block proposers from the current epoch, and next epoch, must deliver commitments, or are guaranteed slashable. @@ -149,8 +171,8 @@ A recommended value to assume for `oracleProcessingPeriod` is 60 minutes, althou ### Rewards -Operators and vault depositors will receive points commensurate with associated validator pubkey(s) being *opted-in* over time. When a Vault is represented by multiple validators, attribution is split evenly between the validators. +Vault depositors will receive points commensurate with associated validator pubkey(s) being *opted-in* over time. When a Vault is represented by multiple validators, attribution is split evenly between the validators. -Validator opt-in state can be queried as described above. This query offers concrete criteria that must be true for Vault depositors and Operators to accrue points/rewards over time from an associated validator. +Validator opt-in state can be queried as described above. This query offers concrete criteria that must be true for Vault depositors to accrue points/rewards over time from an associated validator. -Points/rewards for LST restakers would be computed off-chain, with heavy use of indexed events. The exact point weightings associated to different actors/events is yet to be finalized. +Points/rewards would be computed off-chain, with heavy use of indexed events. The exact point weightings associated to different actors/events is yet to be finalized. diff --git a/contracts/lib/burners b/contracts/lib/burners new file mode 160000 index 000000000..60a5eb87f --- /dev/null +++ b/contracts/lib/burners @@ -0,0 +1 @@ +Subproject commit 60a5eb87f196b62d48406b45cc3b19ef4be0e906 diff --git a/contracts/remappings.txt b/contracts/remappings.txt index 8c71a91ce..46b5f3dff 100644 --- a/contracts/remappings.txt +++ b/contracts/remappings.txt @@ -6,3 +6,4 @@ forge-std/=lib/forge-std/src/ @openzeppelin-contracts/=lib/openzeppelin-contracts/ eigenlayer-contracts/=lib/eigenlayer-contracts/ symbiotic-core/=lib/core/src/ +symbiotic-burners/=lib/burners/src/ diff --git a/contracts/scripts/validator-registry/middleware/DeployMiddleware.s.sol b/contracts/scripts/validator-registry/middleware/DeployMiddleware.s.sol index 8abd56dac..0773aa154 100644 --- a/contracts/scripts/validator-registry/middleware/DeployMiddleware.s.sol +++ b/contracts/scripts/validator-registry/middleware/DeployMiddleware.s.sol @@ -20,9 +20,12 @@ contract BaseDeploy is Script { IRegistry networkRegistry, IRegistry operatorRegistry, IRegistry vaultFactory, + IRegistry burnerRouterFactory, address network, uint256 slashPeriodSeconds, address slashOracle, + address slashReceiver, + uint256 minBurnerRouterDelay, address owner ) public returns (address) { console.log("Deploying MevCommitMiddleware on chain:", block.chainid); @@ -32,9 +35,12 @@ contract BaseDeploy is Script { networkRegistry, operatorRegistry, vaultFactory, + burnerRouterFactory, network, slashPeriodSeconds, slashOracle, + slashReceiver, + minBurnerRouterDelay, owner )) ); @@ -50,12 +56,15 @@ contract DeployHolesky is BaseDeploy { IRegistry constant public NETWORK_REGISTRY = IRegistry(SymbioticHoleskyDevnetConsts.NETWORK_REGISTRY); IRegistry constant public OPERATOR_REGISTRY = IRegistry(SymbioticHoleskyDevnetConsts.OPERATOR_REGISTRY); IRegistry constant public VAULT_FACTORY = IRegistry(SymbioticHoleskyDevnetConsts.VAULT_FACTORY); - + IRegistry constant public BURNER_ROUTER_FACTORY = IRegistry(SymbioticHoleskyDevnetConsts.BURNER_ROUTER_FACTORY); + // On Holesky, use dev keystore account. On mainnet these will be the primev multisig. address constant public EXPECTED_MSG_SENDER = 0x4535bd6fF24860b5fd2889857651a85fb3d3C6b1; address constant public OWNER = EXPECTED_MSG_SENDER; address constant public NETWORK = EXPECTED_MSG_SENDER; address constant public SLASH_ORACLE = EXPECTED_MSG_SENDER; // Temporary placeholder until oracle implements slashing. + address constant public SLASH_RECEIVER = EXPECTED_MSG_SENDER; + uint256 constant public MIN_BURNER_ROUTER_DELAY = 2 days; uint96 constant public SUBNETWORK_ID = 1; uint256 constant public VAULT1_MAX_NETWORK_LIMIT = 100000 ether; @@ -76,9 +85,12 @@ contract DeployHolesky is BaseDeploy { NETWORK_REGISTRY, OPERATOR_REGISTRY, VAULT_FACTORY, + BURNER_ROUTER_FACTORY, NETWORK, SLASH_PERIOD_SECONDS, SLASH_ORACLE, + SLASH_RECEIVER, + MIN_BURNER_ROUTER_DELAY, OWNER ); diff --git a/contracts/scripts/validator-registry/middleware/DeployMiddlewareWithMocks.s.sol b/contracts/scripts/validator-registry/middleware/DeployMiddlewareWithMocks.s.sol index ffaca03ae..78c7c5c14 100644 --- a/contracts/scripts/validator-registry/middleware/DeployMiddlewareWithMocks.s.sol +++ b/contracts/scripts/validator-registry/middleware/DeployMiddlewareWithMocks.s.sol @@ -12,6 +12,7 @@ import {MockDelegator} from "../../../test/validator-registry/middleware/MockDel import {MockVault} from "../../../test/validator-registry/middleware/MockVault.sol"; import {RegistryMock} from "../../../test/validator-registry/middleware/RegistryMock.sol"; import {IRegistry} from "symbiotic-core/interfaces/common/IRegistry.sol"; +import {MockBurnerRouter} from "../../../test/validator-registry/middleware/MockBurnerRouter.sol"; contract DeployMiddlewareWithMocks is Script { function run() external { @@ -21,11 +22,14 @@ contract DeployMiddlewareWithMocks is Script { RegistryMock networkRegistryMock = new RegistryMock(); RegistryMock operatorRegistryMock = new RegistryMock(); RegistryMock vaultFactoryMock = new RegistryMock(); + RegistryMock burnerRouterFactoryMock = new RegistryMock(); uint256 slashPeriodSeconds = 150; address network = msg.sender; address slashOracle = msg.sender; + address slashReceiver = msg.sender; address owner = msg.sender; + uint256 minBurnerRouterDelay = 15 minutes; networkRegistryMock.register(); @@ -35,9 +39,12 @@ contract DeployMiddlewareWithMocks is Script { IRegistry(networkRegistryMock), IRegistry(operatorRegistryMock), IRegistry(vaultFactoryMock), + IRegistry(burnerRouterFactoryMock), network, slashPeriodSeconds, slashOracle, + slashReceiver, + minBurnerRouterDelay, owner )) ); @@ -46,8 +53,10 @@ contract DeployMiddlewareWithMocks is Script { MockDelegator mockDelegator1 = new MockDelegator(15); MockDelegator mockDelegator2 = new MockDelegator(16); - MockVault vault1 = new MockVault(address(mockDelegator1), address(0), 10); - MockVault vault2 = new MockVault(address(mockDelegator2), address(0), 10); + MockBurnerRouter mockBurnerRouter = new MockBurnerRouter(15 minutes); + MockBurnerRouter mockBurnerRouter2 = new MockBurnerRouter(15 minutes); + MockVault vault1 = new MockVault(address(mockDelegator1), address(0), address(mockBurnerRouter), 10); + MockVault vault2 = new MockVault(address(mockDelegator2), address(0), address(mockBurnerRouter2), 10); console.log("MockDelegator 1 deployed to:", address(mockDelegator1)); console.log("MockDelegator 2 deployed to:", address(mockDelegator2)); diff --git a/contracts/scripts/validator-registry/middleware/ReleaseAddrConsts.s.sol b/contracts/scripts/validator-registry/middleware/ReleaseAddrConsts.s.sol index a106eb631..70246ec91 100644 --- a/contracts/scripts/validator-registry/middleware/ReleaseAddrConsts.s.sol +++ b/contracts/scripts/validator-registry/middleware/ReleaseAddrConsts.s.sol @@ -1,8 +1,8 @@ // SPDX-License-Identifier: BSL 1.1 pragma solidity 0.8.26; -/// @notice Constants from https://docs.symbiotic.fi/deployments/ -/// @notice Last updated 10-28-2024 +/// @notice Constants from https://docs.symbiotic.fi/deployments/current +/// @notice Last updated 11-30-2024 library SymbioticHoleskyDevnetConsts { address internal constant VAULT_FACTORY = 0x407A039D94948484D356eFB765b3c74382A050B4; address internal constant DELEGATOR_FACTORY = 0x890CA3f95E0f40a79885B7400926544B2214B03f; @@ -21,4 +21,6 @@ library SymbioticHoleskyDevnetConsts { address internal constant VAULT_1 = 0xd88dDf98fE4d161a66FB836bee4Ca469eb0E4a75; address internal constant VAULT_1_DELEGATOR = 0x85CF967A8DDFAf8C0DFB9c75d9E92a3C785A6532; address internal constant VAULT_1_SLASHER = 0x57e5Fb61981fa1b43a074B2aeb47CCF157b19223; + + address internal constant BURNER_ROUTER_FACTORY = 0x32e2AfbdAffB1e675898ABA75868d92eE1E68f3b; } diff --git a/contracts/test/validator-registry/middleware/MevCommitMiddlewareTest.sol b/contracts/test/validator-registry/middleware/MevCommitMiddlewareTest.sol index ef3fd65e0..c201523b1 100644 --- a/contracts/test/validator-registry/middleware/MevCommitMiddlewareTest.sol +++ b/contracts/test/validator-registry/middleware/MevCommitMiddlewareTest.sol @@ -15,6 +15,7 @@ import {MockVault} from "./MockVault.sol"; import {MockVetoSlasher} from "./MockVetoSlasher.sol"; import {MockInstantSlasher} from "./MockInstantSlasher.sol"; import {MockDelegator} from "./MockDelegator.sol"; +import {MockBurnerRouter} from "./MockBurnerRouter.sol"; import {Checkpoints} from "@openzeppelin/contracts/utils/structs/Checkpoints.sol"; contract MevCommitMiddlewareTest is Test { @@ -22,9 +23,12 @@ contract MevCommitMiddlewareTest is Test { RegistryMock public networkRegistryMock; RegistryMock public operatorRegistryMock; RegistryMock public vaultFactoryMock; + RegistryMock public burnerRouterFactoryMock; address public network; uint256 public slashPeriodSeconds; address public slashOracle; + address public slashReceiver; + uint256 public minBurnerRouterDelay; address public owner; MevCommitMiddleware public mevCommitMiddleware; @@ -33,6 +37,8 @@ contract MevCommitMiddlewareTest is Test { MockDelegator public mockDelegator2; MockVault public vault1; MockVault public vault2; + MockBurnerRouter public mockBurnerRouter; + MockBurnerRouter public mockBurnerRouter2; bytes public sampleValPubkey1 = hex"b61a6e5f09217278efc7ddad4dc4b0553b2c076d4a5fef6509c233a6531c99146347193467e84eb5ca921af1b8254b3f"; bytes public sampleValPubkey2 = hex"aca4b5c5daf5b39514b8aa6e5f303d29f6f1bd891e5f6b6b2ae6e2ae5d95dee31cd78630c1115b6e90f3da1a66cf8edb"; @@ -70,11 +76,14 @@ contract MevCommitMiddlewareTest is Test { networkRegistryMock = new RegistryMock(); operatorRegistryMock = new RegistryMock(); vaultFactoryMock = new RegistryMock(); + burnerRouterFactoryMock = new RegistryMock(); network = vm.addr(0x1); slashPeriodSeconds = 150 hours; slashOracle = vm.addr(0x2); - owner = vm.addr(0x3); + slashReceiver = vm.addr(0x3); + minBurnerRouterDelay = 2 days; + owner = vm.addr(0x4); // Network addr must be registered with the network registry vm.prank(network); @@ -86,9 +95,12 @@ contract MevCommitMiddlewareTest is Test { IRegistry(networkRegistryMock), IRegistry(operatorRegistryMock), IRegistry(vaultFactoryMock), + IRegistry(burnerRouterFactoryMock), network, slashPeriodSeconds, slashOracle, + slashReceiver, + minBurnerRouterDelay, owner )) ); @@ -97,8 +109,9 @@ contract MevCommitMiddlewareTest is Test { mockDelegator1 = new MockDelegator(15); mockDelegator2 = new MockDelegator(16); uint48 epochDuration = 10 hours; - vault1 = new MockVault(address(mockDelegator1), address(0), epochDuration); - vault2 = new MockVault(address(mockDelegator2), address(0), epochDuration); + address emptyBurner = address(0); + vault1 = new MockVault(address(mockDelegator1), address(0), emptyBurner, epochDuration); + vault2 = new MockVault(address(mockDelegator2), address(0), emptyBurner, epochDuration); } function test_setters() public { @@ -641,6 +654,52 @@ contract MevCommitMiddlewareTest is Test { MockVault(vault2).setEpochDuration(157 hours); MockVault(vault1).setEpochDuration(157 hours); + vm.prank(owner); + vm.expectRevert( + abi.encodeWithSelector(IMevCommitMiddleware.InvalidVaultBurner.selector, vault1) + ); + mevCommitMiddleware.registerVaults(vaults, slashAmounts); + + mockBurnerRouter = new MockBurnerRouter(15 minutes); + mockBurnerRouter2 = new MockBurnerRouter(15 minutes); + + vm.prank(address(mockBurnerRouter)); + burnerRouterFactoryMock.register(); + vm.prank(address(mockBurnerRouter2)); + burnerRouterFactoryMock.register(); + + vault1.setBurner(address(mockBurnerRouter)); + vault2.setBurner(address(mockBurnerRouter2)); + + vm.prank(owner); + vm.expectRevert( + abi.encodeWithSelector(IMevCommitMiddleware.InvalidVaultBurner.selector, vault1) + ); + mevCommitMiddleware.registerVaults(vaults, slashAmounts); + + mockBurnerRouter.setNetworkReceiver(network, vm.addr(0x1143242)); + mockBurnerRouter2.setNetworkReceiver(network, vm.addr(0x1143243)); + + vm.prank(owner); + vm.expectRevert( + abi.encodeWithSelector(IMevCommitMiddleware.InvalidVaultBurner.selector, vault1) + ); + mevCommitMiddleware.registerVaults(vaults, slashAmounts); + + mockBurnerRouter.setNetworkReceiver(network, slashReceiver); + mockBurnerRouter2.setNetworkReceiver(network, slashReceiver); + + vm.prank(owner); + vm.expectRevert( + abi.encodeWithSelector(IMevCommitMiddleware.InvalidVaultBurner.selector, vault1) + ); + mevCommitMiddleware.registerVaults(vaults, slashAmounts); + + mockBurnerRouter.setDelay(3 days); + mockBurnerRouter2.setDelay(3 days); + + // No more errors relevant to vault 1 + vm.prank(owner); vm.expectRevert( abi.encodeWithSelector(IMevCommitMiddleware.UnknownSlasherType.selector, vault2, 88) diff --git a/contracts/test/validator-registry/middleware/MevCommitMiddlewareTestCont.sol b/contracts/test/validator-registry/middleware/MevCommitMiddlewareTestCont.sol index d718b81d6..801c736cd 100644 --- a/contracts/test/validator-registry/middleware/MevCommitMiddlewareTestCont.sol +++ b/contracts/test/validator-registry/middleware/MevCommitMiddlewareTestCont.sol @@ -8,6 +8,7 @@ import {MevCommitMiddlewareTest} from "./MevCommitMiddlewareTest.sol"; import {MockVetoSlasher} from "./MockVetoSlasher.sol"; import {MockInstantSlasher} from "./MockInstantSlasher.sol"; import {MockDelegator} from "./MockDelegator.sol"; +import {MockBurnerRouter} from "./MockBurnerRouter.sol"; contract MevCommitMiddlewareTestCont is MevCommitMiddlewareTest { @@ -72,6 +73,17 @@ contract MevCommitMiddlewareTestCont is MevCommitMiddlewareTest { vm.prank(address(vault2)); vaultFactoryMock.register(); + mockBurnerRouter = new MockBurnerRouter(2 days); + mockBurnerRouter2 = new MockBurnerRouter(2 days); + vm.prank(address(mockBurnerRouter)); + burnerRouterFactoryMock.register(); + vm.prank(address(mockBurnerRouter2)); + burnerRouterFactoryMock.register(); + vault1.setBurner(address(mockBurnerRouter)); + vault2.setBurner(address(mockBurnerRouter2)); + mockBurnerRouter.setNetworkReceiver(network, slashReceiver); + mockBurnerRouter2.setNetworkReceiver(network, slashReceiver); + vm.prank(owner); mevCommitMiddleware.registerVaults(vaults, slashAmounts); @@ -137,9 +149,54 @@ contract MevCommitMiddlewareTestCont is MevCommitMiddlewareTest { vault1.setEpochDuration(151 hours); vault2.setEpochDuration(151 hours + 5 hours); + mockBurnerRouter = new MockBurnerRouter(3 days); + mockBurnerRouter2 = new MockBurnerRouter(3 days); + vm.prank(address(mockBurnerRouter)); + burnerRouterFactoryMock.register(); + vm.prank(address(mockBurnerRouter2)); + burnerRouterFactoryMock.register(); + vault1.setBurner(address(mockBurnerRouter)); + vault2.setBurner(address(mockBurnerRouter2)); + mockBurnerRouter.setNetworkReceiver(network, slashReceiver); + mockBurnerRouter2.setNetworkReceiver(network, slashReceiver); + vm.prank(owner); mevCommitMiddleware.registerVaults(vaults, slashAmounts); + bytes[][] memory blsPubkeys = new bytes[][](2); + blsPubkeys[0] = new bytes[](3); + blsPubkeys[0][0] = sampleValPubkey1; + blsPubkeys[0][1] = sampleValPubkey2; + blsPubkeys[0][2] = sampleValPubkey3; + blsPubkeys[1] = new bytes[](3); + blsPubkeys[1][0] = sampleValPubkey4; + blsPubkeys[1][1] = sampleValPubkey5; + blsPubkeys[1][2] = sampleValPubkey6; + + uint256 invalidDelay = 15 minutes; + mockBurnerRouter.setDelay(invalidDelay); + vm.prank(operator1); + vm.expectRevert( + abi.encodeWithSelector(IMevCommitMiddleware.InvalidVaultBurnerConsideringOperator.selector, + address(vault1), operator1) + ); + mevCommitMiddleware.registerValidators(blsPubkeys, vaults); + + uint256 validDelay = 5 days; + mockBurnerRouter.setDelay(validDelay); + address invalidReceiver = vm.addr(0x1117778); + mockBurnerRouter.setOperatorNetworkReceiver(network, operator1, invalidReceiver); + + vm.prank(operator1); + vm.expectRevert( + abi.encodeWithSelector(IMevCommitMiddleware.InvalidVaultBurnerConsideringOperator.selector, + address(vault1), operator1) + ); + mevCommitMiddleware.registerValidators(blsPubkeys, vaults); + + address validReceiver = slashReceiver; + mockBurnerRouter.setOperatorNetworkReceiver(network, operator1, validReceiver); + // delegator 1 (associated with vault 1) allocates 29 stake to operator 1 mockDelegator1.setStake(operator1, 29); @@ -152,16 +209,6 @@ contract MevCommitMiddlewareTestCont is MevCommitMiddlewareTest { potentialSlashableVals = mevCommitMiddleware.potentialSlashableValidators(address(vault2), operator1); assertEq(potentialSlashableVals, 2); - bytes[][] memory blsPubkeys = new bytes[][](2); - blsPubkeys[0] = new bytes[](3); - blsPubkeys[0][0] = sampleValPubkey1; - blsPubkeys[0][1] = sampleValPubkey2; - blsPubkeys[0][2] = sampleValPubkey3; - blsPubkeys[1] = new bytes[](3); - blsPubkeys[1][0] = sampleValPubkey4; - blsPubkeys[1][1] = sampleValPubkey5; - blsPubkeys[1][2] = sampleValPubkey6; - vm.prank(operator1); vm.expectRevert( abi.encodeWithSelector(IMevCommitMiddleware.ValidatorsNotSlashable.selector, @@ -1238,6 +1285,32 @@ contract MevCommitMiddlewareTestCont is MevCommitMiddlewareTest { mevCommitMiddleware.getSlashAmountAt(address(vault1), 0); } + function test_ValidatorOptedOutIfBurnerBecomesInvalid() public { + test_registerValidators(); + assertTrue(mevCommitMiddleware.isValidatorOptedIn(sampleValPubkey1)); + + mockBurnerRouter.setDelay(60 minutes); + assertFalse(mevCommitMiddleware.isValidatorOptedIn(sampleValPubkey1)); + mockBurnerRouter.setDelay(6 days); + assertTrue(mevCommitMiddleware.isValidatorOptedIn(sampleValPubkey1)); + + address operator1 = vm.addr(0x1117); + mockBurnerRouter.setOperatorNetworkReceiver(network, operator1, address(0x23423)); + assertFalse(mevCommitMiddleware.isValidatorOptedIn(sampleValPubkey1)); + mockBurnerRouter.setOperatorNetworkReceiver(network, operator1, address(0)); + assertTrue(mevCommitMiddleware.isValidatorOptedIn(sampleValPubkey1)); + + mockBurnerRouter.setOperatorNetworkReceiver(network, operator1, slashReceiver); + assertTrue(mevCommitMiddleware.isValidatorOptedIn(sampleValPubkey1)); + + mockBurnerRouter.setNetworkReceiver(network, address(0)); + assertFalse(mevCommitMiddleware.isValidatorOptedIn(sampleValPubkey1)); + mockBurnerRouter.setNetworkReceiver(network, vm.addr(0x23423)); + assertFalse(mevCommitMiddleware.isValidatorOptedIn(sampleValPubkey1)); + mockBurnerRouter.setNetworkReceiver(network, slashReceiver); + assertTrue(mevCommitMiddleware.isValidatorOptedIn(sampleValPubkey1)); + } + function test_isValidatorOptedInBadKey() public view { bytes memory badKey = bytes("0x1234"); assertFalse(mevCommitMiddleware.isValidatorOptedIn(badKey)); diff --git a/contracts/test/validator-registry/middleware/MockBurnerRouter.sol b/contracts/test/validator-registry/middleware/MockBurnerRouter.sol new file mode 100644 index 000000000..063096154 --- /dev/null +++ b/contracts/test/validator-registry/middleware/MockBurnerRouter.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: BSL 1.1 +pragma solidity 0.8.26; + +contract MockBurnerRouter { + uint256 public delay; + mapping(address network => address receiver) public networkReceiver; + mapping(address network => mapping(address operator => address receiver)) public operatorNetworkReceiver; + + constructor(uint256 delay_) { + delay = delay_; + } + + function setDelay(uint256 delay_) external { + delay = delay_; + } + + function setNetworkReceiver(address network, address receiver) external { + networkReceiver[network] = receiver; + } + + function setOperatorNetworkReceiver(address network, address operator, address receiver) external { + operatorNetworkReceiver[network][operator] = receiver; + } +} diff --git a/contracts/test/validator-registry/middleware/MockVault.sol b/contracts/test/validator-registry/middleware/MockVault.sol index 67e1e869b..23a1d1d1b 100644 --- a/contracts/test/validator-registry/middleware/MockVault.sol +++ b/contracts/test/validator-registry/middleware/MockVault.sol @@ -4,11 +4,13 @@ pragma solidity 0.8.26; contract MockVault { address public delegator; address public slasher; + address public burner; uint48 private _epochDuration; - constructor(address _delegator, address _slasher, uint48 epochDuration_) { + constructor(address _delegator, address _slasher, address _burner, uint48 epochDuration_) { delegator = _delegator; slasher = _slasher; + burner = _burner; _epochDuration = epochDuration_; } @@ -20,6 +22,10 @@ contract MockVault { _epochDuration = epochDuration_; } + function setBurner(address _burner) external { + burner = _burner; + } + function epochDuration() external view returns (uint48) { return _epochDuration; }