Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
To
|
Amount
|
||
|---|---|---|---|---|---|---|---|
| Get Queue Config | 1222333 | 124 days ago | 0 ETH | ||||
| Get Keys Limit | 1222333 | 124 days ago | 0 ETH | ||||
| Get Queue Config | 1220003 | 125 days ago | 0 ETH | ||||
| Get Queue Config | 1220001 | 125 days ago | 0 ETH | ||||
| Get Keys Limit | 1220001 | 125 days ago | 0 ETH | ||||
| Get Key Removal ... | 1219992 | 125 days ago | 0 ETH | ||||
| QUEUE_LEGACY_PRI... | 1216629 | 125 days ago | 0 ETH | ||||
| QUEUE_LOWEST_PRI... | 1216629 | 125 days ago | 0 ETH | ||||
| Get Queue Config | 1203466 | 127 days ago | 0 ETH | ||||
| Get Key Removal ... | 1203466 | 127 days ago | 0 ETH | ||||
| Get Queue Config | 1201783 | 127 days ago | 0 ETH | ||||
| Get Keys Limit | 1201783 | 127 days ago | 0 ETH | ||||
| Get Bad Performa... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Max Withdraw... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Strikes Para... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Bad Performa... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Max Withdraw... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Strikes Para... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Bad Performa... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Max Withdraw... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Strikes Para... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Bad Performa... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Max Withdraw... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Strikes Para... | 1198211 | 128 days ago | 0 ETH | ||||
| Get Bad Performa... | 1198211 | 128 days ago | 0 ETH |
Loading...
Loading
Loading...
Loading
Contract Name:
CSParametersRegistry
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 160 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-FileCopyrightText: 2025 Lido <[email protected]> // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.24; import { AccessControlEnumerableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/extensions/AccessControlEnumerableUpgradeable.sol"; import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import { SafeCast } from "@openzeppelin/contracts/utils/math/SafeCast.sol"; import { ICSParametersRegistry } from "./interfaces/ICSParametersRegistry.sol"; /// @dev There are no upper limit checks except for the basis points (BP) values /// since with the introduction of Dual Governance any malicious changes to the parameters can be objected by stETH holders. // solhint-disable-next-line max-states-count contract CSParametersRegistry is ICSParametersRegistry, Initializable, AccessControlEnumerableUpgradeable { using SafeCast for uint256; /// @dev Maximal value for basis points (BP) /// 1 BP = 0.01% uint256 internal constant MAX_BP = 10000; /// @dev QUEUE_LOWEST_PRIORITY identifies the range of available priorities: [0; QUEUE_LOWEST_PRIORITY]. uint256 public immutable QUEUE_LOWEST_PRIORITY; /// @dev QUEUE_LEGACY_PRIORITY is the priority for the CSM v1 queue. uint256 public immutable QUEUE_LEGACY_PRIORITY; //////////////////////// // State variables below //////////////////////// uint256 public defaultKeyRemovalCharge; mapping(uint256 curveId => MarkedUint248) internal _keyRemovalCharges; uint256 public defaultElRewardsStealingAdditionalFine; mapping(uint256 curveId => MarkedUint248) internal _elRewardsStealingAdditionalFines; uint256 public defaultKeysLimit; mapping(uint256 curveId => MarkedUint248) internal _keysLimits; QueueConfig public defaultQueueConfig; mapping(uint256 curveId => QueueConfig) internal _queueConfigs; /// @dev Default value for the reward share. Can be only be set as a flat value due to possible sybil attacks /// Decreased reward share for some validators > N will promote sybils. Increased reward share for validators > N will give large operators an advantage uint256 public defaultRewardShare; mapping(uint256 curveId => KeyNumberValueInterval[]) internal _rewardShareData; /// @dev Default value for the performance leeway. Can be only be set as a flat value due to possible sybil attacks /// Decreased performance leeway for some validators > N will promote sybils. Increased performance leeway for validators > N will give large operators an advantage uint256 public defaultPerformanceLeeway; mapping(uint256 curveId => KeyNumberValueInterval[]) internal _performanceLeewayData; StrikesParams public defaultStrikesParams; mapping(uint256 curveId => StrikesParams) internal _strikesParams; uint256 public defaultBadPerformancePenalty; mapping(uint256 curveId => MarkedUint248) internal _badPerformancePenalties; PerformanceCoefficients public defaultPerformanceCoefficients; mapping(uint256 curveId => PerformanceCoefficients) internal _performanceCoefficients; uint256 public defaultAllowedExitDelay; mapping(uint256 => uint256) internal _allowedExitDelay; uint256 public defaultExitDelayPenalty; mapping(uint256 => MarkedUint248) internal _exitDelayPenalties; uint256 public defaultMaxWithdrawalRequestFee; mapping(uint256 => MarkedUint248) internal _maxWithdrawalRequestFees; constructor(uint256 queueLowestPriority) { if (queueLowestPriority == 0) { revert ZeroQueueLowestPriority(); } QUEUE_LOWEST_PRIORITY = queueLowestPriority; QUEUE_LEGACY_PRIORITY = queueLowestPriority - 1; _disableInitializers(); } /// @notice initialize contract function initialize( address admin, InitializationData calldata data ) external initializer { if (admin == address(0)) { revert ZeroAdminAddress(); } _setDefaultKeyRemovalCharge(data.keyRemovalCharge); _setDefaultElRewardsStealingAdditionalFine( data.elRewardsStealingAdditionalFine ); _setDefaultKeysLimit(data.keysLimit); _setDefaultRewardShare(data.rewardShare); _setDefaultPerformanceLeeway(data.performanceLeeway); _setDefaultStrikesParams(data.strikesLifetime, data.strikesThreshold); _setDefaultBadPerformancePenalty(data.badPerformancePenalty); _setDefaultPerformanceCoefficients( data.attestationsWeight, data.blocksWeight, data.syncWeight ); _setDefaultQueueConfig( data.defaultQueuePriority, data.defaultQueueMaxDeposits ); _setDefaultAllowedExitDelay(data.defaultAllowedExitDelay); _setDefaultExitDelayPenalty(data.defaultExitDelayPenalty); _setDefaultMaxWithdrawalRequestFee(data.defaultMaxWithdrawalRequestFee); __AccessControlEnumerable_init(); _grantRole(DEFAULT_ADMIN_ROLE, admin); } /// @inheritdoc ICSParametersRegistry function setDefaultKeyRemovalCharge( uint256 keyRemovalCharge ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultKeyRemovalCharge(keyRemovalCharge); } /// @inheritdoc ICSParametersRegistry function setDefaultElRewardsStealingAdditionalFine( uint256 fine ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultElRewardsStealingAdditionalFine(fine); } /// @inheritdoc ICSParametersRegistry function setDefaultKeysLimit( uint256 limit ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultKeysLimit(limit); } /// @inheritdoc ICSParametersRegistry function setDefaultRewardShare( uint256 share ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultRewardShare(share); } /// @inheritdoc ICSParametersRegistry function setDefaultPerformanceLeeway( uint256 leeway ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultPerformanceLeeway(leeway); } /// @inheritdoc ICSParametersRegistry function setDefaultStrikesParams( uint256 lifetime, uint256 threshold ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultStrikesParams(lifetime, threshold); } /// @inheritdoc ICSParametersRegistry function setDefaultBadPerformancePenalty( uint256 penalty ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultBadPerformancePenalty(penalty); } /// @inheritdoc ICSParametersRegistry function setDefaultPerformanceCoefficients( uint256 attestationsWeight, uint256 blocksWeight, uint256 syncWeight ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultPerformanceCoefficients( attestationsWeight, blocksWeight, syncWeight ); } /// @inheritdoc ICSParametersRegistry function setDefaultQueueConfig( uint256 priority, uint256 maxDeposits ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultQueueConfig(priority, maxDeposits); } /// @inheritdoc ICSParametersRegistry function setDefaultAllowedExitDelay( uint256 delay ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultAllowedExitDelay(delay); } /// @inheritdoc ICSParametersRegistry function setDefaultExitDelayPenalty( uint256 penalty ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultExitDelayPenalty(penalty); } /// @inheritdoc ICSParametersRegistry function setDefaultMaxWithdrawalRequestFee( uint256 fee ) external onlyRole(DEFAULT_ADMIN_ROLE) { _setDefaultMaxWithdrawalRequestFee(fee); } /// @inheritdoc ICSParametersRegistry function setKeyRemovalCharge( uint256 curveId, uint256 keyRemovalCharge ) external onlyRole(DEFAULT_ADMIN_ROLE) { _keyRemovalCharges[curveId] = MarkedUint248( keyRemovalCharge.toUint248(), true ); emit KeyRemovalChargeSet(curveId, keyRemovalCharge); } /// @inheritdoc ICSParametersRegistry function unsetKeyRemovalCharge( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _keyRemovalCharges[curveId]; emit KeyRemovalChargeUnset(curveId); } /// @inheritdoc ICSParametersRegistry function setElRewardsStealingAdditionalFine( uint256 curveId, uint256 fine ) external onlyRole(DEFAULT_ADMIN_ROLE) { _elRewardsStealingAdditionalFines[curveId] = MarkedUint248( fine.toUint248(), true ); emit ElRewardsStealingAdditionalFineSet(curveId, fine); } /// @inheritdoc ICSParametersRegistry function unsetElRewardsStealingAdditionalFine( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _elRewardsStealingAdditionalFines[curveId]; emit ElRewardsStealingAdditionalFineUnset(curveId); } /// @inheritdoc ICSParametersRegistry function setKeysLimit( uint256 curveId, uint256 limit ) external onlyRole(DEFAULT_ADMIN_ROLE) { _keysLimits[curveId] = MarkedUint248(limit.toUint248(), true); emit KeysLimitSet(curveId, limit); } /// @inheritdoc ICSParametersRegistry function unsetKeysLimit( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _keysLimits[curveId]; emit KeysLimitUnset(curveId); } /// @inheritdoc ICSParametersRegistry function setRewardShareData( uint256 curveId, KeyNumberValueInterval[] calldata data ) external onlyRole(DEFAULT_ADMIN_ROLE) { _validateKeyNumberValueIntervals(data); KeyNumberValueInterval[] storage intervals = _rewardShareData[curveId]; if (intervals.length > 0) { delete _rewardShareData[curveId]; } for (uint256 i = 0; i < data.length; ++i) { intervals.push(data[i]); } emit RewardShareDataSet(curveId, data); } /// @inheritdoc ICSParametersRegistry function unsetRewardShareData( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _rewardShareData[curveId]; emit RewardShareDataUnset(curveId); } /// @inheritdoc ICSParametersRegistry function setPerformanceLeewayData( uint256 curveId, KeyNumberValueInterval[] calldata data ) external onlyRole(DEFAULT_ADMIN_ROLE) { _validateKeyNumberValueIntervals(data); KeyNumberValueInterval[] storage intervals = _performanceLeewayData[ curveId ]; if (intervals.length > 0) { delete _performanceLeewayData[curveId]; } for (uint256 i = 0; i < data.length; ++i) { intervals.push(data[i]); } emit PerformanceLeewayDataSet(curveId, data); } /// @inheritdoc ICSParametersRegistry function unsetPerformanceLeewayData( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _performanceLeewayData[curveId]; emit PerformanceLeewayDataUnset(curveId); } /// @inheritdoc ICSParametersRegistry function setStrikesParams( uint256 curveId, uint256 lifetime, uint256 threshold ) external onlyRole(DEFAULT_ADMIN_ROLE) { _validateStrikesParams(lifetime, threshold); _strikesParams[curveId] = StrikesParams( lifetime.toUint32(), threshold.toUint32() ); emit StrikesParamsSet(curveId, lifetime, threshold); } /// @inheritdoc ICSParametersRegistry function unsetStrikesParams( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _strikesParams[curveId]; emit StrikesParamsUnset(curveId); } /// @inheritdoc ICSParametersRegistry function setBadPerformancePenalty( uint256 curveId, uint256 penalty ) external onlyRole(DEFAULT_ADMIN_ROLE) { _badPerformancePenalties[curveId] = MarkedUint248( penalty.toUint248(), true ); emit BadPerformancePenaltySet(curveId, penalty); } /// @inheritdoc ICSParametersRegistry function unsetBadPerformancePenalty( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _badPerformancePenalties[curveId]; emit BadPerformancePenaltyUnset(curveId); } /// @inheritdoc ICSParametersRegistry function setPerformanceCoefficients( uint256 curveId, uint256 attestationsWeight, uint256 blocksWeight, uint256 syncWeight ) external onlyRole(DEFAULT_ADMIN_ROLE) { _validatePerformanceCoefficients( attestationsWeight, blocksWeight, syncWeight ); _performanceCoefficients[curveId] = PerformanceCoefficients( attestationsWeight.toUint32(), blocksWeight.toUint32(), syncWeight.toUint32() ); emit PerformanceCoefficientsSet( curveId, attestationsWeight, blocksWeight, syncWeight ); } /// @inheritdoc ICSParametersRegistry function unsetPerformanceCoefficients( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _performanceCoefficients[curveId]; emit PerformanceCoefficientsUnset(curveId); } /// @inheritdoc ICSParametersRegistry function setQueueConfig( uint256 curveId, uint256 priority, uint256 maxDeposits ) external onlyRole(DEFAULT_ADMIN_ROLE) { _validateQueueConfig(priority, maxDeposits); _queueConfigs[curveId] = QueueConfig({ priority: priority.toUint32(), maxDeposits: maxDeposits.toUint32() }); emit QueueConfigSet(curveId, priority, maxDeposits); } /// @inheritdoc ICSParametersRegistry function unsetQueueConfig( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _queueConfigs[curveId]; emit QueueConfigUnset(curveId); } /// @inheritdoc ICSParametersRegistry function setAllowedExitDelay( uint256 curveId, uint256 delay ) external onlyRole(DEFAULT_ADMIN_ROLE) { _validateAllowedExitDelay(delay); _allowedExitDelay[curveId] = delay; emit AllowedExitDelaySet(curveId, delay); } /// @inheritdoc ICSParametersRegistry function unsetAllowedExitDelay( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _allowedExitDelay[curveId]; emit AllowedExitDelayUnset(curveId); } /// @inheritdoc ICSParametersRegistry function setExitDelayPenalty( uint256 curveId, uint256 penalty ) external onlyRole(DEFAULT_ADMIN_ROLE) { _exitDelayPenalties[curveId] = MarkedUint248(penalty.toUint248(), true); emit ExitDelayPenaltySet(curveId, penalty); } /// @inheritdoc ICSParametersRegistry function unsetExitDelayPenalty( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _exitDelayPenalties[curveId]; emit ExitDelayPenaltyUnset(curveId); } /// @inheritdoc ICSParametersRegistry function setMaxWithdrawalRequestFee( uint256 curveId, uint256 fee ) external onlyRole(DEFAULT_ADMIN_ROLE) { _maxWithdrawalRequestFees[curveId] = MarkedUint248( fee.toUint248(), true ); emit MaxWithdrawalRequestFeeSet(curveId, fee); } /// @inheritdoc ICSParametersRegistry function unsetMaxWithdrawalRequestFee( uint256 curveId ) external onlyRole(DEFAULT_ADMIN_ROLE) { delete _maxWithdrawalRequestFees[curveId]; emit MaxWithdrawalRequestFeeUnset(curveId); } /// @inheritdoc ICSParametersRegistry function getKeyRemovalCharge( uint256 curveId ) external view returns (uint256 keyRemovalCharge) { MarkedUint248 storage data = _keyRemovalCharges[curveId]; return data.isValue ? data.value : defaultKeyRemovalCharge; } /// @inheritdoc ICSParametersRegistry function getElRewardsStealingAdditionalFine( uint256 curveId ) external view returns (uint256 fine) { MarkedUint248 storage data = _elRewardsStealingAdditionalFines[curveId]; return data.isValue ? data.value : defaultElRewardsStealingAdditionalFine; } /// @inheritdoc ICSParametersRegistry function getKeysLimit( uint256 curveId ) external view returns (uint256 limit) { MarkedUint248 storage data = _keysLimits[curveId]; return data.isValue ? data.value : defaultKeysLimit; } /// @inheritdoc ICSParametersRegistry function getRewardShareData( uint256 curveId ) external view returns (KeyNumberValueInterval[] memory data) { data = _rewardShareData[curveId]; if (data.length == 0) { data = new KeyNumberValueInterval[](1); data[0] = KeyNumberValueInterval(1, defaultRewardShare); } } /// @inheritdoc ICSParametersRegistry function getPerformanceLeewayData( uint256 curveId ) external view returns (KeyNumberValueInterval[] memory data) { data = _performanceLeewayData[curveId]; if (data.length == 0) { data = new KeyNumberValueInterval[](1); data[0] = KeyNumberValueInterval(1, defaultPerformanceLeeway); } } /// @inheritdoc ICSParametersRegistry function getStrikesParams( uint256 curveId ) external view returns (uint256 lifetime, uint256 threshold) { StrikesParams storage params = _strikesParams[curveId]; if (params.threshold == 0) { return ( defaultStrikesParams.lifetime, defaultStrikesParams.threshold ); } return (params.lifetime, params.threshold); } /// @inheritdoc ICSParametersRegistry function getBadPerformancePenalty( uint256 curveId ) external view returns (uint256 penalty) { MarkedUint248 storage data = _badPerformancePenalties[curveId]; return data.isValue ? data.value : defaultBadPerformancePenalty; } /// @inheritdoc ICSParametersRegistry function getPerformanceCoefficients( uint256 curveId ) external view returns ( uint256 attestationsWeight, uint256 blocksWeight, uint256 syncWeight ) { PerformanceCoefficients storage coefficients = _performanceCoefficients[ curveId ]; if ( coefficients.attestationsWeight == 0 && coefficients.blocksWeight == 0 && coefficients.syncWeight == 0 ) { return ( defaultPerformanceCoefficients.attestationsWeight, defaultPerformanceCoefficients.blocksWeight, defaultPerformanceCoefficients.syncWeight ); } return ( coefficients.attestationsWeight, coefficients.blocksWeight, coefficients.syncWeight ); } /// @inheritdoc ICSParametersRegistry function getQueueConfig( uint256 curveId ) external view returns (uint32 queuePriority, uint32 maxDeposits) { QueueConfig storage config = _queueConfigs[curveId]; if (config.maxDeposits == 0) { return ( defaultQueueConfig.priority, defaultQueueConfig.maxDeposits ); } return (config.priority, config.maxDeposits); } /// @inheritdoc ICSParametersRegistry function getAllowedExitDelay( uint256 curveId ) external view returns (uint256 delay) { delay = _allowedExitDelay[curveId]; if (delay == 0) { return defaultAllowedExitDelay; } } /// @inheritdoc ICSParametersRegistry function getExitDelayPenalty( uint256 curveId ) external view returns (uint256 penalty) { MarkedUint248 memory data = _exitDelayPenalties[curveId]; return data.isValue ? data.value : defaultExitDelayPenalty; } /// @inheritdoc ICSParametersRegistry function getMaxWithdrawalRequestFee( uint256 curveId ) external view returns (uint256 fee) { MarkedUint248 memory data = _maxWithdrawalRequestFees[curveId]; return data.isValue ? data.value : defaultMaxWithdrawalRequestFee; } /// @inheritdoc ICSParametersRegistry function getInitializedVersion() external view returns (uint64) { return _getInitializedVersion(); } function _setDefaultKeyRemovalCharge(uint256 keyRemovalCharge) internal { defaultKeyRemovalCharge = keyRemovalCharge; emit DefaultKeyRemovalChargeSet(keyRemovalCharge); } function _setDefaultElRewardsStealingAdditionalFine(uint256 fine) internal { defaultElRewardsStealingAdditionalFine = fine; emit DefaultElRewardsStealingAdditionalFineSet(fine); } function _setDefaultKeysLimit(uint256 limit) internal { defaultKeysLimit = limit; emit DefaultKeysLimitSet(limit); } function _setDefaultRewardShare(uint256 share) internal { if (share > MAX_BP) { revert InvalidRewardShareData(); } defaultRewardShare = share; emit DefaultRewardShareSet(share); } function _setDefaultPerformanceLeeway(uint256 leeway) internal { if (leeway > MAX_BP) { revert InvalidPerformanceLeewayData(); } defaultPerformanceLeeway = leeway; emit DefaultPerformanceLeewaySet(leeway); } function _setDefaultStrikesParams( uint256 lifetime, uint256 threshold ) internal { _validateStrikesParams(lifetime, threshold); defaultStrikesParams = StrikesParams({ lifetime: lifetime.toUint32(), threshold: threshold.toUint32() }); emit DefaultStrikesParamsSet(lifetime, threshold); } function _setDefaultBadPerformancePenalty(uint256 penalty) internal { defaultBadPerformancePenalty = penalty; emit DefaultBadPerformancePenaltySet(penalty); } function _setDefaultPerformanceCoefficients( uint256 attestationsWeight, uint256 blocksWeight, uint256 syncWeight ) internal { _validatePerformanceCoefficients( attestationsWeight, blocksWeight, syncWeight ); defaultPerformanceCoefficients = PerformanceCoefficients({ attestationsWeight: attestationsWeight.toUint32(), blocksWeight: blocksWeight.toUint32(), syncWeight: syncWeight.toUint32() }); emit DefaultPerformanceCoefficientsSet( attestationsWeight, blocksWeight, syncWeight ); } function _setDefaultQueueConfig( uint256 priority, uint256 maxDeposits ) internal { _validateQueueConfig(priority, maxDeposits); defaultQueueConfig = QueueConfig({ priority: priority.toUint32(), maxDeposits: maxDeposits.toUint32() }); emit DefaultQueueConfigSet(priority, maxDeposits); } function _setDefaultAllowedExitDelay(uint256 delay) internal { _validateAllowedExitDelay(delay); defaultAllowedExitDelay = delay; emit DefaultAllowedExitDelaySet(delay); } function _setDefaultExitDelayPenalty(uint256 penalty) internal { defaultExitDelayPenalty = penalty; emit DefaultExitDelayPenaltySet(penalty); } function _setDefaultMaxWithdrawalRequestFee(uint256 fee) internal { defaultMaxWithdrawalRequestFee = fee; emit DefaultMaxWithdrawalRequestFeeSet(fee); } function _validateQueueConfig( uint256 priority, uint256 maxDeposits ) internal view { if ( priority > QUEUE_LOWEST_PRIORITY || priority == QUEUE_LEGACY_PRIORITY ) { revert QueueCannotBeUsed(); } if (maxDeposits == 0) { revert ZeroMaxDeposits(); } } function _validateStrikesParams( uint256 lifetime, uint256 threshold ) internal pure { if (threshold == 0 || lifetime == 0) { revert InvalidStrikesParams(); } } function _validateAllowedExitDelay(uint256 delay) internal pure { if (delay == 0) { revert InvalidAllowedExitDelay(); } } function _validatePerformanceCoefficients( uint256 attestationsWeight, uint256 blocksWeight, uint256 syncWeight ) internal pure { if (attestationsWeight == 0 && blocksWeight == 0 && syncWeight == 0) { revert InvalidPerformanceCoefficients(); } } function _validateKeyNumberValueIntervals( KeyNumberValueInterval[] calldata intervals ) private pure { if (intervals.length == 0) { revert InvalidKeyNumberValueIntervals(); } if (intervals[0].minKeyNumber != 1) { revert InvalidKeyNumberValueIntervals(); } if (intervals[0].value > MAX_BP) { revert InvalidKeyNumberValueIntervals(); } for (uint256 i = 1; i < intervals.length; ++i) { unchecked { if ( intervals[i].minKeyNumber <= intervals[i - 1].minKeyNumber ) { revert InvalidKeyNumberValueIntervals(); } if (intervals[i].value > MAX_BP) { revert InvalidKeyNumberValueIntervals(); } } } } }
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/extensions/AccessControlEnumerable.sol)
pragma solidity ^0.8.20;
import {IAccessControlEnumerable} from "@openzeppelin/contracts/access/extensions/IAccessControlEnumerable.sol";
import {AccessControlUpgradeable} from "../AccessControlUpgradeable.sol";
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import {Initializable} from "../../proxy/utils/Initializable.sol";
/**
* @dev Extension of {AccessControl} that allows enumerating the members of each role.
*/
abstract contract AccessControlEnumerableUpgradeable is Initializable, IAccessControlEnumerable, AccessControlUpgradeable {
using EnumerableSet for EnumerableSet.AddressSet;
/// @custom:storage-location erc7201:openzeppelin.storage.AccessControlEnumerable
struct AccessControlEnumerableStorage {
mapping(bytes32 role => EnumerableSet.AddressSet) _roleMembers;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessControlEnumerable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant AccessControlEnumerableStorageLocation = 0xc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e82371705932000;
function _getAccessControlEnumerableStorage() private pure returns (AccessControlEnumerableStorage storage $) {
assembly {
$.slot := AccessControlEnumerableStorageLocation
}
}
function __AccessControlEnumerable_init() internal onlyInitializing {
}
function __AccessControlEnumerable_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) public view virtual returns (address) {
AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
return $._roleMembers[role].at(index);
}
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) public view virtual returns (uint256) {
AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
return $._roleMembers[role].length();
}
/**
* @dev Overload {AccessControl-_grantRole} to track enumerable memberships
*/
function _grantRole(bytes32 role, address account) internal virtual override returns (bool) {
AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
bool granted = super._grantRole(role, account);
if (granted) {
$._roleMembers[role].add(account);
}
return granted;
}
/**
* @dev Overload {AccessControl-_revokeRole} to track enumerable memberships
*/
function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) {
AccessControlEnumerableStorage storage $ = _getAccessControlEnumerableStorage();
bool revoked = super._revokeRole(role, account);
if (revoked) {
$._roleMembers[role].remove(account);
}
return revoked;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.20;
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Storage of the initializable contract.
*
* It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions
* when using with upgradeable contracts.
*
* @custom:storage-location erc7201:openzeppelin.storage.Initializable
*/
struct InitializableStorage {
/**
* @dev Indicates that the contract has been initialized.
*/
uint64 _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool _initializing;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;
/**
* @dev The contract is already initialized.
*/
error InvalidInitialization();
/**
* @dev The contract is not initializing.
*/
error NotInitializing();
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint64 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any
* number of times. This behavior in the constructor can be useful during testing and is not expected to be used in
* production.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
// Cache values to avoid duplicated sloads
bool isTopLevelCall = !$._initializing;
uint64 initialized = $._initialized;
// Allowed calls:
// - initialSetup: the contract is not in the initializing state and no previous version was
// initialized
// - construction: the contract is initialized at version 1 (no reininitialization) and the
// current contract is just being deployed
bool initialSetup = initialized == 0 && isTopLevelCall;
bool construction = initialized == 1 && address(this).code.length == 0;
if (!initialSetup && !construction) {
revert InvalidInitialization();
}
$._initialized = 1;
if (isTopLevelCall) {
$._initializing = true;
}
_;
if (isTopLevelCall) {
$._initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint64 version) {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing || $._initialized >= version) {
revert InvalidInitialization();
}
$._initialized = version;
$._initializing = true;
_;
$._initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
_checkInitializing();
_;
}
/**
* @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.
*/
function _checkInitializing() internal view virtual {
if (!_isInitializing()) {
revert NotInitializing();
}
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
// solhint-disable-next-line var-name-mixedcase
InitializableStorage storage $ = _getInitializableStorage();
if ($._initializing) {
revert InvalidInitialization();
}
if ($._initialized != type(uint64).max) {
$._initialized = type(uint64).max;
emit Initialized(type(uint64).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint64) {
return _getInitializableStorage()._initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _getInitializableStorage()._initializing;
}
/**
* @dev Returns a pointer to the storage namespace.
*/
// solhint-disable-next-line var-name-mixedcase
function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
assembly {
$.slot := INITIALIZABLE_STORAGE
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SafeCast.sol)
// This file was procedurally generated from scripts/generate/templates/SafeCast.js.
pragma solidity ^0.8.20;
/**
* @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
* checks.
*
* Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
* easily result in undesired exploitation or bugs, since developers usually
* assume that overflows raise errors. `SafeCast` restores this intuition by
* reverting the transaction when such an operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeCast {
/**
* @dev Value doesn't fit in an uint of `bits` size.
*/
error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);
/**
* @dev An int value doesn't fit in an uint of `bits` size.
*/
error SafeCastOverflowedIntToUint(int256 value);
/**
* @dev Value doesn't fit in an int of `bits` size.
*/
error SafeCastOverflowedIntDowncast(uint8 bits, int256 value);
/**
* @dev An uint value doesn't fit in an int of `bits` size.
*/
error SafeCastOverflowedUintToInt(uint256 value);
/**
* @dev Returns the downcasted uint248 from uint256, reverting on
* overflow (when the input is greater than largest uint248).
*
* Counterpart to Solidity's `uint248` operator.
*
* Requirements:
*
* - input must fit into 248 bits
*/
function toUint248(uint256 value) internal pure returns (uint248) {
if (value > type(uint248).max) {
revert SafeCastOverflowedUintDowncast(248, value);
}
return uint248(value);
}
/**
* @dev Returns the downcasted uint240 from uint256, reverting on
* overflow (when the input is greater than largest uint240).
*
* Counterpart to Solidity's `uint240` operator.
*
* Requirements:
*
* - input must fit into 240 bits
*/
function toUint240(uint256 value) internal pure returns (uint240) {
if (value > type(uint240).max) {
revert SafeCastOverflowedUintDowncast(240, value);
}
return uint240(value);
}
/**
* @dev Returns the downcasted uint232 from uint256, reverting on
* overflow (when the input is greater than largest uint232).
*
* Counterpart to Solidity's `uint232` operator.
*
* Requirements:
*
* - input must fit into 232 bits
*/
function toUint232(uint256 value) internal pure returns (uint232) {
if (value > type(uint232).max) {
revert SafeCastOverflowedUintDowncast(232, value);
}
return uint232(value);
}
/**
* @dev Returns the downcasted uint224 from uint256, reverting on
* overflow (when the input is greater than largest uint224).
*
* Counterpart to Solidity's `uint224` operator.
*
* Requirements:
*
* - input must fit into 224 bits
*/
function toUint224(uint256 value) internal pure returns (uint224) {
if (value > type(uint224).max) {
revert SafeCastOverflowedUintDowncast(224, value);
}
return uint224(value);
}
/**
* @dev Returns the downcasted uint216 from uint256, reverting on
* overflow (when the input is greater than largest uint216).
*
* Counterpart to Solidity's `uint216` operator.
*
* Requirements:
*
* - input must fit into 216 bits
*/
function toUint216(uint256 value) internal pure returns (uint216) {
if (value > type(uint216).max) {
revert SafeCastOverflowedUintDowncast(216, value);
}
return uint216(value);
}
/**
* @dev Returns the downcasted uint208 from uint256, reverting on
* overflow (when the input is greater than largest uint208).
*
* Counterpart to Solidity's `uint208` operator.
*
* Requirements:
*
* - input must fit into 208 bits
*/
function toUint208(uint256 value) internal pure returns (uint208) {
if (value > type(uint208).max) {
revert SafeCastOverflowedUintDowncast(208, value);
}
return uint208(value);
}
/**
* @dev Returns the downcasted uint200 from uint256, reverting on
* overflow (when the input is greater than largest uint200).
*
* Counterpart to Solidity's `uint200` operator.
*
* Requirements:
*
* - input must fit into 200 bits
*/
function toUint200(uint256 value) internal pure returns (uint200) {
if (value > type(uint200).max) {
revert SafeCastOverflowedUintDowncast(200, value);
}
return uint200(value);
}
/**
* @dev Returns the downcasted uint192 from uint256, reverting on
* overflow (when the input is greater than largest uint192).
*
* Counterpart to Solidity's `uint192` operator.
*
* Requirements:
*
* - input must fit into 192 bits
*/
function toUint192(uint256 value) internal pure returns (uint192) {
if (value > type(uint192).max) {
revert SafeCastOverflowedUintDowncast(192, value);
}
return uint192(value);
}
/**
* @dev Returns the downcasted uint184 from uint256, reverting on
* overflow (when the input is greater than largest uint184).
*
* Counterpart to Solidity's `uint184` operator.
*
* Requirements:
*
* - input must fit into 184 bits
*/
function toUint184(uint256 value) internal pure returns (uint184) {
if (value > type(uint184).max) {
revert SafeCastOverflowedUintDowncast(184, value);
}
return uint184(value);
}
/**
* @dev Returns the downcasted uint176 from uint256, reverting on
* overflow (when the input is greater than largest uint176).
*
* Counterpart to Solidity's `uint176` operator.
*
* Requirements:
*
* - input must fit into 176 bits
*/
function toUint176(uint256 value) internal pure returns (uint176) {
if (value > type(uint176).max) {
revert SafeCastOverflowedUintDowncast(176, value);
}
return uint176(value);
}
/**
* @dev Returns the downcasted uint168 from uint256, reverting on
* overflow (when the input is greater than largest uint168).
*
* Counterpart to Solidity's `uint168` operator.
*
* Requirements:
*
* - input must fit into 168 bits
*/
function toUint168(uint256 value) internal pure returns (uint168) {
if (value > type(uint168).max) {
revert SafeCastOverflowedUintDowncast(168, value);
}
return uint168(value);
}
/**
* @dev Returns the downcasted uint160 from uint256, reverting on
* overflow (when the input is greater than largest uint160).
*
* Counterpart to Solidity's `uint160` operator.
*
* Requirements:
*
* - input must fit into 160 bits
*/
function toUint160(uint256 value) internal pure returns (uint160) {
if (value > type(uint160).max) {
revert SafeCastOverflowedUintDowncast(160, value);
}
return uint160(value);
}
/**
* @dev Returns the downcasted uint152 from uint256, reverting on
* overflow (when the input is greater than largest uint152).
*
* Counterpart to Solidity's `uint152` operator.
*
* Requirements:
*
* - input must fit into 152 bits
*/
function toUint152(uint256 value) internal pure returns (uint152) {
if (value > type(uint152).max) {
revert SafeCastOverflowedUintDowncast(152, value);
}
return uint152(value);
}
/**
* @dev Returns the downcasted uint144 from uint256, reverting on
* overflow (when the input is greater than largest uint144).
*
* Counterpart to Solidity's `uint144` operator.
*
* Requirements:
*
* - input must fit into 144 bits
*/
function toUint144(uint256 value) internal pure returns (uint144) {
if (value > type(uint144).max) {
revert SafeCastOverflowedUintDowncast(144, value);
}
return uint144(value);
}
/**
* @dev Returns the downcasted uint136 from uint256, reverting on
* overflow (when the input is greater than largest uint136).
*
* Counterpart to Solidity's `uint136` operator.
*
* Requirements:
*
* - input must fit into 136 bits
*/
function toUint136(uint256 value) internal pure returns (uint136) {
if (value > type(uint136).max) {
revert SafeCastOverflowedUintDowncast(136, value);
}
return uint136(value);
}
/**
* @dev Returns the downcasted uint128 from uint256, reverting on
* overflow (when the input is greater than largest uint128).
*
* Counterpart to Solidity's `uint128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*/
function toUint128(uint256 value) internal pure returns (uint128) {
if (value > type(uint128).max) {
revert SafeCastOverflowedUintDowncast(128, value);
}
return uint128(value);
}
/**
* @dev Returns the downcasted uint120 from uint256, reverting on
* overflow (when the input is greater than largest uint120).
*
* Counterpart to Solidity's `uint120` operator.
*
* Requirements:
*
* - input must fit into 120 bits
*/
function toUint120(uint256 value) internal pure returns (uint120) {
if (value > type(uint120).max) {
revert SafeCastOverflowedUintDowncast(120, value);
}
return uint120(value);
}
/**
* @dev Returns the downcasted uint112 from uint256, reverting on
* overflow (when the input is greater than largest uint112).
*
* Counterpart to Solidity's `uint112` operator.
*
* Requirements:
*
* - input must fit into 112 bits
*/
function toUint112(uint256 value) internal pure returns (uint112) {
if (value > type(uint112).max) {
revert SafeCastOverflowedUintDowncast(112, value);
}
return uint112(value);
}
/**
* @dev Returns the downcasted uint104 from uint256, reverting on
* overflow (when the input is greater than largest uint104).
*
* Counterpart to Solidity's `uint104` operator.
*
* Requirements:
*
* - input must fit into 104 bits
*/
function toUint104(uint256 value) internal pure returns (uint104) {
if (value > type(uint104).max) {
revert SafeCastOverflowedUintDowncast(104, value);
}
return uint104(value);
}
/**
* @dev Returns the downcasted uint96 from uint256, reverting on
* overflow (when the input is greater than largest uint96).
*
* Counterpart to Solidity's `uint96` operator.
*
* Requirements:
*
* - input must fit into 96 bits
*/
function toUint96(uint256 value) internal pure returns (uint96) {
if (value > type(uint96).max) {
revert SafeCastOverflowedUintDowncast(96, value);
}
return uint96(value);
}
/**
* @dev Returns the downcasted uint88 from uint256, reverting on
* overflow (when the input is greater than largest uint88).
*
* Counterpart to Solidity's `uint88` operator.
*
* Requirements:
*
* - input must fit into 88 bits
*/
function toUint88(uint256 value) internal pure returns (uint88) {
if (value > type(uint88).max) {
revert SafeCastOverflowedUintDowncast(88, value);
}
return uint88(value);
}
/**
* @dev Returns the downcasted uint80 from uint256, reverting on
* overflow (when the input is greater than largest uint80).
*
* Counterpart to Solidity's `uint80` operator.
*
* Requirements:
*
* - input must fit into 80 bits
*/
function toUint80(uint256 value) internal pure returns (uint80) {
if (value > type(uint80).max) {
revert SafeCastOverflowedUintDowncast(80, value);
}
return uint80(value);
}
/**
* @dev Returns the downcasted uint72 from uint256, reverting on
* overflow (when the input is greater than largest uint72).
*
* Counterpart to Solidity's `uint72` operator.
*
* Requirements:
*
* - input must fit into 72 bits
*/
function toUint72(uint256 value) internal pure returns (uint72) {
if (value > type(uint72).max) {
revert SafeCastOverflowedUintDowncast(72, value);
}
return uint72(value);
}
/**
* @dev Returns the downcasted uint64 from uint256, reverting on
* overflow (when the input is greater than largest uint64).
*
* Counterpart to Solidity's `uint64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*/
function toUint64(uint256 value) internal pure returns (uint64) {
if (value > type(uint64).max) {
revert SafeCastOverflowedUintDowncast(64, value);
}
return uint64(value);
}
/**
* @dev Returns the downcasted uint56 from uint256, reverting on
* overflow (when the input is greater than largest uint56).
*
* Counterpart to Solidity's `uint56` operator.
*
* Requirements:
*
* - input must fit into 56 bits
*/
function toUint56(uint256 value) internal pure returns (uint56) {
if (value > type(uint56).max) {
revert SafeCastOverflowedUintDowncast(56, value);
}
return uint56(value);
}
/**
* @dev Returns the downcasted uint48 from uint256, reverting on
* overflow (when the input is greater than largest uint48).
*
* Counterpart to Solidity's `uint48` operator.
*
* Requirements:
*
* - input must fit into 48 bits
*/
function toUint48(uint256 value) internal pure returns (uint48) {
if (value > type(uint48).max) {
revert SafeCastOverflowedUintDowncast(48, value);
}
return uint48(value);
}
/**
* @dev Returns the downcasted uint40 from uint256, reverting on
* overflow (when the input is greater than largest uint40).
*
* Counterpart to Solidity's `uint40` operator.
*
* Requirements:
*
* - input must fit into 40 bits
*/
function toUint40(uint256 value) internal pure returns (uint40) {
if (value > type(uint40).max) {
revert SafeCastOverflowedUintDowncast(40, value);
}
return uint40(value);
}
/**
* @dev Returns the downcasted uint32 from uint256, reverting on
* overflow (when the input is greater than largest uint32).
*
* Counterpart to Solidity's `uint32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*/
function toUint32(uint256 value) internal pure returns (uint32) {
if (value > type(uint32).max) {
revert SafeCastOverflowedUintDowncast(32, value);
}
return uint32(value);
}
/**
* @dev Returns the downcasted uint24 from uint256, reverting on
* overflow (when the input is greater than largest uint24).
*
* Counterpart to Solidity's `uint24` operator.
*
* Requirements:
*
* - input must fit into 24 bits
*/
function toUint24(uint256 value) internal pure returns (uint24) {
if (value > type(uint24).max) {
revert SafeCastOverflowedUintDowncast(24, value);
}
return uint24(value);
}
/**
* @dev Returns the downcasted uint16 from uint256, reverting on
* overflow (when the input is greater than largest uint16).
*
* Counterpart to Solidity's `uint16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*/
function toUint16(uint256 value) internal pure returns (uint16) {
if (value > type(uint16).max) {
revert SafeCastOverflowedUintDowncast(16, value);
}
return uint16(value);
}
/**
* @dev Returns the downcasted uint8 from uint256, reverting on
* overflow (when the input is greater than largest uint8).
*
* Counterpart to Solidity's `uint8` operator.
*
* Requirements:
*
* - input must fit into 8 bits
*/
function toUint8(uint256 value) internal pure returns (uint8) {
if (value > type(uint8).max) {
revert SafeCastOverflowedUintDowncast(8, value);
}
return uint8(value);
}
/**
* @dev Converts a signed int256 into an unsigned uint256.
*
* Requirements:
*
* - input must be greater than or equal to 0.
*/
function toUint256(int256 value) internal pure returns (uint256) {
if (value < 0) {
revert SafeCastOverflowedIntToUint(value);
}
return uint256(value);
}
/**
* @dev Returns the downcasted int248 from int256, reverting on
* overflow (when the input is less than smallest int248 or
* greater than largest int248).
*
* Counterpart to Solidity's `int248` operator.
*
* Requirements:
*
* - input must fit into 248 bits
*/
function toInt248(int256 value) internal pure returns (int248 downcasted) {
downcasted = int248(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(248, value);
}
}
/**
* @dev Returns the downcasted int240 from int256, reverting on
* overflow (when the input is less than smallest int240 or
* greater than largest int240).
*
* Counterpart to Solidity's `int240` operator.
*
* Requirements:
*
* - input must fit into 240 bits
*/
function toInt240(int256 value) internal pure returns (int240 downcasted) {
downcasted = int240(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(240, value);
}
}
/**
* @dev Returns the downcasted int232 from int256, reverting on
* overflow (when the input is less than smallest int232 or
* greater than largest int232).
*
* Counterpart to Solidity's `int232` operator.
*
* Requirements:
*
* - input must fit into 232 bits
*/
function toInt232(int256 value) internal pure returns (int232 downcasted) {
downcasted = int232(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(232, value);
}
}
/**
* @dev Returns the downcasted int224 from int256, reverting on
* overflow (when the input is less than smallest int224 or
* greater than largest int224).
*
* Counterpart to Solidity's `int224` operator.
*
* Requirements:
*
* - input must fit into 224 bits
*/
function toInt224(int256 value) internal pure returns (int224 downcasted) {
downcasted = int224(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(224, value);
}
}
/**
* @dev Returns the downcasted int216 from int256, reverting on
* overflow (when the input is less than smallest int216 or
* greater than largest int216).
*
* Counterpart to Solidity's `int216` operator.
*
* Requirements:
*
* - input must fit into 216 bits
*/
function toInt216(int256 value) internal pure returns (int216 downcasted) {
downcasted = int216(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(216, value);
}
}
/**
* @dev Returns the downcasted int208 from int256, reverting on
* overflow (when the input is less than smallest int208 or
* greater than largest int208).
*
* Counterpart to Solidity's `int208` operator.
*
* Requirements:
*
* - input must fit into 208 bits
*/
function toInt208(int256 value) internal pure returns (int208 downcasted) {
downcasted = int208(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(208, value);
}
}
/**
* @dev Returns the downcasted int200 from int256, reverting on
* overflow (when the input is less than smallest int200 or
* greater than largest int200).
*
* Counterpart to Solidity's `int200` operator.
*
* Requirements:
*
* - input must fit into 200 bits
*/
function toInt200(int256 value) internal pure returns (int200 downcasted) {
downcasted = int200(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(200, value);
}
}
/**
* @dev Returns the downcasted int192 from int256, reverting on
* overflow (when the input is less than smallest int192 or
* greater than largest int192).
*
* Counterpart to Solidity's `int192` operator.
*
* Requirements:
*
* - input must fit into 192 bits
*/
function toInt192(int256 value) internal pure returns (int192 downcasted) {
downcasted = int192(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(192, value);
}
}
/**
* @dev Returns the downcasted int184 from int256, reverting on
* overflow (when the input is less than smallest int184 or
* greater than largest int184).
*
* Counterpart to Solidity's `int184` operator.
*
* Requirements:
*
* - input must fit into 184 bits
*/
function toInt184(int256 value) internal pure returns (int184 downcasted) {
downcasted = int184(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(184, value);
}
}
/**
* @dev Returns the downcasted int176 from int256, reverting on
* overflow (when the input is less than smallest int176 or
* greater than largest int176).
*
* Counterpart to Solidity's `int176` operator.
*
* Requirements:
*
* - input must fit into 176 bits
*/
function toInt176(int256 value) internal pure returns (int176 downcasted) {
downcasted = int176(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(176, value);
}
}
/**
* @dev Returns the downcasted int168 from int256, reverting on
* overflow (when the input is less than smallest int168 or
* greater than largest int168).
*
* Counterpart to Solidity's `int168` operator.
*
* Requirements:
*
* - input must fit into 168 bits
*/
function toInt168(int256 value) internal pure returns (int168 downcasted) {
downcasted = int168(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(168, value);
}
}
/**
* @dev Returns the downcasted int160 from int256, reverting on
* overflow (when the input is less than smallest int160 or
* greater than largest int160).
*
* Counterpart to Solidity's `int160` operator.
*
* Requirements:
*
* - input must fit into 160 bits
*/
function toInt160(int256 value) internal pure returns (int160 downcasted) {
downcasted = int160(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(160, value);
}
}
/**
* @dev Returns the downcasted int152 from int256, reverting on
* overflow (when the input is less than smallest int152 or
* greater than largest int152).
*
* Counterpart to Solidity's `int152` operator.
*
* Requirements:
*
* - input must fit into 152 bits
*/
function toInt152(int256 value) internal pure returns (int152 downcasted) {
downcasted = int152(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(152, value);
}
}
/**
* @dev Returns the downcasted int144 from int256, reverting on
* overflow (when the input is less than smallest int144 or
* greater than largest int144).
*
* Counterpart to Solidity's `int144` operator.
*
* Requirements:
*
* - input must fit into 144 bits
*/
function toInt144(int256 value) internal pure returns (int144 downcasted) {
downcasted = int144(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(144, value);
}
}
/**
* @dev Returns the downcasted int136 from int256, reverting on
* overflow (when the input is less than smallest int136 or
* greater than largest int136).
*
* Counterpart to Solidity's `int136` operator.
*
* Requirements:
*
* - input must fit into 136 bits
*/
function toInt136(int256 value) internal pure returns (int136 downcasted) {
downcasted = int136(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(136, value);
}
}
/**
* @dev Returns the downcasted int128 from int256, reverting on
* overflow (when the input is less than smallest int128 or
* greater than largest int128).
*
* Counterpart to Solidity's `int128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*/
function toInt128(int256 value) internal pure returns (int128 downcasted) {
downcasted = int128(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(128, value);
}
}
/**
* @dev Returns the downcasted int120 from int256, reverting on
* overflow (when the input is less than smallest int120 or
* greater than largest int120).
*
* Counterpart to Solidity's `int120` operator.
*
* Requirements:
*
* - input must fit into 120 bits
*/
function toInt120(int256 value) internal pure returns (int120 downcasted) {
downcasted = int120(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(120, value);
}
}
/**
* @dev Returns the downcasted int112 from int256, reverting on
* overflow (when the input is less than smallest int112 or
* greater than largest int112).
*
* Counterpart to Solidity's `int112` operator.
*
* Requirements:
*
* - input must fit into 112 bits
*/
function toInt112(int256 value) internal pure returns (int112 downcasted) {
downcasted = int112(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(112, value);
}
}
/**
* @dev Returns the downcasted int104 from int256, reverting on
* overflow (when the input is less than smallest int104 or
* greater than largest int104).
*
* Counterpart to Solidity's `int104` operator.
*
* Requirements:
*
* - input must fit into 104 bits
*/
function toInt104(int256 value) internal pure returns (int104 downcasted) {
downcasted = int104(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(104, value);
}
}
/**
* @dev Returns the downcasted int96 from int256, reverting on
* overflow (when the input is less than smallest int96 or
* greater than largest int96).
*
* Counterpart to Solidity's `int96` operator.
*
* Requirements:
*
* - input must fit into 96 bits
*/
function toInt96(int256 value) internal pure returns (int96 downcasted) {
downcasted = int96(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(96, value);
}
}
/**
* @dev Returns the downcasted int88 from int256, reverting on
* overflow (when the input is less than smallest int88 or
* greater than largest int88).
*
* Counterpart to Solidity's `int88` operator.
*
* Requirements:
*
* - input must fit into 88 bits
*/
function toInt88(int256 value) internal pure returns (int88 downcasted) {
downcasted = int88(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(88, value);
}
}
/**
* @dev Returns the downcasted int80 from int256, reverting on
* overflow (when the input is less than smallest int80 or
* greater than largest int80).
*
* Counterpart to Solidity's `int80` operator.
*
* Requirements:
*
* - input must fit into 80 bits
*/
function toInt80(int256 value) internal pure returns (int80 downcasted) {
downcasted = int80(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(80, value);
}
}
/**
* @dev Returns the downcasted int72 from int256, reverting on
* overflow (when the input is less than smallest int72 or
* greater than largest int72).
*
* Counterpart to Solidity's `int72` operator.
*
* Requirements:
*
* - input must fit into 72 bits
*/
function toInt72(int256 value) internal pure returns (int72 downcasted) {
downcasted = int72(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(72, value);
}
}
/**
* @dev Returns the downcasted int64 from int256, reverting on
* overflow (when the input is less than smallest int64 or
* greater than largest int64).
*
* Counterpart to Solidity's `int64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*/
function toInt64(int256 value) internal pure returns (int64 downcasted) {
downcasted = int64(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(64, value);
}
}
/**
* @dev Returns the downcasted int56 from int256, reverting on
* overflow (when the input is less than smallest int56 or
* greater than largest int56).
*
* Counterpart to Solidity's `int56` operator.
*
* Requirements:
*
* - input must fit into 56 bits
*/
function toInt56(int256 value) internal pure returns (int56 downcasted) {
downcasted = int56(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(56, value);
}
}
/**
* @dev Returns the downcasted int48 from int256, reverting on
* overflow (when the input is less than smallest int48 or
* greater than largest int48).
*
* Counterpart to Solidity's `int48` operator.
*
* Requirements:
*
* - input must fit into 48 bits
*/
function toInt48(int256 value) internal pure returns (int48 downcasted) {
downcasted = int48(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(48, value);
}
}
/**
* @dev Returns the downcasted int40 from int256, reverting on
* overflow (when the input is less than smallest int40 or
* greater than largest int40).
*
* Counterpart to Solidity's `int40` operator.
*
* Requirements:
*
* - input must fit into 40 bits
*/
function toInt40(int256 value) internal pure returns (int40 downcasted) {
downcasted = int40(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(40, value);
}
}
/**
* @dev Returns the downcasted int32 from int256, reverting on
* overflow (when the input is less than smallest int32 or
* greater than largest int32).
*
* Counterpart to Solidity's `int32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*/
function toInt32(int256 value) internal pure returns (int32 downcasted) {
downcasted = int32(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(32, value);
}
}
/**
* @dev Returns the downcasted int24 from int256, reverting on
* overflow (when the input is less than smallest int24 or
* greater than largest int24).
*
* Counterpart to Solidity's `int24` operator.
*
* Requirements:
*
* - input must fit into 24 bits
*/
function toInt24(int256 value) internal pure returns (int24 downcasted) {
downcasted = int24(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(24, value);
}
}
/**
* @dev Returns the downcasted int16 from int256, reverting on
* overflow (when the input is less than smallest int16 or
* greater than largest int16).
*
* Counterpart to Solidity's `int16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*/
function toInt16(int256 value) internal pure returns (int16 downcasted) {
downcasted = int16(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(16, value);
}
}
/**
* @dev Returns the downcasted int8 from int256, reverting on
* overflow (when the input is less than smallest int8 or
* greater than largest int8).
*
* Counterpart to Solidity's `int8` operator.
*
* Requirements:
*
* - input must fit into 8 bits
*/
function toInt8(int256 value) internal pure returns (int8 downcasted) {
downcasted = int8(value);
if (downcasted != value) {
revert SafeCastOverflowedIntDowncast(8, value);
}
}
/**
* @dev Converts an unsigned uint256 into a signed int256.
*
* Requirements:
*
* - input must be less than or equal to maxInt256.
*/
function toInt256(uint256 value) internal pure returns (int256) {
// Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
if (value > uint256(type(int256).max)) {
revert SafeCastOverflowedUintToInt(value);
}
return int256(value);
}
}// SPDX-FileCopyrightText: 2025 Lido <[email protected]> // SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.24; interface ICSParametersRegistry { struct MarkedUint248 { uint248 value; bool isValue; } struct QueueConfig { uint32 priority; uint32 maxDeposits; } struct StrikesParams { uint32 lifetime; uint32 threshold; } struct PerformanceCoefficients { uint32 attestationsWeight; uint32 blocksWeight; uint32 syncWeight; } struct InitializationData { uint256 keyRemovalCharge; uint256 elRewardsStealingAdditionalFine; uint256 keysLimit; uint256 rewardShare; uint256 performanceLeeway; uint256 strikesLifetime; uint256 strikesThreshold; uint256 defaultQueuePriority; uint256 defaultQueueMaxDeposits; uint256 badPerformancePenalty; uint256 attestationsWeight; uint256 blocksWeight; uint256 syncWeight; uint256 defaultAllowedExitDelay; uint256 defaultExitDelayPenalty; uint256 defaultMaxWithdrawalRequestFee; } /// @dev Defines a value interval starting from `minKeyNumber`. /// All keys with number >= `minKeyNumber` are assigned the corresponding `value` /// until the next interval begins. Intervals must be sorted by ascending `minKeyNumber` /// and must start from one (i.e., the first interval must have minKeyNumber == 1). /// Example: [{1, 10000}, {11, 8000}] means first 10 keys with 10000, other keys with 8000. struct KeyNumberValueInterval { uint256 minKeyNumber; uint256 value; } event DefaultKeyRemovalChargeSet(uint256 value); event DefaultElRewardsStealingAdditionalFineSet(uint256 value); event DefaultKeysLimitSet(uint256 value); event DefaultRewardShareSet(uint256 value); event DefaultPerformanceLeewaySet(uint256 value); event DefaultStrikesParamsSet(uint256 lifetime, uint256 threshold); event DefaultBadPerformancePenaltySet(uint256 value); event DefaultPerformanceCoefficientsSet( uint256 attestationsWeight, uint256 blocksWeight, uint256 syncWeight ); event DefaultQueueConfigSet(uint256 priority, uint256 maxDeposits); event DefaultAllowedExitDelaySet(uint256 delay); event DefaultExitDelayPenaltySet(uint256 penalty); event DefaultMaxWithdrawalRequestFeeSet(uint256 fee); event KeyRemovalChargeSet( uint256 indexed curveId, uint256 keyRemovalCharge ); event ElRewardsStealingAdditionalFineSet( uint256 indexed curveId, uint256 fine ); event KeysLimitSet(uint256 indexed curveId, uint256 limit); event RewardShareDataSet( uint256 indexed curveId, KeyNumberValueInterval[] data ); event PerformanceLeewayDataSet( uint256 indexed curveId, KeyNumberValueInterval[] data ); event StrikesParamsSet( uint256 indexed curveId, uint256 lifetime, uint256 threshold ); event BadPerformancePenaltySet(uint256 indexed curveId, uint256 penalty); event PerformanceCoefficientsSet( uint256 indexed curveId, uint256 attestationsWeight, uint256 blocksWeight, uint256 syncWeight ); event KeyRemovalChargeUnset(uint256 indexed curveId); event ElRewardsStealingAdditionalFineUnset(uint256 indexed curveId); event KeysLimitUnset(uint256 indexed curveId); event RewardShareDataUnset(uint256 indexed curveId); event PerformanceLeewayDataUnset(uint256 indexed curveId); event StrikesParamsUnset(uint256 indexed curveId); event BadPerformancePenaltyUnset(uint256 indexed curveId); event PerformanceCoefficientsUnset(uint256 indexed curveId); event QueueConfigSet( uint256 indexed curveId, uint256 priority, uint256 maxDeposits ); event QueueConfigUnset(uint256 indexed curveId); event AllowedExitDelaySet(uint256 indexed curveId, uint256 delay); event AllowedExitDelayUnset(uint256 indexed curveId); event ExitDelayPenaltySet(uint256 indexed curveId, uint256 penalty); event ExitDelayPenaltyUnset(uint256 indexed curveId); event MaxWithdrawalRequestFeeSet(uint256 indexed curveId, uint256 fee); event MaxWithdrawalRequestFeeUnset(uint256 indexed curveId); error InvalidRewardShareData(); error InvalidPerformanceLeewayData(); error InvalidKeyNumberValueIntervals(); error InvalidPerformanceCoefficients(); error InvalidStrikesParams(); error ZeroMaxDeposits(); error ZeroAdminAddress(); error QueueCannotBeUsed(); error InvalidAllowedExitDelay(); error ZeroQueueLowestPriority(); /// @notice The lowest priority a deposit queue can be assigned with. function QUEUE_LOWEST_PRIORITY() external view returns (uint256); /// @notice The priority reserved to be used for legacy queue only. function QUEUE_LEGACY_PRIORITY() external view returns (uint256); /// @notice Set default value for the key removal charge. Default value is used if a specific value is not set for the curveId /// @param keyRemovalCharge value to be set as default for the key removal charge function setDefaultKeyRemovalCharge(uint256 keyRemovalCharge) external; /// @notice Get default value for the key removal charge function defaultKeyRemovalCharge() external returns (uint256); /// @notice Set default value for the EL rewards stealing additional fine. Default value is used if a specific value is not set for the curveId /// @param fine value to be set as default for the EL rewards stealing additional fine function setDefaultElRewardsStealingAdditionalFine(uint256 fine) external; /// @notice Get default value for the EL rewards stealing additional fine function defaultElRewardsStealingAdditionalFine() external returns (uint256); /// @notice Set default value for the keys limit. Default value is used if a specific value is not set for the curveId /// @param limit value to be set as default for the keys limit function setDefaultKeysLimit(uint256 limit) external; /// @notice Get default value for the key removal charge function defaultKeysLimit() external returns (uint256); /// @notice Set default value for the reward share. Default value is used if a specific value is not set for the curveId /// @param share value to be set as default for the reward share function setDefaultRewardShare(uint256 share) external; /// @notice Get default value for the reward share function defaultRewardShare() external returns (uint256); /// @notice Set default value for the performance leeway. Default value is used if a specific value is not set for the curveId /// @param leeway value to be set as default for the performance leeway function setDefaultPerformanceLeeway(uint256 leeway) external; /// @notice Get default value for the performance leeway function defaultPerformanceLeeway() external returns (uint256); /// @notice Set default values for the strikes lifetime and threshold. Default values are used if specific values are not set for the curveId /// @param lifetime The default number of CSM Performance Oracle frames to store strikes values /// @param threshold The default strikes value leading to validator force ejection. function setDefaultStrikesParams( uint256 lifetime, uint256 threshold ) external; /// @notice Get default value for the strikes lifetime (frames count) and threshold (integer) /// @return lifetime The default number of CSM Performance Oracle frames to store strikes values /// @return threshold The default strikes value leading to validator force ejection. function defaultStrikesParams() external returns (uint32, uint32); /// @notice Set default value for the bad performance penalty. Default value is used if a specific value is not set for the curveId /// @param penalty value to be set as default for the bad performance penalty function setDefaultBadPerformancePenalty(uint256 penalty) external; /// @notice Get default value for the bad performance penalty function defaultBadPerformancePenalty() external returns (uint256); /// @notice Set default values for the performance coefficients. Default values are used if specific values are not set for the curveId /// @param attestationsWeight value to be set as default for the attestations effectiveness weight /// @param blocksWeight value to be set as default for block proposals effectiveness weight /// @param syncWeight value to be set as default for sync participation effectiveness weight function setDefaultPerformanceCoefficients( uint256 attestationsWeight, uint256 blocksWeight, uint256 syncWeight ) external; /// @notice Get default value for the performance coefficients function defaultPerformanceCoefficients() external returns (uint32, uint32, uint32); /// @notice set default value for allowed delay before the exit was initiated exit delay in seconds. Default value is used if a specific value is not set for the curveId /// @param delay value to be set as default for the allowed exit delay function setDefaultAllowedExitDelay(uint256 delay) external; /// @notice set default value for exit delay penalty. Default value is used if a specific value is not set for the curveId /// @param penalty value to be set as default for the exit delay penalty function setDefaultExitDelayPenalty(uint256 penalty) external; /// @notice set default value for max withdrawal request fee. Default value is used if a specific value is not set for the curveId /// @param fee value to be set as default for the max withdrawal request fee function setDefaultMaxWithdrawalRequestFee(uint256 fee) external; /// @notice Get default value for the allowed exit delay function defaultAllowedExitDelay() external returns (uint256); /// @notice Set key removal charge for the curveId. /// @param curveId Curve Id to associate key removal charge with /// @param keyRemovalCharge Key removal charge function setKeyRemovalCharge( uint256 curveId, uint256 keyRemovalCharge ) external; /// @notice Unset key removal charge for the curveId /// @param curveId Curve Id to unset custom key removal charge for function unsetKeyRemovalCharge(uint256 curveId) external; /// @notice Get key removal charge by the curveId. A charge is taken from the bond for each removed key from CSM /// @dev `defaultKeyRemovalCharge` is returned if the value is not set for the given curveId. /// @param curveId Curve Id to get key removal charge for /// @return keyRemovalCharge Key removal charge function getKeyRemovalCharge( uint256 curveId ) external view returns (uint256 keyRemovalCharge); /// @notice Set EL rewards stealing additional fine for the curveId. /// @param curveId Curve Id to associate EL rewards stealing additional fine limit with /// @param fine EL rewards stealing additional fine function setElRewardsStealingAdditionalFine( uint256 curveId, uint256 fine ) external; /// @notice Unset EL rewards stealing additional fine for the curveId /// @param curveId Curve Id to unset custom EL rewards stealing additional fine for function unsetElRewardsStealingAdditionalFine(uint256 curveId) external; /// @notice Get EL rewards stealing additional fine by the curveId. Additional fine is added to the EL rewards stealing penalty by CSM /// @dev `defaultElRewardsStealingAdditionalFine` is returned if the value is not set for the given curveId. /// @param curveId Curve Id to get EL rewards stealing additional fine for /// @return fine EL rewards stealing additional fine function getElRewardsStealingAdditionalFine( uint256 curveId ) external view returns (uint256 fine); /// @notice Set keys limit for the curveId. /// @param curveId Curve Id to associate keys limit with /// @param limit Keys limit function setKeysLimit(uint256 curveId, uint256 limit) external; /// @notice Unset key removal charge for the curveId /// @param curveId Curve Id to unset custom key removal charge for function unsetKeysLimit(uint256 curveId) external; /// @notice Get keys limit by the curveId. A limit indicates the maximal amount of the non-exited keys Node Operator can upload /// @dev `defaultKeysLimit` is returned if the value is not set for the given curveId. /// @param curveId Curve Id to get keys limit for /// @return limit Keys limit function getKeysLimit( uint256 curveId ) external view returns (uint256 limit); /// @notice Set reward share parameters for the curveId /// @dev KeyNumberValueInterval = [[1, 10000], [11, 8000], [51, 5000]] stands for /// 100% rewards for the first 10 keys, 80% rewards for the keys 11-50, and 50% rewards for the keys > 50 /// @param curveId Curve Id to associate reward share data with /// @param data Interval values for keys count and reward share percentages in BP (ex. [[1, 10000], [11, 8000], [51, 5000]]) function setRewardShareData( uint256 curveId, KeyNumberValueInterval[] calldata data ) external; /// @notice Unset reward share parameters for the curveId /// @param curveId Curve Id to unset custom reward share parameters for function unsetRewardShareData(uint256 curveId) external; /// @notice Get reward share parameters by the curveId. /// @dev Returns [[1, defaultRewardShare]] if no intervals are set for the given curveId. /// @dev KeyNumberValueInterval = [[1, 10000], [11, 8000], [51, 5000]] stands for /// 100% rewards for the first 10 keys, 80% rewards for the keys 11-50, and 50% rewards for the keys > 50 /// @param curveId Curve Id to get reward share data for /// @param data Interval values for keys count and reward share percentages in BP (ex. [[1, 10000], [11, 8000], [51, 5000]]) function getRewardShareData( uint256 curveId ) external view returns (KeyNumberValueInterval[] memory data); /// @notice Set default value for QueueConfig. Default value is used if a specific value is not set for the curveId. /// @param priority Queue priority. /// @param maxDeposits Maximum number of deposits a Node Operator can get via the priority queue. function setDefaultQueueConfig( uint256 priority, uint256 maxDeposits ) external; /// @notice Sets the provided config to the given curve. /// @param curveId Curve Id to set the config. /// @param priority Priority of the queue /// @param maxDeposits Max deposits in prioritized queue function setQueueConfig( uint256 curveId, uint256 priority, uint256 maxDeposits ) external; /// @notice Set the given curve's config to the default one. /// @param curveId Curve Id to unset custom config. function unsetQueueConfig(uint256 curveId) external; /// @notice Get the queue config for the given curve. /// @param curveId Curve Id to get the queue config for. /// @return priority Queue priority. /// @return maxDeposits Maximum number of deposits a Node Operator can get via the priority queue. function getQueueConfig( uint256 curveId ) external view returns (uint32 priority, uint32 maxDeposits); /// @notice Set performance leeway parameters for the curveId /// @dev Returns [[1, defaultPerformanceLeeway]] if no intervals are set for the given curveId. /// @dev KeyNumberValueInterval = [[1, 500], [101, 450], [501, 400]] stands for /// 5% performance leeway for the first 100 keys, 4.5% performance leeway for the keys 101-500, and 4% performance leeway for the keys > 500 /// @param curveId Curve Id to associate performance leeway data with /// @param data Interval values for keys count and performance leeway percentages in BP (ex. [[1, 500], [101, 450], [501, 400]]) function setPerformanceLeewayData( uint256 curveId, KeyNumberValueInterval[] calldata data ) external; /// @notice Unset performance leeway parameters for the curveId /// @param curveId Curve Id to unset custom performance leeway parameters for function unsetPerformanceLeewayData(uint256 curveId) external; /// @notice Get performance leeway parameters by the curveId /// @dev Returns [[1, defaultPerformanceLeeway]] if no intervals are set for the given curveId. /// @dev KeyNumberValueInterval = [[1, 500], [101, 450], [501, 400]] stands for /// 5% performance leeway for the first 100 keys, 4.5% performance leeway for the keys 101-500, and 4% performance leeway for the keys > 500 /// @param curveId Curve Id to get performance leeway data for /// @param data Interval values for keys count and performance leeway percentages in BP (ex. [[1, 500], [101, 450], [501, 400]]) function getPerformanceLeewayData( uint256 curveId ) external view returns (KeyNumberValueInterval[] memory data); /// @notice Set performance strikes lifetime and threshold for the curveId /// @param curveId Curve Id to associate performance strikes lifetime and threshold with /// @param lifetime Number of CSM Performance Oracle frames to store strikes values /// @param threshold The strikes value leading to validator force ejection function setStrikesParams( uint256 curveId, uint256 lifetime, uint256 threshold ) external; /// @notice Unset custom performance strikes lifetime and threshold for the curveId /// @param curveId Curve Id to unset custom performance strikes lifetime and threshold for function unsetStrikesParams(uint256 curveId) external; /// @notice Get performance strikes lifetime and threshold by the curveId /// @dev `defaultStrikesParams` are returned if the value is not set for the given curveId /// @param curveId Curve Id to get performance strikes lifetime and threshold for /// @return lifetime Number of CSM Performance Oracle frames to store strikes values /// @return threshold The strikes value leading to validator force ejection function getStrikesParams( uint256 curveId ) external view returns (uint256 lifetime, uint256 threshold); /// @notice Set bad performance penalty for the curveId /// @param curveId Curve Id to associate bad performance penalty with /// @param penalty Bad performance penalty function setBadPerformancePenalty( uint256 curveId, uint256 penalty ) external; /// @notice Unset bad performance penalty for the curveId /// @param curveId Curve Id to unset custom bad performance penalty for function unsetBadPerformancePenalty(uint256 curveId) external; /// @notice Get bad performance penalty by the curveId /// @dev `defaultBadPerformancePenalty` is returned if the value is not set for the given curveId. /// @param curveId Curve Id to get bad performance penalty for /// @return penalty Bad performance penalty function getBadPerformancePenalty( uint256 curveId ) external view returns (uint256 penalty); /// @notice Set performance coefficients for the curveId /// @param curveId Curve Id to associate performance coefficients with /// @param attestationsWeight Attestations effectiveness weight /// @param blocksWeight Block proposals effectiveness weight /// @param syncWeight Sync participation effectiveness weight function setPerformanceCoefficients( uint256 curveId, uint256 attestationsWeight, uint256 blocksWeight, uint256 syncWeight ) external; /// @notice Unset custom performance coefficients for the curveId /// @param curveId Curve Id to unset custom performance coefficients for function unsetPerformanceCoefficients(uint256 curveId) external; /// @notice Get performance coefficients by the curveId /// @dev `defaultPerformanceCoefficients` are returned if the value is not set for the given curveId. /// @param curveId Curve Id to get performance coefficients for /// @return attestationsWeight Attestations effectiveness weight /// @return blocksWeight Block proposals effectiveness weight /// @return syncWeight Sync participation effectiveness weight function getPerformanceCoefficients( uint256 curveId ) external view returns ( uint256 attestationsWeight, uint256 blocksWeight, uint256 syncWeight ); /// @notice Set allowed exit delay for the curveId in seconds /// @param curveId Curve Id to associate allowed exit delay with /// @param delay allowed exit delay function setAllowedExitDelay(uint256 curveId, uint256 delay) external; /// @notice Unset exit timeframe deadline delay for the curveId /// @param curveId Curve Id to unset allowed exit delay for function unsetAllowedExitDelay(uint256 curveId) external; /// @notice Get allowed exit delay by the curveId in seconds /// @dev `defaultAllowedExitDelay` is returned if the value is not set for the given curveId. /// @param curveId Curve Id to get allowed exit delay for function getAllowedExitDelay( uint256 curveId ) external view returns (uint256 delay); /// @notice Set exit delay penalty for the curveId /// @dev cannot be zero /// @param curveId Curve Id to associate exit delay penalty with /// @param penalty exit delay penalty function setExitDelayPenalty(uint256 curveId, uint256 penalty) external; /// @notice Unset exit delay penalty for the curveId /// @param curveId Curve Id to unset exit delay penalty for function unsetExitDelayPenalty(uint256 curveId) external; /// @notice Get exit delay penalty by the curveId /// @dev `defaultExitDelayPenalty` is returned if the value is not set for the given curveId. /// @param curveId Curve Id to get exit delay penalty for function getExitDelayPenalty( uint256 curveId ) external view returns (uint256 penalty); /// @notice Set max withdrawal request fee for the curveId /// @param curveId Curve Id to associate max withdrawal request fee with /// @param fee max withdrawal request fee function setMaxWithdrawalRequestFee(uint256 curveId, uint256 fee) external; /// @notice Unset max withdrawal request fee for the curveId /// @param curveId Curve Id to unset max withdrawal request fee for function unsetMaxWithdrawalRequestFee(uint256 curveId) external; /// @notice Get max withdrawal request fee by the curveId /// @dev `defaultMaxWithdrawalRequestFee` is returned if the value is not set for the given curveId. /// @param curveId Curve Id to get max withdrawal request fee for function getMaxWithdrawalRequestFee( uint256 curveId ) external view returns (uint256 fee); /// @notice Returns the initialized version of the contract function getInitializedVersion() external view returns (uint64); }
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/extensions/IAccessControlEnumerable.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "../IAccessControl.sol";
/**
* @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
*/
interface IAccessControlEnumerable is IAccessControl {
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) external view returns (address);
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol";
import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol";
import {ERC165Upgradeable} from "../utils/introspection/ERC165Upgradeable.sol";
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControl, ERC165Upgradeable {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/// @custom:storage-location erc7201:openzeppelin.storage.AccessControl
struct AccessControlStorage {
mapping(bytes32 role => RoleData) _roles;
}
// keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.AccessControl")) - 1)) & ~bytes32(uint256(0xff))
bytes32 private constant AccessControlStorageLocation = 0x02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800;
function _getAccessControlStorage() private pure returns (AccessControlStorage storage $) {
assembly {
$.slot := AccessControlStorageLocation
}
}
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
function __AccessControl_init() internal onlyInitializing {
}
function __AccessControl_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
AccessControlStorage storage $ = _getAccessControlStorage();
return $._roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
AccessControlStorage storage $ = _getAccessControlStorage();
return $._roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
AccessControlStorage storage $ = _getAccessControlStorage();
bytes32 previousAdminRole = getRoleAdmin(role);
$._roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
AccessControlStorage storage $ = _getAccessControlStorage();
if (!hasRole(role, account)) {
$._roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
AccessControlStorage storage $ = _getAccessControlStorage();
if (hasRole(role, account)) {
$._roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.
pragma solidity ^0.8.20;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```solidity
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*
* [WARNING]
* ====
* Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
* unusable.
* See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
*
* In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
* array of EnumerableSet.
* ====
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position is the index of the value in the `values` array plus 1.
// Position 0 is used to mean a value is not in the set.
mapping(bytes32 value => uint256) _positions;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._positions[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We cache the value's position to prevent multiple reads from the same storage slot
uint256 position = set._positions[value];
if (position != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 valueIndex = position - 1;
uint256 lastIndex = set._values.length - 1;
if (valueIndex != lastIndex) {
bytes32 lastValue = set._values[lastIndex];
// Move the lastValue to the index where the value to delete is
set._values[valueIndex] = lastValue;
// Update the tracked position of the lastValue (that was just moved)
set._positions[lastValue] = position;
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the tracked position for the deleted slot
delete set._positions[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._positions[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
bytes32[] memory store = _values(set._inner);
bytes32[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
/// @solidity memory-safe-assembly
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)
pragma solidity ^0.8.20;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
import {Initializable} from "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import {Initializable} from "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165Upgradeable is Initializable, IERC165 {
function __ERC165_init() internal onlyInitializing {
}
function __ERC165_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"remappings": [
"@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
"@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/",
"forge-std/=node_modules/forge-std/src/",
"ds-test/=node_modules/ds-test/src/"
],
"optimizer": {
"enabled": true,
"runs": 160
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false,
"libraries": {
"src/lib/AssetRecovererLib.sol": {
"AssetRecovererLib": "0xa74528edc289b1a597Faf83fCfF7eFf871Cc01D9"
},
"src/lib/NOAddresses.sol": {
"NOAddresses": "0x7aE73890a2FE240362161BA9E83Fc996D7Fe1496"
},
"src/lib/QueueLib.sol": {
"QueueLib": "0x6eFF460627b6798C2907409EA2Fdfb287Eaa2e55"
}
}
}Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"queueLowestPriority","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"InvalidAllowedExitDelay","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidKeyNumberValueIntervals","type":"error"},{"inputs":[],"name":"InvalidPerformanceCoefficients","type":"error"},{"inputs":[],"name":"InvalidPerformanceLeewayData","type":"error"},{"inputs":[],"name":"InvalidRewardShareData","type":"error"},{"inputs":[],"name":"InvalidStrikesParams","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[],"name":"QueueCannotBeUsed","type":"error"},{"inputs":[{"internalType":"uint8","name":"bits","type":"uint8"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"SafeCastOverflowedUintDowncast","type":"error"},{"inputs":[],"name":"ZeroAdminAddress","type":"error"},{"inputs":[],"name":"ZeroMaxDeposits","type":"error"},{"inputs":[],"name":"ZeroQueueLowestPriority","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"AllowedExitDelaySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"AllowedExitDelayUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"BadPerformancePenaltySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"BadPerformancePenaltyUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"DefaultAllowedExitDelaySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"DefaultBadPerformancePenaltySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"DefaultElRewardsStealingAdditionalFineSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"DefaultExitDelayPenaltySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"DefaultKeyRemovalChargeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"DefaultKeysLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"DefaultMaxWithdrawalRequestFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"attestationsWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blocksWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"syncWeight","type":"uint256"}],"name":"DefaultPerformanceCoefficientsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"DefaultPerformanceLeewaySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"priority","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxDeposits","type":"uint256"}],"name":"DefaultQueueConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"DefaultRewardShareSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"lifetime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"DefaultStrikesParamsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fine","type":"uint256"}],"name":"ElRewardsStealingAdditionalFineSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"ElRewardsStealingAdditionalFineUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"ExitDelayPenaltySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"ExitDelayPenaltyUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"keyRemovalCharge","type":"uint256"}],"name":"KeyRemovalChargeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"KeyRemovalChargeUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"KeysLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"KeysLimitUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"MaxWithdrawalRequestFeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"MaxWithdrawalRequestFeeUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"attestationsWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blocksWeight","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"syncWeight","type":"uint256"}],"name":"PerformanceCoefficientsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"PerformanceCoefficientsUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"components":[{"internalType":"uint256","name":"minKeyNumber","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"indexed":false,"internalType":"struct ICSParametersRegistry.KeyNumberValueInterval[]","name":"data","type":"tuple[]"}],"name":"PerformanceLeewayDataSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"PerformanceLeewayDataUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priority","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxDeposits","type":"uint256"}],"name":"QueueConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"QueueConfigUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"components":[{"internalType":"uint256","name":"minKeyNumber","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"indexed":false,"internalType":"struct ICSParametersRegistry.KeyNumberValueInterval[]","name":"data","type":"tuple[]"}],"name":"RewardShareDataSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"RewardShareDataUnset","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lifetime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"StrikesParamsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"StrikesParamsUnset","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUEUE_LEGACY_PRIORITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"QUEUE_LOWEST_PRIORITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultAllowedExitDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultBadPerformancePenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultElRewardsStealingAdditionalFine","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultExitDelayPenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultKeyRemovalCharge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultKeysLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultMaxWithdrawalRequestFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultPerformanceCoefficients","outputs":[{"internalType":"uint32","name":"attestationsWeight","type":"uint32"},{"internalType":"uint32","name":"blocksWeight","type":"uint32"},{"internalType":"uint32","name":"syncWeight","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultPerformanceLeeway","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultQueueConfig","outputs":[{"internalType":"uint32","name":"priority","type":"uint32"},{"internalType":"uint32","name":"maxDeposits","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultRewardShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultStrikesParams","outputs":[{"internalType":"uint32","name":"lifetime","type":"uint32"},{"internalType":"uint32","name":"threshold","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getAllowedExitDelay","outputs":[{"internalType":"uint256","name":"delay","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getBadPerformancePenalty","outputs":[{"internalType":"uint256","name":"penalty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getElRewardsStealingAdditionalFine","outputs":[{"internalType":"uint256","name":"fine","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getExitDelayPenalty","outputs":[{"internalType":"uint256","name":"penalty","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInitializedVersion","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getKeyRemovalCharge","outputs":[{"internalType":"uint256","name":"keyRemovalCharge","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getKeysLimit","outputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getMaxWithdrawalRequestFee","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getPerformanceCoefficients","outputs":[{"internalType":"uint256","name":"attestationsWeight","type":"uint256"},{"internalType":"uint256","name":"blocksWeight","type":"uint256"},{"internalType":"uint256","name":"syncWeight","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getPerformanceLeewayData","outputs":[{"components":[{"internalType":"uint256","name":"minKeyNumber","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct ICSParametersRegistry.KeyNumberValueInterval[]","name":"data","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getQueueConfig","outputs":[{"internalType":"uint32","name":"queuePriority","type":"uint32"},{"internalType":"uint32","name":"maxDeposits","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getRewardShareData","outputs":[{"components":[{"internalType":"uint256","name":"minKeyNumber","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct ICSParametersRegistry.KeyNumberValueInterval[]","name":"data","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"getStrikesParams","outputs":[{"internalType":"uint256","name":"lifetime","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"components":[{"internalType":"uint256","name":"keyRemovalCharge","type":"uint256"},{"internalType":"uint256","name":"elRewardsStealingAdditionalFine","type":"uint256"},{"internalType":"uint256","name":"keysLimit","type":"uint256"},{"internalType":"uint256","name":"rewardShare","type":"uint256"},{"internalType":"uint256","name":"performanceLeeway","type":"uint256"},{"internalType":"uint256","name":"strikesLifetime","type":"uint256"},{"internalType":"uint256","name":"strikesThreshold","type":"uint256"},{"internalType":"uint256","name":"defaultQueuePriority","type":"uint256"},{"internalType":"uint256","name":"defaultQueueMaxDeposits","type":"uint256"},{"internalType":"uint256","name":"badPerformancePenalty","type":"uint256"},{"internalType":"uint256","name":"attestationsWeight","type":"uint256"},{"internalType":"uint256","name":"blocksWeight","type":"uint256"},{"internalType":"uint256","name":"syncWeight","type":"uint256"},{"internalType":"uint256","name":"defaultAllowedExitDelay","type":"uint256"},{"internalType":"uint256","name":"defaultExitDelayPenalty","type":"uint256"},{"internalType":"uint256","name":"defaultMaxWithdrawalRequestFee","type":"uint256"}],"internalType":"struct ICSParametersRegistry.InitializationData","name":"data","type":"tuple"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"setAllowedExitDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"setBadPerformancePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"setDefaultAllowedExitDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"setDefaultBadPerformancePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fine","type":"uint256"}],"name":"setDefaultElRewardsStealingAdditionalFine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"setDefaultExitDelayPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"keyRemovalCharge","type":"uint256"}],"name":"setDefaultKeyRemovalCharge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setDefaultKeysLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setDefaultMaxWithdrawalRequestFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"attestationsWeight","type":"uint256"},{"internalType":"uint256","name":"blocksWeight","type":"uint256"},{"internalType":"uint256","name":"syncWeight","type":"uint256"}],"name":"setDefaultPerformanceCoefficients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"leeway","type":"uint256"}],"name":"setDefaultPerformanceLeeway","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priority","type":"uint256"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"}],"name":"setDefaultQueueConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"share","type":"uint256"}],"name":"setDefaultRewardShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lifetime","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setDefaultStrikesParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"internalType":"uint256","name":"fine","type":"uint256"}],"name":"setElRewardsStealingAdditionalFine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"internalType":"uint256","name":"penalty","type":"uint256"}],"name":"setExitDelayPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"internalType":"uint256","name":"keyRemovalCharge","type":"uint256"}],"name":"setKeyRemovalCharge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"setKeysLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setMaxWithdrawalRequestFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"internalType":"uint256","name":"attestationsWeight","type":"uint256"},{"internalType":"uint256","name":"blocksWeight","type":"uint256"},{"internalType":"uint256","name":"syncWeight","type":"uint256"}],"name":"setPerformanceCoefficients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"components":[{"internalType":"uint256","name":"minKeyNumber","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct ICSParametersRegistry.KeyNumberValueInterval[]","name":"data","type":"tuple[]"}],"name":"setPerformanceLeewayData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"internalType":"uint256","name":"priority","type":"uint256"},{"internalType":"uint256","name":"maxDeposits","type":"uint256"}],"name":"setQueueConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"components":[{"internalType":"uint256","name":"minKeyNumber","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"internalType":"struct ICSParametersRegistry.KeyNumberValueInterval[]","name":"data","type":"tuple[]"}],"name":"setRewardShareData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"},{"internalType":"uint256","name":"lifetime","type":"uint256"},{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setStrikesParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetAllowedExitDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetBadPerformancePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetElRewardsStealingAdditionalFine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetExitDelayPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetKeyRemovalCharge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetKeysLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetMaxWithdrawalRequestFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetPerformanceCoefficients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetPerformanceLeewayData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetQueueConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetRewardShareData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"curveId","type":"uint256"}],"name":"unsetStrikesParams","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60c060405234801562000010575f80fd5b5060405162002e2238038062002e2283398101604081905262000033916200012e565b805f0362000054576040516304b3c19b60e31b815260040160405180910390fd5b60808190526200006660018262000146565b60a052620000736200007a565b506200016c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000cb5760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146200012b5780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f602082840312156200013f575f80fd5b5051919050565b818103818111156200016657634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a051612c866200019c5f395f8181610856015261254301525f8181610952015261251a0152612c865ff3fe608060405234801561000f575f80fd5b5060043610610422575f3560e01c8063808cdedd1161022c578063c58e4bc711610135578063d96dd07e116100bf578063f2db2c8b11610084578063f2db2c8b146109ec578063f42d7db5146109ff578063f535c7ea14610a12578063f8b84e6d14610a25578063f91a79b514610a2e575f80fd5b8063d96dd07e1461099a578063dec45c38146109a3578063decfec56146109b6578063e5fa9277146109c9578063f18c961a146109d1575f80fd5b8063d547741f11610105578063d547741f14610927578063d5d3687c1461093a578063d614ae0c1461094d578063d665d19514610974578063d8ef52f414610987575f80fd5b8063c58e4bc7146108db578063ca15c873146108ee578063ce2bccdf14610901578063cf4e0bb214610914575f80fd5b80639edf0ecc116101b6578063acd9813011610186578063acd9813014610878578063b0a29b7c1461088b578063b3c650151461089e578063b591d09a146108bf578063bf49bbde146108c8575f80fd5b80639edf0ecc14610824578063a217fddf14610837578063a35bb07e1461083e578063a6b89b8114610851575f80fd5b806395453a2d116101fc57806395453a2d146107a05780639a7b0508146107b35780639befc979146107c65780639c5ebca1146107d95780639c9531d0146107ec575f80fd5b8063808cdedd1461073c5780638d9d80911461074f5780639010d07c1461076257806391d148541461078d575f80fd5b8063390530f41161032e5780635684e702116102b857806371a7a39e1161028857806371a7a39e146106e7578063726f0729146106fa57806375d9e8101461070d5780637f3e3fa7146107205780638083dc4814610729575f80fd5b80635684e7021461066b578063600ce782146106935780636496a430146106c157806367f73735146106d4575f80fd5b80633deace15116102fe5780633deace15146106135780634031002d1461062657806349a0fae714610646578063533c60d91461064f578063541ec54214610662575f80fd5b8063390530f4146105975780633914285e146105aa5780633adb8f9c146105b35780633c151e2214610600575f80fd5b80631e97abd1116103af5780633373a1641161037f5780633373a1641461053857806333cdbd401461054b578063351da1e51461055e57806336568abe14610571578063384bfdf414610584575f80fd5b80631e97abd1146104f6578063248a9ca3146104ff57806329bbbd60146105125780632f2ff15d14610525575f80fd5b80630b8f26e3116103f55780630b8f26e3146104975780631332971c146104aa5780631472e1cd146104bd5780631974fa1d146104d05780631a31fb30146104e3575f80fd5b806301ffc9a71461042657806305284fb81461044e57806307a994c7146104635780630820659c14610484575b5f80fd5b6104396104343660046129b2565b610a41565b60405190151581526020015b60405180910390f35b61046161045c3660046129d9565b610a6b565b005b6104766104713660046129d9565b610ab0565b604051908152602001610445565b6104616104923660046129f0565b610ae8565b6104616104a53660046129d9565b610b81565b6104616104b83660046129f0565b610bd2565b6104616104cb3660046129d9565b610c5f565b6104616104de3660046129f0565b610c76565b6104616104f13660046129d9565b610d02565b61047660045481565b61047661050d3660046129d9565b610d15565b6104766105203660046129d9565b610d35565b610461610533366004612a26565b610d5a565b6104616105463660046129d9565b610d7c565b6104616105593660046129d9565b610d8f565b61046161056c3660046129d9565b610da2565b61046161057f366004612a26565b610df7565b6104616105923660046129d9565b610e2f565b6104616105a53660046129d9565b610e74565b610476600e5481565b6010546105d99063ffffffff80821691600160201b8104821691600160401b9091041683565b6040805163ffffffff94851681529284166020840152921691810191909152606001610445565b61046161060e3660046129d9565b610ec2565b6104616106213660046129d9565b610f07565b6106396106343660046129d9565b610f1a565b6040516104459190612a50565b61047660125481565b61047661065d3660046129d9565b611015565b61047660145481565b61067e6106793660046129d9565b61103a565b60408051928352602083019190915201610445565b6106a66106a13660046129d9565b611096565b60408051938452602084019290925290820152606001610445565b6104616106cf3660046129f0565b611136565b6104616106e2366004612a9e565b6111c2565b6104616106f53660046129f0565b61128c565b610461610708366004612ac7565b611318565b61046161071b3660046129f0565b6113f9565b610476600a5481565b6104616107373660046129f0565b61140d565b61046161074a3660046129f0565b611421565b61046161075d3660046129d9565b6114ad565b6107756107703660046129f0565b6114fb565b6040516001600160a01b039091168152602001610445565b61043961079b366004612a26565b611528565b6106396107ae3660046129d9565b61155e565b6104766107c13660046129d9565b611648565b6104616107d4366004612ac7565b611666565b6104616107e73660046129d9565b611738565b600c546108079063ffffffff80821691600160201b90041682565b6040805163ffffffff938416815292909116602083015201610445565b610461610832366004612a9e565b61177d565b6104765f81565b61046161084c3660046129f0565b611792565b6104767f000000000000000000000000000000000000000000000000000000000000000081565b6104766108863660046129d9565b6117e9565b6104616108993660046129d9565b61183d565b6108a6611850565b60405167ffffffffffffffff9091168152602001610445565b61047660165481565b6104616108d6366004612b3f565b611888565b6104616108e93660046129d9565b611979565b6104766108fc3660046129d9565b6119ca565b61046161090f3660046129d9565b6119ee565b6104616109223660046129d9565b611a33565b610461610935366004612a26565b611a78565b610461610948366004612a9e565b611a94565b6104767f000000000000000000000000000000000000000000000000000000000000000081565b6104616109823660046129d9565b611b50565b6104616109953660046129d9565b611b95565b61047660085481565b6104616109b1366004612b6e565b611ba8565b6108076109c43660046129d9565b611d9d565b6104765f5481565b6006546108079063ffffffff80821691600160201b90041682565b6104616109fa3660046129d9565b611ddf565b610476610a0d3660046129d9565b611df2565b610461610a203660046129d9565b611e16565b61047660025481565b610476610a3c3660046129d9565b611e29565b5f6001600160e01b03198216635a05180f60e01b1480610a655750610a6582611e6d565b92915050565b5f610a7581611ea1565b5f828152600f60205260408082208290555183917f3cea17c78f077924551bbcc01c140208cf087e3736225cd921e36d140cf2975791a25050565b5f8181526003602052604081208054600160f81b900460ff16610ad557600254610ae1565b80546001600160f81b03165b9392505050565b5f610af281611ea1565b6040518060400160405280610b0684611eae565b6001600160f81b03908116825260016020928301525f86815260038352604090819020845194909301511515600160f81b02939091169290921790555183907fbfdb11d95e87f282b12252576ce5982bf3136988ec3db94a3ab3a76a4455e38c90610b749085815260200190565b60405180910390a2505050565b5f610b8b81611ea1565b5f828152600d6020526040808220805467ffffffffffffffff191690555183917ff1f344546b4e8f595b2ee9e9d26ed7baf40dc1fe8ef739b03280cb814c8e5df391a25050565b5f610bdc81611ea1565b6040518060400160405280610bf084611eae565b6001600160f81b039081168252600160209283018190525f878152908352604090819020845194909301511515600160f81b02939091169290921790555183907feb4ecc2a5d1e33322fd211762f890015ef34e3011b4c8f5553cb2cd623358ae290610b749085815260200190565b5f610c6981611ea1565b610c7282611eea565b5050565b5f610c8081611ea1565b6040518060400160405280610c9484611eae565b6001600160f81b03908116825260016020928301525f86815260058352604090819020845194909301511515600160f81b02939091169290921790555183907f9afc700402022d6c295c2958cca42433c1d1c0ed17bd245398d287d0a39bf98c90610b749085815260200190565b5f610d0c81611ea1565b610c7282611f26565b5f9081525f80516020612c5a833981519152602052604090206001015490565b5f8181526005602052604081208054600160f81b900460ff16610ad557600454610ae1565b610d6382610d15565b610d6c81611ea1565b610d768383611f64565b50505050565b5f610d8681611ea1565b610c7282611fa6565b5f610d9981611ea1565b610c7282611fda565b5f610dac81611ea1565b5f8281526011602052604080822080546bffffffffffffffffffffffff191690555183917f85fce40bc4dd2050ec84e91faf44c326631d96d8687b104c80a3eeb24885b61391a25050565b6001600160a01b0381163314610e205760405163334bd91960e11b815260040160405180910390fd5b610e2a8282612032565b505050565b5f610e3981611ea1565b5f828152600560205260408082208290555183917fdf66171f66c39a977630f44442f2fe955a5a8c6805ca3880b77a054ca4adf73491a25050565b5f610e7e81611ea1565b5f828152600b60205260408120610e949161297f565b60405182907f7cf549cc2bf55a4f33490a260e27f58e9cbad2b10b5cdcdc9f93dc951fdc68fd905f90a25050565b5f610ecc81611ea1565b5f828152601760205260408082208290555183917fbd84391fd589d04b1bf2df444b2d1ec15a5ff2e9eb2eb979688a9adc9f777eec91a25050565b5f610f1181611ea1565b610c728261206b565b606060095f8381526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b82821015610f8f578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190610f4c565b50505050905080515f036110105760408051600180825281830190925290816020015b604080518082019091525f8082526020820152815260200190600190039081610fb2579050509050604051806040016040528060018152602001600854815250815f8151811061100457611004612bac565b60200260200101819052505b919050565b5f818152600f602052604081208054600160f81b900460ff16610ad557600e54610ae1565b5f818152600d602052604081208054829190600160201b900463ffffffff16820361107c575050600c5463ffffffff80821694600160201b9092041692509050565b5463ffffffff80821695600160201b909204169350915050565b5f81815260116020526040812080548291829163ffffffff161580156110c857508054600160201b900463ffffffff16155b80156110e057508054600160401b900463ffffffff16155b1561110d57505060105463ffffffff8082169350600160201b820481169250600160401b9091041661112f565b5463ffffffff8082169450600160201b820481169350600160401b9091041690505b9193909250565b5f61114081611ea1565b604051806040016040528061115484611eae565b6001600160f81b03908116825260016020928301525f86815260178352604090819020845194909301511515600160f81b02939091169290921790555183907f1b5c70fd9206d548520cfeafa68b28852b05b6035f0408c6956f5ddf3819dbb290610b749085815260200190565b5f6111cc81611ea1565b6111d683836120a0565b60405180604001604052806111ea856120c8565b63ffffffff1681526020016111fe846120c8565b63ffffffff9081169091525f868152600d60209081526040918290208451815495909201518416600160201b0267ffffffffffffffff1990951691909316179290921790555184907fd95a69e8c1c04bb8dfa68176be1fad93af3f5f260cb6ee5fa0792bb6af5b09669061127e9086908690918252602082015260400190565b60405180910390a250505050565b5f61129681611ea1565b60405180604001604052806112aa84611eae565b6001600160f81b03908116825260016020928301525f86815260158352604090819020845194909301511515600160f81b02939091169290921790555183907feadb66df4fb1918232eab1ad26c6e48acae4606e4619aabec4658fa9938889ca90610b749085815260200190565b5f61132281611ea1565b61132c83836120f8565b5f848152600b60205260409020805415611356575f858152600b602052604081206113569161297f565b5f5b838110156113b7578185858381811061137357611373612bac565b83546001810185555f94855260209094206040909102929092019260020290910190506113ad828281358155602082013560018201555050565b5050600101611358565b50847f095ebf90f03ce7e04c184cbc20f7e79674aa2a457e6e09e9082e0dc0350365a885856040516113ea929190612bc0565b60405180910390a25050505050565b5f61140381611ea1565b610e2a838361223a565b5f61141781611ea1565b610e2a83836122ea565b5f61142b81611ea1565b604051806040016040528061143f84611eae565b6001600160f81b03908116825260016020928301525f868152600f8352604090819020845194909301511515600160f81b02939091169290921790555183907f20eae15fa694728a1eff8e6907a511dd23bd4bd04f0d73e8f26e61f9cafed75190610b749085815260200190565b5f6114b781611ea1565b5f8281526009602052604081206114cd9161297f565b60405182907f15c3f807b29a6a5da4ae9068d9c7f556c9ae59f1c5301e85e9a6f966bfd2e84d905f90a25050565b5f8281525f80516020612c3a833981519152602081905260408220611520908461238e565b949350505050565b5f9182525f80516020612c5a833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600b5f8381526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b828210156115d3578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190611590565b50505050905080515f036110105760408051600180825281830190925290816020015b604080518082019091525f80825260208201528152602001906001900390816115f6579050509050604051806040016040528060018152602001600a54815250815f8151811061100457611004612bac565b5f818152601360205260408120549081900361101057505060125490565b5f61167081611ea1565b61167a83836120f8565b5f8481526009602052604090208054156116a4575f8581526009602052604081206116a49161297f565b5f5b8381101561170557818585838181106116c1576116c1612bac565b83546001810185555f94855260209094206040909102929092019260020290910190506116fb828281358155602082013560018201555050565b50506001016116a6565b50847f1e4643269db812a4814fc9923a5cb5b9f8f212193add82e9b525d9e20c11041085856040516113ea929190612bc0565b5f61174281611ea1565b5f828152601360205260408082208290555183917fc5aa054c2c0f4bb3c866f44f8e5062c9a09da86e371118ea7eb9b84848f0ffde91a25050565b5f61178781611ea1565b610d76848484612399565b5f61179c81611ea1565b6117a582612486565b5f83815260136020526040908190208390555183907f1b550eacd68ffc9d5aa86266bce448ee53e88cb7d8eeca7eb8de08f81e730f4b90610b749085815260200190565b5f8181526017602090815260408083208151808301909252546001600160f81b0381168252600160f81b900460ff1615159181018290529061182d57601654610ae1565b516001600160f81b031692915050565b5f61184781611ea1565b610c72826124a6565b5f6118837ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005467ffffffffffffffff1690565b905090565b5f61189281611ea1565b61189d8484846124db565b60405180606001604052806118b1866120c8565b63ffffffff1681526020016118c5856120c8565b63ffffffff1681526020016118d9846120c8565b63ffffffff9081169091525f878152601160209081526040918290208451815486840151968501518616600160401b0263ffffffff60401b19978716600160201b0267ffffffffffffffff199092169290961691909117179490941692909217909255815186815290810185905290810183905285907fc561186e15cc08e3740a07971a4560b2fc9ca49d06a1da53ccc755c53ffad6b5906060016113ea565b5f61198381611ea1565b5f82815260076020526040808220805467ffffffffffffffff191690555183917f6aa2be35a03b2495cc2e2d7c23c395d6294eac0f08b8975d5b61ecfe858c433b91a25050565b5f8181525f80516020612c3a833981519152602081905260408220610ae19061250f565b5f6119f881611ea1565b5f828152600360205260408082208290555183917f937c833a4a10529235d61dcf2004cbd39968786cd4d5623a5ea1754955fa522491a25050565b5f611a3d81611ea1565b5f828152600160205260408082208290555183917ff25dcadbf389c152c9f293f7c48c878f24d1985fb3568315e7abe669b6a863b591a25050565b611a8182610d15565b611a8a81611ea1565b610d768383612032565b5f611a9e81611ea1565b611aa88383612518565b6040518060400160405280611abc856120c8565b63ffffffff168152602001611ad0846120c8565b63ffffffff9081169091525f868152600760209081526040918290208451815495909201518416600160201b0267ffffffffffffffff1990951691909316179290921790555184907f66461c5e3c113da34b5f1035b801700a20e2f1a26c87d45b4346fc68e3a8cb5c9061127e9086908690918252602082015260400190565b5f611b5a81611ea1565b5f828152601560205260408082208290555183917f820479d95e6de13167a46c4d48b6ceb806e2d858fd85b5dd8a7f24a99a97231a91a25050565b5f611b9f81611ea1565b610c72826125a3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f81158015611bed5750825b90505f8267ffffffffffffffff166001148015611c095750303b155b905081158015611c17575080155b15611c355760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611c5f57845460ff60401b1916600160401b1785555b6001600160a01b038716611c8657604051633ef39b8160e01b815260040160405180910390fd5b611c908635611fa6565b611c9d86602001356125a3565b611caa86604001356125d8565b611cb7866060013561260d565b611cc48660800135611fda565b611cd68660a001358760c0013561223a565b611ce4866101200135611eea565b611cfe866101400135876101600135886101800135612399565b611d118660e001358761010001356122ea565b611d1f866101a00135611f26565b611d2d866101c0013561206b565b611d3b866101e001356124a6565b611d43612665565b611d4d5f88611f64565b508315611d9457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f8181526007602052604081208054829190600160201b900463ffffffff16820361107c57505060065463ffffffff80821694600160201b9092041692509050565b5f611de981611ea1565b610c728261260d565b5f8181526001602052604081208054600160f81b900460ff16610ad5575f54610ae1565b5f611e2081611ea1565b610c72826125d8565b5f8181526015602090815260408083208151808301909252546001600160f81b0381168252600160f81b900460ff1615159181018290529061182d57601454610ae1565b5f6001600160e01b03198216637965db0b60e01b1480610a6557506301ffc9a760e01b6001600160e01b0319831614610a65565b611eab813361266f565b50565b5f6001600160f81b03821115611ee6576040516306dfcc6560e41b815260f86004820152602481018390526044015b60405180910390fd5b5090565b600e8190556040518181527fb8322c3f829eef7cf1ee51739884859c5a7a3421a9069a2ea0eb72219823094d906020015b60405180910390a150565b611f2f81612486565b60128190556040518181527f63975a918e6e40eb014f8e933d55d7f120a2bd111e173360153b357249727c5f90602001611f1b565b5f5f80516020612c3a83398151915281611f7e85856126a8565b90508015611520575f858152602083905260409020611f9d9085612749565b50949350505050565b5f8190556040518181527f7f44d94c4ba99a62f393d42a985fed36a76e6b1a2cb378ea18180e1cdb27c9ef90602001611f1b565b612710811115611ffd5760405163413a2e5360e01b815260040160405180910390fd5b600a8190556040518181527f9a4b729d4e365eebc740b9d0763a1302c2d6c665ec429c87f9eca0ce2f6ba2de90602001611f1b565b5f5f80516020612c3a8339815191528161204c858561275d565b90508015611520575f858152602083905260409020611f9d90856127d6565b60148190556040518181527f2568cbc15cf2d9e34de76c131b8fd30f3e0690a8928c027e3ae8f6adf792967b90602001611f1b565b8015806120ab575081155b15610c7257604051622e4d9f60e11b815260040160405180910390fd5b5f63ffffffff821115611ee6576040516306dfcc6560e41b81526020600482015260248101839052604401611edd565b5f81900361211957604051633ec7bd9760e01b815260040160405180910390fd5b81815f81811061212b5761212b612bac565b9050604002015f013560011461215457604051633ec7bd9760e01b815260040160405180910390fd5b61271082825f81811061216957612169612bac565b90506040020160200135111561219257604051633ec7bd9760e01b815260040160405180910390fd5b60015b81811015610e2a578282600183038181106121b2576121b2612bac565b9050604002015f01358383838181106121cd576121cd612bac565b9050604002015f0135116121f457604051633ec7bd9760e01b815260040160405180910390fd5b61271083838381811061220957612209612bac565b90506040020160200135111561223257604051633ec7bd9760e01b815260040160405180910390fd5b600101612195565b61224482826120a0565b6040518060400160405280612258846120c8565b63ffffffff16815260200161226c836120c8565b63ffffffff9081169091528151600c80546020909401518316600160201b0267ffffffffffffffff1990941691909216179190911790556040517f7fe1cdad48b436f21fbbcf184487f60fc38ef145c8d91f0499052abded80b149906122de9084908490918252602082015260400190565b60405180910390a15050565b6122f48282612518565b6040518060400160405280612308846120c8565b63ffffffff16815260200161231c836120c8565b63ffffffff9081169091528151600680546020909401518316600160201b0267ffffffffffffffff1990941691909216179190911790556040517ffa24f285a48ec646597783f0da25d5b690c6c6cce4df8abbf73dc3ac763ecaa3906122de9084908490918252602082015260400190565b5f610ae183836127ea565b6123a48383836124db565b60405180606001604052806123b8856120c8565b63ffffffff1681526020016123cc846120c8565b63ffffffff1681526020016123e0836120c8565b63ffffffff90811690915281516010805460208501516040958601518516600160401b0263ffffffff60401b19918616600160201b0267ffffffffffffffff1990931694909516939093171791909116919091179055517f8458290c9d3d495665598cb2ef88cb10338287228ccea69e96166ad30c7d2a9590612479908590859085909283526020830191909152604082015260600190565b60405180910390a1505050565b805f03611eab57604051633c36231360e11b815260040160405180910390fd5b60168190556040518181527fdd10741741bd981f5126e08cd0b47bdc8a737bd3d031dda270fd22ddccabbc8c90602001611f1b565b821580156124e7575081155b80156124f1575080155b15610e2a5760405163076df15560e41b815260040160405180910390fd5b5f610a65825490565b7f000000000000000000000000000000000000000000000000000000000000000082118061256557507f000000000000000000000000000000000000000000000000000000000000000082145b1561258357604051633d2b5e5560e21b815260040160405180910390fd5b805f03610c7257604051631ac57a2160e11b815260040160405180910390fd5b60028190556040518181527f058c14a22aeef4bebb83ecbff4730ad324e9b41ae29b17a59fa814c4e066d01d90602001611f1b565b60048190556040518181527fdb0c52b8ad6c5b56b45a406e6669dec9bf62c73943389e5b4d55bd59754fb38a90602001611f1b565b6127108111156126305760405163f723d85d60e01b815260040160405180910390fd5b60088190556040518181527f5fb2003374f60e2d64b6f54356b8ba7cb4bd5ffe092bd71ee3a509fb2934031190602001611f1b565b61266d612810565b565b6126798282611528565b610c725760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611edd565b5f5f80516020612c5a8339815191526126c18484611528565b612740575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556126f63390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610a65565b5f915050610a65565b5f610ae1836001600160a01b038416612859565b5f5f80516020612c5a8339815191526127768484611528565b15612740575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610a65565b5f610ae1836001600160a01b0384166128a5565b5f825f0182815481106127ff576127ff612bac565b905f5260205f200154905092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661266d57604051631afcd79f60e31b815260040160405180910390fd5b5f81815260018301602052604081205461289e57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610a65565b505f610a65565b5f8181526001830160205260408120548015612740575f6128c7600183612c06565b85549091505f906128da90600190612c06565b9050808214612939575f865f0182815481106128f8576128f8612bac565b905f5260205f200154905080875f01848154811061291857612918612bac565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061294a5761294a612c25565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610a65565b5080545f8255600202905f5260205f2090810190611eab91905b80821115611ee6575f8082556001820155600201612999565b5f602082840312156129c2575f80fd5b81356001600160e01b031981168114610ae1575f80fd5b5f602082840312156129e9575f80fd5b5035919050565b5f8060408385031215612a01575f80fd5b50508035926020909101359150565b80356001600160a01b0381168114611010575f80fd5b5f8060408385031215612a37575f80fd5b82359150612a4760208401612a10565b90509250929050565b602080825282518282018190525f919060409081850190868401855b82811015612a9157815180518552860151868501529284019290850190600101612a6c565b5091979650505050505050565b5f805f60608486031215612ab0575f80fd5b505081359360208301359350604090920135919050565b5f805f60408486031215612ad9575f80fd5b83359250602084013567ffffffffffffffff80821115612af7575f80fd5b818601915086601f830112612b0a575f80fd5b813581811115612b18575f80fd5b8760208260061b8501011115612b2c575f80fd5b6020830194508093505050509250925092565b5f805f8060808587031215612b52575f80fd5b5050823594602084013594506040840135936060013592509050565b5f80828403610220811215612b81575f80fd5b612b8a84612a10565b9250610200601f1982011215612b9e575f80fd5b506020830190509250929050565b634e487b7160e01b5f52603260045260245ffd5b60208082528181018390525f90604080840186845b87811015612bf9578135835284820135858401529183019190830190600101612bd5565b5090979650505050505050565b81810381811115610a6557634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfec1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a164736f6c6343000818000a0000000000000000000000000000000000000000000000000000000000000005
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610422575f3560e01c8063808cdedd1161022c578063c58e4bc711610135578063d96dd07e116100bf578063f2db2c8b11610084578063f2db2c8b146109ec578063f42d7db5146109ff578063f535c7ea14610a12578063f8b84e6d14610a25578063f91a79b514610a2e575f80fd5b8063d96dd07e1461099a578063dec45c38146109a3578063decfec56146109b6578063e5fa9277146109c9578063f18c961a146109d1575f80fd5b8063d547741f11610105578063d547741f14610927578063d5d3687c1461093a578063d614ae0c1461094d578063d665d19514610974578063d8ef52f414610987575f80fd5b8063c58e4bc7146108db578063ca15c873146108ee578063ce2bccdf14610901578063cf4e0bb214610914575f80fd5b80639edf0ecc116101b6578063acd9813011610186578063acd9813014610878578063b0a29b7c1461088b578063b3c650151461089e578063b591d09a146108bf578063bf49bbde146108c8575f80fd5b80639edf0ecc14610824578063a217fddf14610837578063a35bb07e1461083e578063a6b89b8114610851575f80fd5b806395453a2d116101fc57806395453a2d146107a05780639a7b0508146107b35780639befc979146107c65780639c5ebca1146107d95780639c9531d0146107ec575f80fd5b8063808cdedd1461073c5780638d9d80911461074f5780639010d07c1461076257806391d148541461078d575f80fd5b8063390530f41161032e5780635684e702116102b857806371a7a39e1161028857806371a7a39e146106e7578063726f0729146106fa57806375d9e8101461070d5780637f3e3fa7146107205780638083dc4814610729575f80fd5b80635684e7021461066b578063600ce782146106935780636496a430146106c157806367f73735146106d4575f80fd5b80633deace15116102fe5780633deace15146106135780634031002d1461062657806349a0fae714610646578063533c60d91461064f578063541ec54214610662575f80fd5b8063390530f4146105975780633914285e146105aa5780633adb8f9c146105b35780633c151e2214610600575f80fd5b80631e97abd1116103af5780633373a1641161037f5780633373a1641461053857806333cdbd401461054b578063351da1e51461055e57806336568abe14610571578063384bfdf414610584575f80fd5b80631e97abd1146104f6578063248a9ca3146104ff57806329bbbd60146105125780632f2ff15d14610525575f80fd5b80630b8f26e3116103f55780630b8f26e3146104975780631332971c146104aa5780631472e1cd146104bd5780631974fa1d146104d05780631a31fb30146104e3575f80fd5b806301ffc9a71461042657806305284fb81461044e57806307a994c7146104635780630820659c14610484575b5f80fd5b6104396104343660046129b2565b610a41565b60405190151581526020015b60405180910390f35b61046161045c3660046129d9565b610a6b565b005b6104766104713660046129d9565b610ab0565b604051908152602001610445565b6104616104923660046129f0565b610ae8565b6104616104a53660046129d9565b610b81565b6104616104b83660046129f0565b610bd2565b6104616104cb3660046129d9565b610c5f565b6104616104de3660046129f0565b610c76565b6104616104f13660046129d9565b610d02565b61047660045481565b61047661050d3660046129d9565b610d15565b6104766105203660046129d9565b610d35565b610461610533366004612a26565b610d5a565b6104616105463660046129d9565b610d7c565b6104616105593660046129d9565b610d8f565b61046161056c3660046129d9565b610da2565b61046161057f366004612a26565b610df7565b6104616105923660046129d9565b610e2f565b6104616105a53660046129d9565b610e74565b610476600e5481565b6010546105d99063ffffffff80821691600160201b8104821691600160401b9091041683565b6040805163ffffffff94851681529284166020840152921691810191909152606001610445565b61046161060e3660046129d9565b610ec2565b6104616106213660046129d9565b610f07565b6106396106343660046129d9565b610f1a565b6040516104459190612a50565b61047660125481565b61047661065d3660046129d9565b611015565b61047660145481565b61067e6106793660046129d9565b61103a565b60408051928352602083019190915201610445565b6106a66106a13660046129d9565b611096565b60408051938452602084019290925290820152606001610445565b6104616106cf3660046129f0565b611136565b6104616106e2366004612a9e565b6111c2565b6104616106f53660046129f0565b61128c565b610461610708366004612ac7565b611318565b61046161071b3660046129f0565b6113f9565b610476600a5481565b6104616107373660046129f0565b61140d565b61046161074a3660046129f0565b611421565b61046161075d3660046129d9565b6114ad565b6107756107703660046129f0565b6114fb565b6040516001600160a01b039091168152602001610445565b61043961079b366004612a26565b611528565b6106396107ae3660046129d9565b61155e565b6104766107c13660046129d9565b611648565b6104616107d4366004612ac7565b611666565b6104616107e73660046129d9565b611738565b600c546108079063ffffffff80821691600160201b90041682565b6040805163ffffffff938416815292909116602083015201610445565b610461610832366004612a9e565b61177d565b6104765f81565b61046161084c3660046129f0565b611792565b6104767f000000000000000000000000000000000000000000000000000000000000000481565b6104766108863660046129d9565b6117e9565b6104616108993660046129d9565b61183d565b6108a6611850565b60405167ffffffffffffffff9091168152602001610445565b61047660165481565b6104616108d6366004612b3f565b611888565b6104616108e93660046129d9565b611979565b6104766108fc3660046129d9565b6119ca565b61046161090f3660046129d9565b6119ee565b6104616109223660046129d9565b611a33565b610461610935366004612a26565b611a78565b610461610948366004612a9e565b611a94565b6104767f000000000000000000000000000000000000000000000000000000000000000581565b6104616109823660046129d9565b611b50565b6104616109953660046129d9565b611b95565b61047660085481565b6104616109b1366004612b6e565b611ba8565b6108076109c43660046129d9565b611d9d565b6104765f5481565b6006546108079063ffffffff80821691600160201b90041682565b6104616109fa3660046129d9565b611ddf565b610476610a0d3660046129d9565b611df2565b610461610a203660046129d9565b611e16565b61047660025481565b610476610a3c3660046129d9565b611e29565b5f6001600160e01b03198216635a05180f60e01b1480610a655750610a6582611e6d565b92915050565b5f610a7581611ea1565b5f828152600f60205260408082208290555183917f3cea17c78f077924551bbcc01c140208cf087e3736225cd921e36d140cf2975791a25050565b5f8181526003602052604081208054600160f81b900460ff16610ad557600254610ae1565b80546001600160f81b03165b9392505050565b5f610af281611ea1565b6040518060400160405280610b0684611eae565b6001600160f81b03908116825260016020928301525f86815260038352604090819020845194909301511515600160f81b02939091169290921790555183907fbfdb11d95e87f282b12252576ce5982bf3136988ec3db94a3ab3a76a4455e38c90610b749085815260200190565b60405180910390a2505050565b5f610b8b81611ea1565b5f828152600d6020526040808220805467ffffffffffffffff191690555183917ff1f344546b4e8f595b2ee9e9d26ed7baf40dc1fe8ef739b03280cb814c8e5df391a25050565b5f610bdc81611ea1565b6040518060400160405280610bf084611eae565b6001600160f81b039081168252600160209283018190525f878152908352604090819020845194909301511515600160f81b02939091169290921790555183907feb4ecc2a5d1e33322fd211762f890015ef34e3011b4c8f5553cb2cd623358ae290610b749085815260200190565b5f610c6981611ea1565b610c7282611eea565b5050565b5f610c8081611ea1565b6040518060400160405280610c9484611eae565b6001600160f81b03908116825260016020928301525f86815260058352604090819020845194909301511515600160f81b02939091169290921790555183907f9afc700402022d6c295c2958cca42433c1d1c0ed17bd245398d287d0a39bf98c90610b749085815260200190565b5f610d0c81611ea1565b610c7282611f26565b5f9081525f80516020612c5a833981519152602052604090206001015490565b5f8181526005602052604081208054600160f81b900460ff16610ad557600454610ae1565b610d6382610d15565b610d6c81611ea1565b610d768383611f64565b50505050565b5f610d8681611ea1565b610c7282611fa6565b5f610d9981611ea1565b610c7282611fda565b5f610dac81611ea1565b5f8281526011602052604080822080546bffffffffffffffffffffffff191690555183917f85fce40bc4dd2050ec84e91faf44c326631d96d8687b104c80a3eeb24885b61391a25050565b6001600160a01b0381163314610e205760405163334bd91960e11b815260040160405180910390fd5b610e2a8282612032565b505050565b5f610e3981611ea1565b5f828152600560205260408082208290555183917fdf66171f66c39a977630f44442f2fe955a5a8c6805ca3880b77a054ca4adf73491a25050565b5f610e7e81611ea1565b5f828152600b60205260408120610e949161297f565b60405182907f7cf549cc2bf55a4f33490a260e27f58e9cbad2b10b5cdcdc9f93dc951fdc68fd905f90a25050565b5f610ecc81611ea1565b5f828152601760205260408082208290555183917fbd84391fd589d04b1bf2df444b2d1ec15a5ff2e9eb2eb979688a9adc9f777eec91a25050565b5f610f1181611ea1565b610c728261206b565b606060095f8381526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b82821015610f8f578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190610f4c565b50505050905080515f036110105760408051600180825281830190925290816020015b604080518082019091525f8082526020820152815260200190600190039081610fb2579050509050604051806040016040528060018152602001600854815250815f8151811061100457611004612bac565b60200260200101819052505b919050565b5f818152600f602052604081208054600160f81b900460ff16610ad557600e54610ae1565b5f818152600d602052604081208054829190600160201b900463ffffffff16820361107c575050600c5463ffffffff80821694600160201b9092041692509050565b5463ffffffff80821695600160201b909204169350915050565b5f81815260116020526040812080548291829163ffffffff161580156110c857508054600160201b900463ffffffff16155b80156110e057508054600160401b900463ffffffff16155b1561110d57505060105463ffffffff8082169350600160201b820481169250600160401b9091041661112f565b5463ffffffff8082169450600160201b820481169350600160401b9091041690505b9193909250565b5f61114081611ea1565b604051806040016040528061115484611eae565b6001600160f81b03908116825260016020928301525f86815260178352604090819020845194909301511515600160f81b02939091169290921790555183907f1b5c70fd9206d548520cfeafa68b28852b05b6035f0408c6956f5ddf3819dbb290610b749085815260200190565b5f6111cc81611ea1565b6111d683836120a0565b60405180604001604052806111ea856120c8565b63ffffffff1681526020016111fe846120c8565b63ffffffff9081169091525f868152600d60209081526040918290208451815495909201518416600160201b0267ffffffffffffffff1990951691909316179290921790555184907fd95a69e8c1c04bb8dfa68176be1fad93af3f5f260cb6ee5fa0792bb6af5b09669061127e9086908690918252602082015260400190565b60405180910390a250505050565b5f61129681611ea1565b60405180604001604052806112aa84611eae565b6001600160f81b03908116825260016020928301525f86815260158352604090819020845194909301511515600160f81b02939091169290921790555183907feadb66df4fb1918232eab1ad26c6e48acae4606e4619aabec4658fa9938889ca90610b749085815260200190565b5f61132281611ea1565b61132c83836120f8565b5f848152600b60205260409020805415611356575f858152600b602052604081206113569161297f565b5f5b838110156113b7578185858381811061137357611373612bac565b83546001810185555f94855260209094206040909102929092019260020290910190506113ad828281358155602082013560018201555050565b5050600101611358565b50847f095ebf90f03ce7e04c184cbc20f7e79674aa2a457e6e09e9082e0dc0350365a885856040516113ea929190612bc0565b60405180910390a25050505050565b5f61140381611ea1565b610e2a838361223a565b5f61141781611ea1565b610e2a83836122ea565b5f61142b81611ea1565b604051806040016040528061143f84611eae565b6001600160f81b03908116825260016020928301525f868152600f8352604090819020845194909301511515600160f81b02939091169290921790555183907f20eae15fa694728a1eff8e6907a511dd23bd4bd04f0d73e8f26e61f9cafed75190610b749085815260200190565b5f6114b781611ea1565b5f8281526009602052604081206114cd9161297f565b60405182907f15c3f807b29a6a5da4ae9068d9c7f556c9ae59f1c5301e85e9a6f966bfd2e84d905f90a25050565b5f8281525f80516020612c3a833981519152602081905260408220611520908461238e565b949350505050565b5f9182525f80516020612c5a833981519152602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060600b5f8381526020019081526020015f20805480602002602001604051908101604052809291908181526020015f905b828210156115d3578382905f5260205f2090600202016040518060400160405290815f820154815260200160018201548152505081526020019060010190611590565b50505050905080515f036110105760408051600180825281830190925290816020015b604080518082019091525f80825260208201528152602001906001900390816115f6579050509050604051806040016040528060018152602001600a54815250815f8151811061100457611004612bac565b5f818152601360205260408120549081900361101057505060125490565b5f61167081611ea1565b61167a83836120f8565b5f8481526009602052604090208054156116a4575f8581526009602052604081206116a49161297f565b5f5b8381101561170557818585838181106116c1576116c1612bac565b83546001810185555f94855260209094206040909102929092019260020290910190506116fb828281358155602082013560018201555050565b50506001016116a6565b50847f1e4643269db812a4814fc9923a5cb5b9f8f212193add82e9b525d9e20c11041085856040516113ea929190612bc0565b5f61174281611ea1565b5f828152601360205260408082208290555183917fc5aa054c2c0f4bb3c866f44f8e5062c9a09da86e371118ea7eb9b84848f0ffde91a25050565b5f61178781611ea1565b610d76848484612399565b5f61179c81611ea1565b6117a582612486565b5f83815260136020526040908190208390555183907f1b550eacd68ffc9d5aa86266bce448ee53e88cb7d8eeca7eb8de08f81e730f4b90610b749085815260200190565b5f8181526017602090815260408083208151808301909252546001600160f81b0381168252600160f81b900460ff1615159181018290529061182d57601654610ae1565b516001600160f81b031692915050565b5f61184781611ea1565b610c72826124a6565b5f6118837ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005467ffffffffffffffff1690565b905090565b5f61189281611ea1565b61189d8484846124db565b60405180606001604052806118b1866120c8565b63ffffffff1681526020016118c5856120c8565b63ffffffff1681526020016118d9846120c8565b63ffffffff9081169091525f878152601160209081526040918290208451815486840151968501518616600160401b0263ffffffff60401b19978716600160201b0267ffffffffffffffff199092169290961691909117179490941692909217909255815186815290810185905290810183905285907fc561186e15cc08e3740a07971a4560b2fc9ca49d06a1da53ccc755c53ffad6b5906060016113ea565b5f61198381611ea1565b5f82815260076020526040808220805467ffffffffffffffff191690555183917f6aa2be35a03b2495cc2e2d7c23c395d6294eac0f08b8975d5b61ecfe858c433b91a25050565b5f8181525f80516020612c3a833981519152602081905260408220610ae19061250f565b5f6119f881611ea1565b5f828152600360205260408082208290555183917f937c833a4a10529235d61dcf2004cbd39968786cd4d5623a5ea1754955fa522491a25050565b5f611a3d81611ea1565b5f828152600160205260408082208290555183917ff25dcadbf389c152c9f293f7c48c878f24d1985fb3568315e7abe669b6a863b591a25050565b611a8182610d15565b611a8a81611ea1565b610d768383612032565b5f611a9e81611ea1565b611aa88383612518565b6040518060400160405280611abc856120c8565b63ffffffff168152602001611ad0846120c8565b63ffffffff9081169091525f868152600760209081526040918290208451815495909201518416600160201b0267ffffffffffffffff1990951691909316179290921790555184907f66461c5e3c113da34b5f1035b801700a20e2f1a26c87d45b4346fc68e3a8cb5c9061127e9086908690918252602082015260400190565b5f611b5a81611ea1565b5f828152601560205260408082208290555183917f820479d95e6de13167a46c4d48b6ceb806e2d858fd85b5dd8a7f24a99a97231a91a25050565b5f611b9f81611ea1565b610c72826125a3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f81158015611bed5750825b90505f8267ffffffffffffffff166001148015611c095750303b155b905081158015611c17575080155b15611c355760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315611c5f57845460ff60401b1916600160401b1785555b6001600160a01b038716611c8657604051633ef39b8160e01b815260040160405180910390fd5b611c908635611fa6565b611c9d86602001356125a3565b611caa86604001356125d8565b611cb7866060013561260d565b611cc48660800135611fda565b611cd68660a001358760c0013561223a565b611ce4866101200135611eea565b611cfe866101400135876101600135886101800135612399565b611d118660e001358761010001356122ea565b611d1f866101a00135611f26565b611d2d866101c0013561206b565b611d3b866101e001356124a6565b611d43612665565b611d4d5f88611f64565b508315611d9457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f8181526007602052604081208054829190600160201b900463ffffffff16820361107c57505060065463ffffffff80821694600160201b9092041692509050565b5f611de981611ea1565b610c728261260d565b5f8181526001602052604081208054600160f81b900460ff16610ad5575f54610ae1565b5f611e2081611ea1565b610c72826125d8565b5f8181526015602090815260408083208151808301909252546001600160f81b0381168252600160f81b900460ff1615159181018290529061182d57601454610ae1565b5f6001600160e01b03198216637965db0b60e01b1480610a6557506301ffc9a760e01b6001600160e01b0319831614610a65565b611eab813361266f565b50565b5f6001600160f81b03821115611ee6576040516306dfcc6560e41b815260f86004820152602481018390526044015b60405180910390fd5b5090565b600e8190556040518181527fb8322c3f829eef7cf1ee51739884859c5a7a3421a9069a2ea0eb72219823094d906020015b60405180910390a150565b611f2f81612486565b60128190556040518181527f63975a918e6e40eb014f8e933d55d7f120a2bd111e173360153b357249727c5f90602001611f1b565b5f5f80516020612c3a83398151915281611f7e85856126a8565b90508015611520575f858152602083905260409020611f9d9085612749565b50949350505050565b5f8190556040518181527f7f44d94c4ba99a62f393d42a985fed36a76e6b1a2cb378ea18180e1cdb27c9ef90602001611f1b565b612710811115611ffd5760405163413a2e5360e01b815260040160405180910390fd5b600a8190556040518181527f9a4b729d4e365eebc740b9d0763a1302c2d6c665ec429c87f9eca0ce2f6ba2de90602001611f1b565b5f5f80516020612c3a8339815191528161204c858561275d565b90508015611520575f858152602083905260409020611f9d90856127d6565b60148190556040518181527f2568cbc15cf2d9e34de76c131b8fd30f3e0690a8928c027e3ae8f6adf792967b90602001611f1b565b8015806120ab575081155b15610c7257604051622e4d9f60e11b815260040160405180910390fd5b5f63ffffffff821115611ee6576040516306dfcc6560e41b81526020600482015260248101839052604401611edd565b5f81900361211957604051633ec7bd9760e01b815260040160405180910390fd5b81815f81811061212b5761212b612bac565b9050604002015f013560011461215457604051633ec7bd9760e01b815260040160405180910390fd5b61271082825f81811061216957612169612bac565b90506040020160200135111561219257604051633ec7bd9760e01b815260040160405180910390fd5b60015b81811015610e2a578282600183038181106121b2576121b2612bac565b9050604002015f01358383838181106121cd576121cd612bac565b9050604002015f0135116121f457604051633ec7bd9760e01b815260040160405180910390fd5b61271083838381811061220957612209612bac565b90506040020160200135111561223257604051633ec7bd9760e01b815260040160405180910390fd5b600101612195565b61224482826120a0565b6040518060400160405280612258846120c8565b63ffffffff16815260200161226c836120c8565b63ffffffff9081169091528151600c80546020909401518316600160201b0267ffffffffffffffff1990941691909216179190911790556040517f7fe1cdad48b436f21fbbcf184487f60fc38ef145c8d91f0499052abded80b149906122de9084908490918252602082015260400190565b60405180910390a15050565b6122f48282612518565b6040518060400160405280612308846120c8565b63ffffffff16815260200161231c836120c8565b63ffffffff9081169091528151600680546020909401518316600160201b0267ffffffffffffffff1990941691909216179190911790556040517ffa24f285a48ec646597783f0da25d5b690c6c6cce4df8abbf73dc3ac763ecaa3906122de9084908490918252602082015260400190565b5f610ae183836127ea565b6123a48383836124db565b60405180606001604052806123b8856120c8565b63ffffffff1681526020016123cc846120c8565b63ffffffff1681526020016123e0836120c8565b63ffffffff90811690915281516010805460208501516040958601518516600160401b0263ffffffff60401b19918616600160201b0267ffffffffffffffff1990931694909516939093171791909116919091179055517f8458290c9d3d495665598cb2ef88cb10338287228ccea69e96166ad30c7d2a9590612479908590859085909283526020830191909152604082015260600190565b60405180910390a1505050565b805f03611eab57604051633c36231360e11b815260040160405180910390fd5b60168190556040518181527fdd10741741bd981f5126e08cd0b47bdc8a737bd3d031dda270fd22ddccabbc8c90602001611f1b565b821580156124e7575081155b80156124f1575080155b15610e2a5760405163076df15560e41b815260040160405180910390fd5b5f610a65825490565b7f000000000000000000000000000000000000000000000000000000000000000582118061256557507f000000000000000000000000000000000000000000000000000000000000000482145b1561258357604051633d2b5e5560e21b815260040160405180910390fd5b805f03610c7257604051631ac57a2160e11b815260040160405180910390fd5b60028190556040518181527f058c14a22aeef4bebb83ecbff4730ad324e9b41ae29b17a59fa814c4e066d01d90602001611f1b565b60048190556040518181527fdb0c52b8ad6c5b56b45a406e6669dec9bf62c73943389e5b4d55bd59754fb38a90602001611f1b565b6127108111156126305760405163f723d85d60e01b815260040160405180910390fd5b60088190556040518181527f5fb2003374f60e2d64b6f54356b8ba7cb4bd5ffe092bd71ee3a509fb2934031190602001611f1b565b61266d612810565b565b6126798282611528565b610c725760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611edd565b5f5f80516020612c5a8339815191526126c18484611528565b612740575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556126f63390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610a65565b5f915050610a65565b5f610ae1836001600160a01b038416612859565b5f5f80516020612c5a8339815191526127768484611528565b15612740575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610a65565b5f610ae1836001600160a01b0384166128a5565b5f825f0182815481106127ff576127ff612bac565b905f5260205f200154905092915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661266d57604051631afcd79f60e31b815260040160405180910390fd5b5f81815260018301602052604081205461289e57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610a65565b505f610a65565b5f8181526001830160205260408120548015612740575f6128c7600183612c06565b85549091505f906128da90600190612c06565b9050808214612939575f865f0182815481106128f8576128f8612bac565b905f5260205f200154905080875f01848154811061291857612918612bac565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061294a5761294a612c25565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610a65565b5080545f8255600202905f5260205f2090810190611eab91905b80821115611ee6575f8082556001820155600201612999565b5f602082840312156129c2575f80fd5b81356001600160e01b031981168114610ae1575f80fd5b5f602082840312156129e9575f80fd5b5035919050565b5f8060408385031215612a01575f80fd5b50508035926020909101359150565b80356001600160a01b0381168114611010575f80fd5b5f8060408385031215612a37575f80fd5b82359150612a4760208401612a10565b90509250929050565b602080825282518282018190525f919060409081850190868401855b82811015612a9157815180518552860151868501529284019290850190600101612a6c565b5091979650505050505050565b5f805f60608486031215612ab0575f80fd5b505081359360208301359350604090920135919050565b5f805f60408486031215612ad9575f80fd5b83359250602084013567ffffffffffffffff80821115612af7575f80fd5b818601915086601f830112612b0a575f80fd5b813581811115612b18575f80fd5b8760208260061b8501011115612b2c575f80fd5b6020830194508093505050509250925092565b5f805f8060808587031215612b52575f80fd5b5050823594602084013594506040840135936060013592509050565b5f80828403610220811215612b81575f80fd5b612b8a84612a10565b9250610200601f1982011215612b9e575f80fd5b506020830190509250929050565b634e487b7160e01b5f52603260045260245ffd5b60208082528181018390525f90604080840186845b87811015612bf9578135835284820135858401529183019190830190600101612bd5565b5090979650505050505050565b81810381811115610a6557634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffdfec1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e8237170593200002dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a164736f6c6343000818000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000005
-----Decoded View---------------
Arg [0] : queueLowestPriority (uint256): 5
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000005
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.