From d7c6f3fe8c614ab7fc0aee8a17d8d0afe373046e Mon Sep 17 00:00:00 2001 From: Yash Patil <40046473+ypatil12@users.noreply.github.com> Date: Wed, 26 Jun 2024 11:01:25 -0400 Subject: [PATCH 01/43] Feat/operator sets (#579) * feat: operator set scaffold * fix: impl/storage compile errors; pending updating of tests * chore: `forge fmt` * fix: `OperatorSet` struct misuse * fix: comment * chore: verbose use of `OperatorSet` * test: `registerOperatorToOperatorSet` * feat: `registerOperatorToOperatorSets` Enables registering multiple operator sets in a single call. * chore: `forge fmt` * feat: interface changes * fix: operator set digest * fix: `OPERATOR_SET_REGISTRATION_TYPEHASH` * chore: `forge fmt` * test: wrong avs using signature * fix: optimize for SSTOREs * test: `deregisterOperatorFromOperatorSets` * chore: rename `operatorSetStrategies` * test: `addStrategiesToOperatorSet` * test: `removeStrategiesFromOperatorSet` * test: more coverage * chore: improve natspec * WIP: simp mode * WIP: simp mode * WIP: simp mode - includes interface change, specifically the `StandbyParams` structure. `id` isn't needed for storage. * test: simp mode * test: simp mode * test: simp mode * refactor: simp mode storage * Revert "refactor: simp mode storage" This reverts commit 3b0450e60aeaa9e2b428da6f5795c5e3b5754743. * Reapply "refactor: simp mode storage" This reverts commit 5f90d78af72edff64f8ba4741f02c702956053c1. * feat: simp mode * fix(optimize): salt cancellation - remove check * test: improvements * test: improvements * fix: move `isOperatorSetAVS` update out of loop ooops * fix: standby update typehash * test: cleanup * fix: move mutation out of loop * nit: cleanup * fix: remove unused events --------- Co-authored-by: clandestine.eth <96172957+0xClandestine@users.noreply.github.com> --- .../devnet/M2_Deploy_From_Scratch.s.sol | 2 +- .../holesky/M2_Deploy_From_Scratch.s.sol | 2 +- .../deploy/mainnet/M2_Mainnet_Upgrade.s.sol | 2 +- src/contracts/core/AVSDirectory.sol | 287 +++++++++- src/contracts/core/AVSDirectoryStorage.sol | 30 +- src/contracts/interfaces/IAVSDirectory.sol | 148 ++++- .../integration/IntegrationDeployer.t.sol | 4 +- src/test/unit/AVSDirectoryUnit.t.sol | 529 ++++++++++++++++-- 8 files changed, 902 insertions(+), 102 deletions(-) diff --git a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol index 36a1bd7b8..53917ee63 100644 --- a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol @@ -232,7 +232,7 @@ contract Deployer_M2 is Script, Test { // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs delegationImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); strategyManagerImplementation = new StrategyManager(delegation, eigenPodManager, slasher); - avsDirectoryImplementation = new AVSDirectory(delegation); + avsDirectoryImplementation = new AVSDirectory(delegation, strategyManager); slasherImplementation = new Slasher(strategyManager, delegation); eigenPodManagerImplementation = new EigenPodManager( ethPOSDeposit, diff --git a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol index 626626b49..b37bce965 100644 --- a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol @@ -81,7 +81,7 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { ); eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation)); - avsDirectoryImplementation = new AVSDirectory(delegationManager); + avsDirectoryImplementation = new AVSDirectory(delegationManager, strategyManager); delegationManagerImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher); slasherImplementation = new Slasher(strategyManager, delegationManager); diff --git a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol index daa042db5..ba6a43bf9 100644 --- a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol +++ b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol @@ -45,7 +45,7 @@ contract M2_Mainnet_Upgrade is ExistingDeploymentParser { */ function _deployImplementationContracts() internal { // 1. Deploy New TUPS - avsDirectoryImplementation = new AVSDirectory(delegationManager); + avsDirectoryImplementation = new AVSDirectory(delegationManager, strategyManager); avsDirectory = AVSDirectory( address( new TransparentUpgradeableProxy( diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index c1d004a8b..4e6be1146 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -15,12 +15,15 @@ contract AVSDirectory is AVSDirectoryStorage, ReentrancyGuardUpgradeable { - // @dev Index for flag that pauses operator register/deregister to avs when set. + /// @dev Index for flag that pauses operator register/deregister to avs when set. uint8 internal constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0; - // @dev Chain ID at the time of contract deployment + /// @dev Chain ID at the time of contract deployment uint256 internal immutable ORIGINAL_CHAIN_ID; + /// @notice Canonical, virtual beacon chain ETH strategy + IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); + /** * * INITIALIZING FUNCTIONS @@ -31,7 +34,10 @@ contract AVSDirectory is * @dev Initializes the immutable addresses of the strategy mananger, delegationManager, slasher, * and eigenpodManager contracts */ - constructor(IDelegationManager _delegation) AVSDirectoryStorage(_delegation) { + constructor( + IDelegationManager _delegation, + IStrategyManager _strategyManager + ) AVSDirectoryStorage(_delegation, _strategyManager) { _disableInitializers(); ORIGINAL_CHAIN_ID = block.chainid; } @@ -57,9 +63,188 @@ contract AVSDirectory is */ /** - * @notice Called by the AVS's service manager contract to register an operator with the avs. - * @param operator The address of the operator to register. - * @param operatorSignature The signature, salt, and expiry of the operator's signature. + * @notice Updates the standby parameters for an operator across multiple operator sets. + * Allows the AVS to add the operator to a given operator set if they are not already registered. + * + * @param operator The address of the operator for which the standby parameters are being updated. + * @param standbyParams The new standby parameters for the operator. + * @param operatorSignature If non-empty, the signature of the operator authorizing the modification. + * If empty, the `msg.sender` must be the operator. + */ + function updateStandbyParams( + address operator, + StandbyParam[] calldata standbyParams, + SignatureWithSaltAndExpiry calldata operatorSignature + ) external { + if (operatorSignature.signature.length == 0) { + // Assert caller is `operator` if signature length is zero. + require(msg.sender == operator, "AVSDirectory.updateStandbyParams: invalid signature"); + } else { + // Assert operator's signature has not expired. + require( + operatorSignature.expiry >= block.timestamp, + "AVSDirectory.updateStandbyParams: operator signature expired" + ); + // Assert operator's signature cannot be replayed. + require( + !operatorSaltIsSpent[operator][operatorSignature.salt], "AVSDirectory.updateStandbyParams: salt spent" + ); + // Assert operator's signature is valid. + EIP1271SignatureUtils.checkSignature_EIP1271( + operator, + calculateUpdateStandbyDigestHash(standbyParams, operatorSignature.salt, operatorSignature.expiry), + operatorSignature.signature + ); + // Spend salt. + operatorSaltIsSpent[operator][operatorSignature.salt] = true; + } + + for (uint256 i; i < standbyParams.length; ++i) { + onStandby[standbyParams[i].operatorSet.avs][operator][standbyParams[i].operatorSet.id] = + standbyParams[i].onStandby; + + emit StandbyParamUpdated(operator, standbyParams[i].operatorSet, standbyParams[i].onStandby); + } + } + + /** + * @notice Called by AVSs to add an operator to an operator set. + * + * @param operator The address of the operator to be added to the operator set. + * @param operatorSetIds The IDs of the operator sets. + * @param operatorSignature The signature of the operator on their intent to register. + * + * @dev msg.sender is used as the AVS. + * @dev The operator must not have a pending deregistration from the operator set. + * @dev If this is the first operator set in the AVS that the operator is + * registering for, a OperatorAVSRegistrationStatusUpdated event is emitted with + * a REGISTERED status. + */ + function registerOperatorToOperatorSets( + address operator, + uint32[] calldata operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + // Assert `operator` is actually an operator. + require( + delegation.isOperator(operator), + "AVSDirectory.registerOperatorToOperatorSets: operator not registered to EigenLayer yet" + ); + // Assert operator's signature has not expired. + require( + operatorSignature.expiry >= block.timestamp, + "AVSDirectory.registerOperatorToOperatorSets: operator signature expired" + ); + // Assert operator's signature `salt` has not already been spent. + require( + !operatorSaltIsSpent[operator][operatorSignature.salt], + "AVSDirectory.registerOperatorToOperatorSets: salt already spent" + ); + + if (operatorSignature.signature.length != 0) { + // Assert signature provided by `operator` is valid. + EIP1271SignatureUtils.checkSignature_EIP1271( + operator, + calculateOperatorSetRegistrationDigestHash({ + avs: msg.sender, + operatorSetIds: operatorSetIds, + salt: operatorSignature.salt, + expiry: operatorSignature.expiry + }), + operatorSignature.signature + ); + } + + // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. + operatorSaltIsSpent[operator][operatorSignature.salt] = true; + + // Register `operator` if not already registered. + if (avsOperatorStatus[msg.sender][operator] != OperatorAVSRegistrationStatus.REGISTERED) { + avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.REGISTERED; + emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.REGISTERED); + } + + // Mutate calling AVS to operator set AVS status, preventing further legacy registrations. + if (!isOperatorSetAVS[msg.sender]) isOperatorSetAVS[msg.sender] = true; + + // Loop over `operatorSetIds` array and register `operator` for each item. + for (uint256 i = 0; i < operatorSetIds.length; ++i) { + // Assert avs is on standby mode for the given `operator` and `operatorSetIds[i]`. + if (operatorSignature.signature.length == 0) { + require( + onStandby[msg.sender][operator][operatorSetIds[i]], + "AVSDirectory.registerOperatorToOperatorSets: avs not on standby" + ); + } + + // Assert `operator` has not already been registered to `operatorSetIds[i]`. + require( + !isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]], + "AVSDirectory.registerOperatorToOperatorSets: operator already registered to operator set" + ); + + // Mutate `isOperatorInOperatorSet` to `true` for `operatorSetIds[i]`. + isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]] = true; + + emit OperatorAddedToOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); + } + + // Increase `operatorAVSOperatorSetCount` by `operatorSetIds.length`. + // You would have to add the operator to 2**256-2 operator sets before overflow is possible here. + unchecked { + operatorAVSOperatorSetCount[msg.sender][operator] += operatorSetIds.length; + } + } + + /** + * @notice Called by AVSs or operators to remove an operator from an operator set. + * + * @param operator The address of the operator to be removed from the operator set. + * @param operatorSetIds The IDs of the operator sets. + * + * @dev msg.sender is used as the AVS. + * @dev The operator must be registered for the msg.sender AVS and the given operator set. + * @dev If this call removes the operator from all operator sets for the msg.sender AVS, + * then an OperatorAVSRegistrationStatusUpdated event is emitted with a DEREGISTERED status. + */ + function deregisterOperatorFromOperatorSets( + address operator, + uint32[] calldata operatorSetIds + ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + // Loop over `operatorSetIds` array and deregister `operator` for each item. + for (uint256 i = 0; i < operatorSetIds.length; ++i) { + // Assert `operator` is registered for this iterations operator set. + require( + isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]], + "AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set" + ); + + // Mutate `isOperatorInOperatorSet` to `false` for `operatorSetIds[i]`. + isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]] = false; + + emit OperatorRemovedFromOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); + } + + // The above assertion makes underflow logically impossible here. + unchecked { + operatorAVSOperatorSetCount[msg.sender][operator] -= operatorSetIds.length; + } + + // Set the operator as deregistered if no longer registered for any operator sets + if (operatorAVSOperatorSetCount[msg.sender][operator] == 0) { + avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.UNREGISTERED; + emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.UNREGISTERED); + } + } + + /** + * @notice Called by the AVS's service manager contract to register an operator with the AVS. + * + * @param operator The address of the operator to register. + * @param operatorSignature The signature, salt, and expiry of the operator's signature. + * + * @dev msg.sender must be the AVS. + * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. */ function registerOperatorToAVS( address operator, @@ -81,6 +266,10 @@ contract AVSDirectory is delegation.isOperator(operator), "AVSDirectory.registerOperatorToAVS: operator not registered to EigenLayer yet" ); + require( + !isOperatorSetAVS[msg.sender], + "AVSDirectory.registerOperatorToAVS: operator set AVS cannot register operators with legacy method" + ); // Calculate the digest hash bytes32 operatorRegistrationDigestHash = calculateOperatorAVSRegistrationDigestHash({ @@ -93,9 +282,7 @@ contract AVSDirectory is // forgefmt: disable-next-item // Check that the signature is valid EIP1271SignatureUtils.checkSignature_EIP1271( - operator, - operatorRegistrationDigestHash, - operatorSignature.signature + operator, operatorRegistrationDigestHash, operatorSignature.signature ); // Set the operator as registered @@ -108,8 +295,11 @@ contract AVSDirectory is } /** - * @notice Called by an avs to deregister an operator with the avs. - * @param operator The address of the operator to deregister. + * @notice Called by an AVS to deregister an operator from the AVS. + * + * @param operator The address of the operator to deregister. + * + * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. */ function deregisterOperatorFromAVS(address operator) external @@ -127,8 +317,11 @@ contract AVSDirectory is } /** - * @notice Called by an avs to emit an `AVSMetadataURIUpdated` event indicating the information has updated. - * @param metadataURI The URI for metadata associated with an avs + * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. + * + * @param metadataURI The URI for metadata associated with an AVS. + * + * @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event. */ function updateAVSMetadataURI(string calldata metadataURI) external { emit AVSMetadataURIUpdated(msg.sender, metadataURI); @@ -136,10 +329,10 @@ contract AVSDirectory is /** * @notice Called by an operator to cancel a salt that has been used to register with an AVS. + * * @param salt A unique and single use value associated with the approver signature. */ function cancelSalt(bytes32 salt) external { - require(!operatorSaltIsSpent[msg.sender][salt], "AVSDirectory.cancelSalt: cannot cancel spent salt"); operatorSaltIsSpent[msg.sender][salt] = true; } @@ -150,11 +343,27 @@ contract AVSDirectory is */ /** - * @notice Calculates the digest hash to be signed by an operator to register with an AVS - * @param operator The account registering as an operator - * @param avs The address of the service manager contract for the AVS that the operator is registering to - * @param salt A unique and single use value associated with the approver signature. - * @param expiry Time after which the approver's signature becomes invalid + * @notice Calculates the digest hash to be signed by an operator to register with an AVS. + * + * @param standbyParams The newly updated standby mode parameters. + * @param salt A unique and single-use value associated with the approver's signature. + * @param expiry The time after which the approver's signature becomes invalid. + */ + function calculateUpdateStandbyDigestHash( + StandbyParam[] calldata standbyParams, + bytes32 salt, + uint256 expiry + ) public view returns (bytes32) { + return _calculateDigestHash(keccak256(abi.encode(OPERATOR_STANDBY_UPDATE, standbyParams, salt, expiry))); + } + + /** + * @notice Calculates the digest hash to be signed by an operator to register with an AVS. + * + * @param operator The account registering as an operator. + * @param avs The AVS the operator is registering with. + * @param salt A unique and single-use value associated with the approver's signature. + * @param expiry The time after which the approver's signature becomes invalid. */ function calculateOperatorAVSRegistrationDigestHash( address operator, @@ -162,27 +371,45 @@ contract AVSDirectory is bytes32 salt, uint256 expiry ) public view returns (bytes32) { - // calculate the struct hash - bytes32 structHash = keccak256(abi.encode(OPERATOR_AVS_REGISTRATION_TYPEHASH, operator, avs, salt, expiry)); - // calculate the digest hash - bytes32 digestHash = keccak256(abi.encodePacked("\x19\x01", domainSeparator(), structHash)); - return digestHash; + return + _calculateDigestHash(keccak256(abi.encode(OPERATOR_AVS_REGISTRATION_TYPEHASH, operator, avs, salt, expiry))); } /** - * @notice Getter function for the current EIP-712 domain separator for this contract. - * @dev The domain separator will change in the event of a fork that changes the ChainID. + * @notice Calculates the digest hash to be signed by an operator to register with an operator set. + * + * @param avs The AVS that operator is registering to operator sets for. + * @param operatorSetIds An array of operator set IDs the operator is registering to. + * @param salt A unique and single use value associated with the approver signature. + * @param expiry Time after which the approver's signature becomes invalid. */ + function calculateOperatorSetRegistrationDigestHash( + address avs, + uint32[] calldata operatorSetIds, + bytes32 salt, + uint256 expiry + ) public view returns (bytes32) { + return _calculateDigestHash( + keccak256(abi.encode(OPERATOR_SET_REGISTRATION_TYPEHASH, avs, operatorSetIds, salt, expiry)) + ); + } + + /// @notice Getter function for the current EIP-712 domain separator for this contract. + /// @dev The domain separator will change in the event of a fork that changes the ChainID. function domainSeparator() public view returns (bytes32) { + return _calculateDomainSeparator(); + } + + /// @notice Internal function for calculating the current domain separator of this contract + function _calculateDomainSeparator() internal view returns (bytes32) { if (block.chainid == ORIGINAL_CHAIN_ID) { return _DOMAIN_SEPARATOR; } else { - return _calculateDomainSeparator(); + return keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes("EigenLayer")), block.chainid, address(this))); } } - // @notice Internal function for calculating the current domain separator of this contract - function _calculateDomainSeparator() internal view returns (bytes32) { - return keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes("EigenLayer")), block.chainid, address(this))); + function _calculateDigestHash(bytes32 structHash) internal view returns (bytes32) { + return keccak256(abi.encodePacked("\x19\x01", _calculateDomainSeparator(), structHash)); } } diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index 47a326f16..63d524e01 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -13,9 +13,20 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { bytes32 public constant OPERATOR_AVS_REGISTRATION_TYPEHASH = keccak256("OperatorAVSRegistration(address operator,address avs,bytes32 salt,uint256 expiry)"); + /// @notice The EIP-712 typehash for the `OperatorSetRegistration` struct used by the contract + bytes32 public constant OPERATOR_SET_REGISTRATION_TYPEHASH = + keccak256("OperatorSetRegistration(address avs,uint32[] operatorSetIds,bytes32 salt,uint256 expiry)"); + + /// @notice The EIP-712 typehash for the `StandbyParams` struct used by the contract + bytes32 public constant OPERATOR_STANDBY_UPDATE = + keccak256("OperatorStandbyUpdate(StandbyParam[] standbyParams,bytes32 salt,uint256 expiry)"); + /// @notice The DelegationManager contract for EigenLayer IDelegationManager public immutable delegation; + /// @notice The StrategyManager contract for EigenLayer + IStrategyManager public immutable strategyManager; + /** * @notice Original EIP-712 Domain separator for this contract. * @dev The domain separator may change in the event of a fork that modifies the ChainID. @@ -27,11 +38,24 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { mapping(address => mapping(address => OperatorAVSRegistrationStatus)) public avsOperatorStatus; /// @notice Mapping: operator => 32-byte salt => whether or not the salt has already been used by the operator. - /// @dev Salt is used in the `registerOperatorToAVS` function. + /// @dev Salt is used in the `registerOperatorToAVS` and `registerOperatorToOperatorSet` function. mapping(address => mapping(bytes32 => bool)) public operatorSaltIsSpent; - constructor(IDelegationManager _delegation) { + /// @notice Mapping: AVS => whether or not the AVS uses operator set + mapping(address => bool) public isOperatorSetAVS; + + /// @notice Mapping: avs => operator => operatorSetID => whether the operator is registered for the operator set + mapping(address => mapping(address => mapping(uint32 => bool))) public isOperatorInOperatorSet; + + /// @notice Mapping: avs => operator => number of operator sets the operator is registered for the AVS + mapping(address => mapping(address => uint256)) public operatorAVSOperatorSetCount; + + /// @notice Mapping: avs = operator => operatorSetId => Whether the given operator set in standby mode or not + mapping(address => mapping(address => mapping(uint32 => bool))) public onStandby; + + constructor(IDelegationManager _delegation, IStrategyManager _strategyManager) { delegation = _delegation; + strategyManager = _strategyManager; } /** @@ -39,5 +63,5 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[47] private __gap; + uint256[43] private __gap; } diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index b35cabc99..b24041853 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -2,30 +2,71 @@ pragma solidity >=0.5.0; import "./ISignatureUtils.sol"; +import "./IStrategy.sol"; interface IAVSDirectory is ISignatureUtils { - /// @notice Enum representing the status of an operator's registration with an AVS + /// @notice Enum representing the registration status of an operator with an AVS. enum OperatorAVSRegistrationStatus { - UNREGISTERED, // Operator not registered to AVS - REGISTERED // Operator registered to AVS + UNREGISTERED, // Operator is not registered with the AVS. + REGISTERED // Operator is registered with the AVS. } + struct OperatorSet { + address avs; + uint32 id; + } + + struct StandbyParam { + OperatorSet operatorSet; + bool onStandby; + } + /** - * @notice Emitted when @param avs indicates that they are updating their MetadataURI string - * @dev Note that these strings are *never stored in storage* and are instead purely emitted in events for off-chain indexing + * @notice Emitted when an operator's registration status with an AVS is updated. + * Specifically, when an operator enters its first operator set for an AVS, or + * when it is removed from the last operator set. */ - event AVSMetadataURIUpdated(address indexed avs, string metadataURI); - - /// @notice Emitted when an operator's registration status for an AVS is updated event OperatorAVSRegistrationStatusUpdated( address indexed operator, address indexed avs, OperatorAVSRegistrationStatus status ); + /// @notice Emitted when an operator is added to an operator set. + event OperatorAddedToOperatorSet(address operator, OperatorSet operatorSet); + + /// @notice Emitted when an operator is removed from an operator set. + event OperatorRemovedFromOperatorSet(address operator, OperatorSet operatorSet); + + /// @notice Emitted when an AVS updates their metadata URI (Uniform Resource Identifier). + /// @dev The URI is never stored; it is simply emitted through an event for off-chain indexing. + event AVSMetadataURIUpdated(address indexed avs, string metadataURI); + + /// @notice Emitted when an operator updates their standby parameters. + event StandbyParamUpdated(address operator, OperatorSet operatorSet, bool onStandby); + /** - * @notice Called by an avs to register an operator with the avs. - * @param operator The address of the operator to register. - * @param operatorSignature The signature, salt, and expiry of the operator's signature. + * @notice Updates the standby parameters for an operator across multiple operator sets. + * Allows the AVS to add the operator to a given operator set if they are not already registered. + * + * @param operator The address of the operator for which the standby parameters are being updated. + * @param standbyParams The new standby parameters for the operator. + * @param signature If non-empty, the signature of the operator authorizing the modification. + * If empty, the `msg.sender` must be the operator. + */ + function updateStandbyParams( + address operator, + StandbyParam[] calldata standbyParams, + SignatureWithSaltAndExpiry calldata signature + ) external; + + /** + * @notice Called by the AVS's service manager contract to register an operator with the AVS. + * + * @param operator The address of the operator to register. + * @param operatorSignature The signature, salt, and expiry of the operator's signature. + * + * @dev msg.sender must be the AVS. + * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. */ function registerOperatorToAVS( address operator, @@ -33,30 +74,71 @@ interface IAVSDirectory is ISignatureUtils { ) external; /** - * @notice Called by an avs to deregister an operator with the avs. - * @param operator The address of the operator to deregister. + * @notice Called by an AVS to deregister an operator from the AVS. + * + * @param operator The address of the operator to deregister. + * + * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. */ function deregisterOperatorFromAVS(address operator) external; /** - * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. - * @param metadataURI The URI for metadata associated with an AVS - * @dev Note that the `metadataURI` is *never stored * and is only emitted in the `AVSMetadataURIUpdated` event + * @notice Called by AVSs to add an operator to an operator set. + * + * @param operator The address of the operator to be added to the operator set. + * @param operatorSetIds The IDs of the operator sets. + * @param signature The signature of the operator on their intent to register. + * + * @dev msg.sender is used as the AVS. + * @dev The operator must not have a pending deregistration from the operator set. + * @dev If this is the first operator set in the AVS that the operator is + * registering for, a OperatorAVSRegistrationStatusUpdated event is emitted with + * a REGISTERED status. + */ + function registerOperatorToOperatorSets( + address operator, + uint32[] calldata operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry memory signature + ) external; + + /** + * @notice Called by AVSs or operators to remove an operator from an operator set. + * + * @param operator The address of the operator to be removed from the operator set. + * @param operatorSetIds The IDs of the operator sets. + * + * @dev msg.sender is used as the AVS. + * @dev The operator must be registered for the msg.sender AVS and the given operator set. + * @dev If this removes the operator from all operator sets for the msg.sender AVS, + * then an OperatorAVSRegistrationStatusUpdated event is emitted with a DEREGISTERED status. + */ + function deregisterOperatorFromOperatorSets(address operator, uint32[] calldata operatorSetIds) external; + + // VIEW + + /** + * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. + * + * @param metadataURI The URI for metadata associated with an AVS. + * + * @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event. */ function updateAVSMetadataURI(string calldata metadataURI) external; /** - * @notice Returns whether or not the salt has already been used by the operator. - * @dev Salts is used in the `registerOperatorToAVS` function. + * @notice Returns whether the salt has already been used by the operator or not. + * + * @dev The salt is used in the `registerOperatorToAVS` function. */ function operatorSaltIsSpent(address operator, bytes32 salt) external view returns (bool); /** - * @notice Calculates the digest hash to be signed by an operator to register with an AVS - * @param operator The account registering as an operator - * @param avs The AVS the operator is registering to - * @param salt A unique and single use value associated with the approver signature. - * @param expiry Time after which the approver's signature becomes invalid + * @notice Calculates the digest hash to be signed by an operator to register with an AVS. + * + * @param operator The account registering as an operator. + * @param avs The AVS the operator is registering with. + * @param salt A unique and single-use value associated with the approver's signature. + * @param expiry The time after which the approver's signature becomes invalid. */ function calculateOperatorAVSRegistrationDigestHash( address operator, @@ -65,6 +147,24 @@ interface IAVSDirectory is ISignatureUtils { uint256 expiry ) external view returns (bytes32); - /// @notice The EIP-712 typehash for the Registration struct used by the contract + /** + * @notice Calculates the digest hash to be signed by an operator to register with an operator set. + * + * @param avs The AVS that operator is registering to operator sets for. + * @param operatorSetIds An array of operator set IDs the operator is registering to. + * @param salt A unique and single use value associated with the approver signature. + * @param expiry Time after which the approver's signature becomes invalid. + */ + function calculateOperatorSetRegistrationDigestHash( + address avs, + uint32[] memory operatorSetIds, + bytes32 salt, + uint256 expiry + ) external view returns (bytes32); + + /// @notice The EIP-712 typehash for the Registration struct used by the contract. function OPERATOR_AVS_REGISTRATION_TYPEHASH() external view returns (bytes32); + + /// @notice The EIP-712 typehash for the OperatorSetRegistration struct used by the contract. + function OPERATOR_SET_REGISTRATION_TYPEHASH() external view returns (bytes32); } diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 227447256..39e14ffea 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -437,7 +437,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { delegationManager ); delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); - avsDirectoryImplementation = new AVSDirectory(delegationManager); + avsDirectoryImplementation = new AVSDirectory(delegationManager, strategyManager); // Second, upgrade the proxy contracts to point to the implementations // DelegationManager @@ -547,7 +547,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { delegationManager ); delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); - avsDirectoryImplementation = new AVSDirectory(delegationManager); + avsDirectoryImplementation = new AVSDirectory(delegationManager, strategyManager); // Second, upgrade the proxy contracts to point to the implementations // DelegationManager diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 92fd7f875..de2ddefc6 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -16,6 +16,8 @@ import "src/test/utils/EigenLayerUnitTestSetup.sol"; * Contracts not mocked: DelegationManager */ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { + uint256 internal constant MAX_PRIVATE_KEY = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140; + // Contract under test AVSDirectory avsDirectory; AVSDirectory avsDirectoryImplementation; @@ -68,7 +70,7 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { ); // Deploy AVSDirectory implmentation and proxy - avsDirectoryImplementation = new AVSDirectory(delegationManager); + avsDirectoryImplementation = new AVSDirectory(delegationManager, IStrategyManager(address(strategyManagerMock))); avsDirectory = AVSDirectory( address( new TransparentUpgradeableProxy( @@ -93,11 +95,11 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { */ /** - * @notice internal function for calculating a signature from the operator corresponding to `_operatorPrivateKey`, delegating them to + * @notice internal function for calculating a signature from the operator corresponding to `operatorPk`, delegating them to * the `operator`, and expiring at `expiry`. */ - function _getOperatorSignature( - uint256 _operatorPrivateKey, + function _getOperatorAVSRegistrationSignature( + uint256 operatorPk, address operator, address avs, bytes32 salt, @@ -107,7 +109,7 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { operatorSignature.salt = salt; { bytes32 digestHash = avsDirectory.calculateOperatorAVSRegistrationDigestHash(operator, avs, salt, expiry); - (uint8 v, bytes32 r, bytes32 s) = cheats.sign(_operatorPrivateKey, digestHash); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign(operatorPk, digestHash); operatorSignature.signature = abi.encodePacked(r, s, v); } return operatorSignature; @@ -170,6 +172,469 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { } } +contract AVSDirectoryUnitTests_initialize is AVSDirectoryUnitTests { + function testFuzz_Correctness( + address delegationManager, + address strategyManager, + address owner, + address pauserRegistry, + uint256 initialPausedStatus + ) public virtual { + AVSDirectory dir = new AVSDirectory(IDelegationManager(delegationManager), IStrategyManager(strategyManager)); + + assertEq(address(dir.delegation()), delegationManager); + assertEq(address(dir.strategyManager()), strategyManager); + + cheats.expectRevert("Initializable: contract is already initialized"); + dir.initialize(owner, IPauserRegistry(pauserRegistry), initialPausedStatus); + } +} + +contract AVSDirectoryUnitTests_domainSeparator is AVSDirectoryUnitTests { + function test_domainSeparator() public virtual { + // This is just to get coverage up. + avsDirectory.domainSeparator(); + cheats.chainId(0xC0FFEE); + avsDirectory.domainSeparator(); + } +} + +contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUnitTests { + event OperatorAddedToOperatorSet(address operator, IAVSDirectory.OperatorSet operatorSet); + + function testFuzz_revert_SignatureIsExpired( + address operator, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + expiry = bound(expiry, 0, type(uint256).max - 1); + cheats.warp(type(uint256).max); + + _registerOperatorWithBaseDetails(operator); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: operator signature expired"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), salt, expiry) + ); + } + + function testFuzz_revert_OperatorRegistered( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + (v, r, s) = cheats.sign( + operatorPk, + avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, keccak256(""), expiry) + ); + + cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: operator already registered to operator set"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), keccak256(""), expiry) + ); + } + + function testFuzz_revert_OperatorNotRegistered( + address operator, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + cheats.assume(operator != address(0)); + expiry = bound(expiry, 1, type(uint256).max); + cheats.warp(0); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: operator not registered to EigenLayer yet"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), salt, expiry) + ); + } + + function testFuzz_revert_SaltSpent( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + operatorSetId = uint32(bound(operatorSetId, 1, type(uint32).max)); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: salt already spent"); + avsDirectory.registerOperatorToOperatorSets( + operator, new uint32[](0), ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), salt, expiry) + ); + } + + function testFuzz_revert_WrongAVS( + address badAvs, + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + cheats.assume(badAvs != address(this)); + + operatorSetId = uint32(bound(operatorSetId, 1, type(uint32).max)); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + cheats.prank(badAvs); + cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: signature not from signer"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + } + + function testFuzz_MultipleCorrectness( + uint256 operatorPk, + uint256 operatorSetIdsLength, + bytes32 salt, + uint256 expiry + ) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + operatorSetIdsLength = bound(operatorSetIdsLength, 1, 16); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + uint32[] memory oids = new uint32[](operatorSetIdsLength); + for (uint256 i; i < oids.length; ++i) { + oids[i] = uint32(uint256(keccak256(abi.encodePacked(i))) % type(uint32).max); + } + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorAVSRegistrationStatusUpdated( + operator, address(this), IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED + ); + + for (uint256 i; i < oids.length; ++i) { + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), oids[i])); + } + + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + for (uint256 i; i < oids.length; ++i) { + assertTrue(avsDirectory.isOperatorInOperatorSet(address(this), operator, oids[i])); + } + + assertEq(avsDirectory.operatorAVSOperatorSetCount(address(this), operator), oids.length); + assertEq(uint8(avsDirectory.avsOperatorStatus(address(this), operator)), 1); + assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); + assertTrue(avsDirectory.isOperatorSetAVS(address(this))); + } + + function testFuzz_Correctness( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorAVSRegistrationStatusUpdated( + operator, address(this), IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED + ); + + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + assertEq(avsDirectory.operatorAVSOperatorSetCount(address(this), operator), 1); + assertEq(uint8(avsDirectory.avsOperatorStatus(address(this), operator)), 1); + assertTrue(avsDirectory.isOperatorInOperatorSet(address(this), operator, operatorSetId)); + assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); + assertTrue(avsDirectory.isOperatorSetAVS(address(this))); + } + + function testFuzz_revert_NoSignatureNoStandby( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + // Make sure sigature is always non-expired. + cheats.warp(0); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + IAVSDirectory.StandbyParam[] memory params = new IAVSDirectory.StandbyParam[](1); + params[0] = IAVSDirectory.StandbyParam(IAVSDirectory.OperatorSet(address(this), operatorSetId), true); + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = + cheats.sign(operatorPk, avsDirectory.calculateUpdateStandbyDigestHash(params, keccak256(""), expiry)); + + _registerOperatorWithBaseDetails(operator); + + cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: avs not on standby"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), salt, expiry) + ); + + avsDirectory.updateStandbyParams( + operator, + params, + ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), keccak256(""), expiry) + ); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), 0, 0) + ); + } +} + +contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirectoryUnitTests { + event OperatorRemovedFromOperatorSet(address operator, IAVSDirectory.OperatorSet operatorSet); + + function _registerOperatorToOperatorSets( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) internal virtual { + expiry = bound(expiry, 1, type(uint256).max); + cheats.warp(0); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + } + + function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + address operator = cheats.addr(operatorPk); + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + cheats.expectRevert("AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set"); + avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); + } + + function testFuzz_Correctness( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + _registerOperatorToOperatorSets(operatorPk, operatorSetId, salt, expiry); + + address operator = cheats.addr(operatorPk); + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); + + cheats.expectEmit(true, true, true, false, address(avsDirectory)); + emit OperatorAVSRegistrationStatusUpdated( + operator, address(this), IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED + ); + + avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); + + assertEq(avsDirectory.isOperatorInOperatorSet(address(this), operator, operatorSetId), false); + assertEq(avsDirectory.operatorAVSOperatorSetCount(address(this), operator), 0); + assertEq( + uint8(avsDirectory.avsOperatorStatus(address(this), operator)), + uint8(IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED) + ); + } +} + +contract AVSDirectoryUnitTests_updateStandbyParams is AVSDirectoryUnitTests { + event StandbyParamUpdated(address operator, IAVSDirectory.OperatorSet operatorSet, bool onStandby); + + function testFuzz_revert_CallerNotOperatorNoSignature( + address operator, + address avs, + uint32 operatorSetId, + bool standby + ) public virtual { + IAVSDirectory.StandbyParam[] memory params = new IAVSDirectory.StandbyParam[](1); + params[0] = IAVSDirectory.StandbyParam(IAVSDirectory.OperatorSet(avs, operatorSetId), standby); + + cheats.expectRevert("AVSDirectory.updateStandbyParams: invalid signature"); + avsDirectory.updateStandbyParams( + operator, params, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), bytes32(0), 0) + ); + } + + function testFuzz_revert_OperatorSignatureExpired( + address operator, + address avs, + uint32 operatorSetId, + bool standby, + uint256 expiry + ) public virtual { + // Make sure signature is always expired. + cheats.warp(type(uint256).max); + expiry = bound(expiry, 0, type(uint256).max - 1); + + IAVSDirectory.StandbyParam[] memory params = new IAVSDirectory.StandbyParam[](1); + params[0] = IAVSDirectory.StandbyParam(IAVSDirectory.OperatorSet(avs, operatorSetId), standby); + + // Assert operator signature reverts when non-zero. + cheats.expectRevert("AVSDirectory.updateStandbyParams: operator signature expired"); + avsDirectory.updateStandbyParams( + operator, params, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(1), bytes32(0), expiry) + ); + } + + function testFuzz_revert_SaltSpent( + uint256 operatorPk, + address avs, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry, + bool standby + ) public virtual { + // Make sure sigature is always non-expired. + cheats.warp(0); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + IAVSDirectory.StandbyParam[] memory params = new IAVSDirectory.StandbyParam[](1); + params[0] = IAVSDirectory.StandbyParam(IAVSDirectory.OperatorSet(avs, operatorSetId), standby); + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = + cheats.sign(operatorPk, avsDirectory.calculateUpdateStandbyDigestHash(params, salt, expiry)); + + avsDirectory.updateStandbyParams( + operator, params, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + cheats.expectRevert("AVSDirectory.updateStandbyParams: salt spent"); + avsDirectory.updateStandbyParams( + operator, params, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + } + + function testFuzz_Correctness( + uint256 operatorPk, + address avs, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry, + bool standby + ) public virtual { + // Make sure sigature is always non-expired. + cheats.warp(0); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + IAVSDirectory.StandbyParam[] memory params = new IAVSDirectory.StandbyParam[](1); + params[0] = IAVSDirectory.StandbyParam(IAVSDirectory.OperatorSet(avs, operatorSetId), standby); + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = + cheats.sign(operatorPk, avsDirectory.calculateUpdateStandbyDigestHash(params, salt, expiry)); + + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit StandbyParamUpdated(operator, IAVSDirectory.OperatorSet(avs, operatorSetId), standby); + avsDirectory.updateStandbyParams( + operator, params, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + assertEq(avsDirectory.onStandby(avs, operator, operatorSetId), standby); + } +} + contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUnitTests { function test_revert_whenRegisterDeregisterToAVSPaused() public { // set the pausing flag @@ -177,7 +642,9 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni avsDirectory.pause(2 ** PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS); cheats.expectRevert("Pausable: index is paused"); - avsDirectory.registerOperatorToAVS(address(0), ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(""), 0, 0)); + avsDirectory.registerOperatorToAVS( + address(0), ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(""), 0, 0) + ); cheats.expectRevert("Pausable: index is paused"); avsDirectory.deregisterOperatorFromAVS(address(0)); @@ -207,7 +674,7 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni cheats.prank(defaultAVS); ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); avsDirectory.registerOperatorToAVS(operator, operatorSignature); } @@ -220,7 +687,7 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni cheats.prank(defaultAVS); uint256 expiry = type(uint256).max; ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); cheats.expectRevert("AVSDirectory.registerOperatorToAVS: operator not registered to EigenLayer yet"); avsDirectory.registerOperatorToAVS(operator, operatorSignature); @@ -234,7 +701,7 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni uint256 expiry = type(uint256).max; ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: signature not from signer"); cheats.prank(operator); @@ -242,9 +709,9 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni } // @notice Verifies an operator registers fails when the signature expiry already expires - function testFuzz_revert_whenExpiryHasExpired( - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature - ) public { + function testFuzz_revert_whenExpiryHasExpired(ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature) + public + { address operator = cheats.addr(delegationSignerPrivateKey); operatorSignature.expiry = bound(operatorSignature.expiry, 0, block.timestamp - 1); @@ -260,7 +727,7 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni uint256 expiry = type(uint256).max; ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); cheats.startPrank(defaultAVS); avsDirectory.registerOperatorToAVS(operator, operatorSignature); @@ -283,10 +750,14 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni avsDirectory.cancelSalt(salt); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt), "salt was not successfully cancelled"); - assertFalse(avsDirectory.operatorSaltIsSpent(defaultAVS, salt), "salt should only be cancelled for the operator"); + assertFalse( + avsDirectory.operatorSaltIsSpent(defaultAVS, salt), "salt should only be cancelled for the operator" + ); - bytes32 newSalt; - unchecked { newSalt = bytes32(uint(salt) + 1); } + bytes32 newSalt; + unchecked { + newSalt = bytes32(uint256(salt) + 1); + } assertFalse(salt == newSalt, "bad test setup"); @@ -305,7 +776,7 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni uint256 expiry = type(uint256).max; ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); cheats.prank(operator); avsDirectory.cancelSalt(salt); @@ -315,24 +786,6 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni avsDirectory.registerOperatorToAVS(operator, operatorSignature); } - /// @notice Verifies that an operator cannot cancel the same salt twice - function testFuzz_revert_whenSaltCancelledTwice(bytes32 salt) public { - address operator = cheats.addr(delegationSignerPrivateKey); - assertFalse(delegationManager.isOperator(operator), "bad test setup"); - _registerOperatorWithBaseDetails(operator); - - uint256 expiry = type(uint256).max; - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); - - cheats.startPrank(operator); - avsDirectory.cancelSalt(salt); - - cheats.expectRevert("AVSDirectory.cancelSalt: cannot cancel spent salt"); - avsDirectory.cancelSalt(salt); - cheats.stopPrank(); - } - /// @notice Verifies that an operator cannot cancel the same salt twice function testFuzz_revert_whenCancellingSaltUsedToRegister(bytes32 salt) public { address operator = cheats.addr(delegationSignerPrivateKey); @@ -341,13 +794,9 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni uint256 expiry = type(uint256).max; ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = - _getOperatorSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); cheats.prank(defaultAVS); avsDirectory.registerOperatorToAVS(operator, operatorSignature); - - cheats.prank(operator); - cheats.expectRevert("AVSDirectory.cancelSalt: cannot cancel spent salt"); - avsDirectory.cancelSalt(salt); } } From 80857d4190c907643f709ee6812fc0447c0a1b28 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Tue, 9 Jul 2024 11:05:47 -0400 Subject: [PATCH 02/43] fix: remove unused immutable --- script/deploy/devnet/M2_Deploy_From_Scratch.s.sol | 2 +- script/deploy/holesky/M2_Deploy_From_Scratch.s.sol | 2 +- script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol | 2 +- src/contracts/core/AVSDirectory.sol | 5 ++--- src/contracts/core/AVSDirectoryStorage.sol | 6 +----- src/test/integration/IntegrationDeployer.t.sol | 4 ++-- src/test/unit/AVSDirectoryUnit.t.sol | 6 +++--- 7 files changed, 11 insertions(+), 16 deletions(-) diff --git a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol index 53917ee63..36a1bd7b8 100644 --- a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol @@ -232,7 +232,7 @@ contract Deployer_M2 is Script, Test { // Second, deploy the *implementation* contracts, using the *proxy contracts* as inputs delegationImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); strategyManagerImplementation = new StrategyManager(delegation, eigenPodManager, slasher); - avsDirectoryImplementation = new AVSDirectory(delegation, strategyManager); + avsDirectoryImplementation = new AVSDirectory(delegation); slasherImplementation = new Slasher(strategyManager, delegation); eigenPodManagerImplementation = new EigenPodManager( ethPOSDeposit, diff --git a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol index b37bce965..626626b49 100644 --- a/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/holesky/M2_Deploy_From_Scratch.s.sol @@ -81,7 +81,7 @@ contract M2_Deploy_Holesky_From_Scratch is ExistingDeploymentParser { ); eigenPodBeacon = new UpgradeableBeacon(address(eigenPodImplementation)); - avsDirectoryImplementation = new AVSDirectory(delegationManager, strategyManager); + avsDirectoryImplementation = new AVSDirectory(delegationManager); delegationManagerImplementation = new DelegationManager(strategyManager, slasher, eigenPodManager); strategyManagerImplementation = new StrategyManager(delegationManager, eigenPodManager, slasher); slasherImplementation = new Slasher(strategyManager, delegationManager); diff --git a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol index ba6a43bf9..daa042db5 100644 --- a/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol +++ b/script/deploy/mainnet/M2_Mainnet_Upgrade.s.sol @@ -45,7 +45,7 @@ contract M2_Mainnet_Upgrade is ExistingDeploymentParser { */ function _deployImplementationContracts() internal { // 1. Deploy New TUPS - avsDirectoryImplementation = new AVSDirectory(delegationManager, strategyManager); + avsDirectoryImplementation = new AVSDirectory(delegationManager); avsDirectory = AVSDirectory( address( new TransparentUpgradeableProxy( diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 4e6be1146..ad4f05e79 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -35,9 +35,8 @@ contract AVSDirectory is * and eigenpodManager contracts */ constructor( - IDelegationManager _delegation, - IStrategyManager _strategyManager - ) AVSDirectoryStorage(_delegation, _strategyManager) { + IDelegationManager _delegation + ) AVSDirectoryStorage(_delegation) { _disableInitializers(); ORIGINAL_CHAIN_ID = block.chainid; } diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index 63d524e01..6fd2ad09f 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -24,9 +24,6 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { /// @notice The DelegationManager contract for EigenLayer IDelegationManager public immutable delegation; - /// @notice The StrategyManager contract for EigenLayer - IStrategyManager public immutable strategyManager; - /** * @notice Original EIP-712 Domain separator for this contract. * @dev The domain separator may change in the event of a fork that modifies the ChainID. @@ -53,9 +50,8 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { /// @notice Mapping: avs = operator => operatorSetId => Whether the given operator set in standby mode or not mapping(address => mapping(address => mapping(uint32 => bool))) public onStandby; - constructor(IDelegationManager _delegation, IStrategyManager _strategyManager) { + constructor(IDelegationManager _delegation) { delegation = _delegation; - strategyManager = _strategyManager; } /** diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index 39e14ffea..227447256 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -437,7 +437,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { delegationManager ); delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); - avsDirectoryImplementation = new AVSDirectory(delegationManager, strategyManager); + avsDirectoryImplementation = new AVSDirectory(delegationManager); // Second, upgrade the proxy contracts to point to the implementations // DelegationManager @@ -547,7 +547,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { delegationManager ); delayedWithdrawalRouterImplementation = new DelayedWithdrawalRouter(eigenPodManager); - avsDirectoryImplementation = new AVSDirectory(delegationManager, strategyManager); + avsDirectoryImplementation = new AVSDirectory(delegationManager); // Second, upgrade the proxy contracts to point to the implementations // DelegationManager diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index de2ddefc6..821e9b6ce 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -70,7 +70,7 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { ); // Deploy AVSDirectory implmentation and proxy - avsDirectoryImplementation = new AVSDirectory(delegationManager, IStrategyManager(address(strategyManagerMock))); + avsDirectoryImplementation = new AVSDirectory(delegationManager); avsDirectory = AVSDirectory( address( new TransparentUpgradeableProxy( @@ -180,10 +180,10 @@ contract AVSDirectoryUnitTests_initialize is AVSDirectoryUnitTests { address pauserRegistry, uint256 initialPausedStatus ) public virtual { - AVSDirectory dir = new AVSDirectory(IDelegationManager(delegationManager), IStrategyManager(strategyManager)); + AVSDirectory dir = new AVSDirectory(IDelegationManager(delegationManager)); assertEq(address(dir.delegation()), delegationManager); - assertEq(address(dir.strategyManager()), strategyManager); + // assertEq(address(dir.strategyManager()), strategyManager); cheats.expectRevert("Initializable: contract is already initialized"); dir.initialize(owner, IPauserRegistry(pauserRegistry), initialPausedStatus); From f8032955b9c7e236fb08d9171d111ad767f6643c Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Tue, 9 Jul 2024 11:15:38 -0400 Subject: [PATCH 03/43] chore: run `forge fmt src/contracts` chore: run --- src/contracts/core/AVSDirectory.sol | 4 +--- src/contracts/core/AVSDirectoryStorage.sol | 2 +- src/contracts/core/DelegationManager.sol | 1 + src/contracts/pods/EigenPodManager.sol | 1 + 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index ad4f05e79..48200bd6d 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -34,9 +34,7 @@ contract AVSDirectory is * @dev Initializes the immutable addresses of the strategy mananger, delegationManager, slasher, * and eigenpodManager contracts */ - constructor( - IDelegationManager _delegation - ) AVSDirectoryStorage(_delegation) { + constructor(IDelegationManager _delegation) AVSDirectoryStorage(_delegation) { _disableInitializers(); ORIGINAL_CHAIN_ID = block.chainid; } diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index 6fd2ad09f..e4d5d33c3 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -20,7 +20,7 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { /// @notice The EIP-712 typehash for the `StandbyParams` struct used by the contract bytes32 public constant OPERATOR_STANDBY_UPDATE = keccak256("OperatorStandbyUpdate(StandbyParam[] standbyParams,bytes32 salt,uint256 expiry)"); - + /// @notice The DelegationManager contract for EigenLayer IDelegationManager public immutable delegation; diff --git a/src/contracts/core/DelegationManager.sol b/src/contracts/core/DelegationManager.sol index d4d12091a..20b940ea3 100644 --- a/src/contracts/core/DelegationManager.sol +++ b/src/contracts/core/DelegationManager.sol @@ -583,6 +583,7 @@ contract DelegationManager is ++i; } } + // Award shares back in StrategyManager/EigenPodManager. If withdrawer is delegated, increase the shares delegated to the operator } else { // Award shares back in StrategyManager/EigenPodManager. // If withdrawer is delegated, increase the shares delegated to the operator. diff --git a/src/contracts/pods/EigenPodManager.sol b/src/contracts/pods/EigenPodManager.sol index 8ea4a2a2a..4a8a776d3 100644 --- a/src/contracts/pods/EigenPodManager.sol +++ b/src/contracts/pods/EigenPodManager.sol @@ -289,6 +289,7 @@ contract EigenPodManager is if (sharesAfter <= 0) { // if the shares started negative and stayed negative, then there cannot have been an increase in delegateable shares return 0; + // if the shares started negative and became positive, then the increase in delegateable shares is the ending share amount } else { // if the shares started negative and became positive, then the increase in delegateable shares is the ending share amount return sharesAfter; From 5ed166f1ae4fc62a93eacf6ef5f3f72797e166c9 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:37:20 -0400 Subject: [PATCH 04/43] nit: improve comments --- src/contracts/core/AVSDirectory.sol | 42 ++++++++++++++++++----------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 48200bd6d..48d4c8cd6 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -18,10 +18,10 @@ contract AVSDirectory is /// @dev Index for flag that pauses operator register/deregister to avs when set. uint8 internal constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0; - /// @dev Chain ID at the time of contract deployment + /// @dev Returns the chain ID from the time the contract was deployed. uint256 internal immutable ORIGINAL_CHAIN_ID; - /// @notice Canonical, virtual beacon chain ETH strategy + /// @notice Returns the canonical beacon chain ETH strategy. IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); /** @@ -73,30 +73,40 @@ contract AVSDirectory is StandbyParam[] calldata standbyParams, SignatureWithSaltAndExpiry calldata operatorSignature ) external { + // Check if the operator's signature is provided or not. if (operatorSignature.signature.length == 0) { - // Assert caller is `operator` if signature length is zero. + // If the signature length is zero, assert that the caller is the operator. require(msg.sender == operator, "AVSDirectory.updateStandbyParams: invalid signature"); } else { - // Assert operator's signature has not expired. + // If a signature is provided, perform the following checks: + + // Assert that the operator's signature has not expired. require( operatorSignature.expiry >= block.timestamp, "AVSDirectory.updateStandbyParams: operator signature expired" ); - // Assert operator's signature cannot be replayed. + + // Assert that the operator's signature cannot be replayed. require( !operatorSaltIsSpent[operator][operatorSignature.salt], "AVSDirectory.updateStandbyParams: salt spent" ); - // Assert operator's signature is valid. - EIP1271SignatureUtils.checkSignature_EIP1271( - operator, - calculateUpdateStandbyDigestHash(standbyParams, operatorSignature.salt, operatorSignature.expiry), - operatorSignature.signature - ); - // Spend salt. + + // Assert that the operator's signature is valid. + EIP1271SignatureUtils.checkSignature_EIP1271({ + signer: operator, + digestHash: calculateUpdateStandbyDigestHash( + standbyParams, operatorSignature.salt, operatorSignature.expiry + ), + signature: operatorSignature.signature + }); + + // Mark the salt as spent to prevent replay attacks. operatorSaltIsSpent[operator][operatorSignature.salt] = true; } + // Loop through each standby parameter and update the state accordingly. for (uint256 i; i < standbyParams.length; ++i) { + // Update the standby status for the given operator set. onStandby[standbyParams[i].operatorSet.avs][operator][standbyParams[i].operatorSet.id] = standbyParams[i].onStandby; @@ -278,9 +288,11 @@ contract AVSDirectory is // forgefmt: disable-next-item // Check that the signature is valid - EIP1271SignatureUtils.checkSignature_EIP1271( - operator, operatorRegistrationDigestHash, operatorSignature.signature - ); + EIP1271SignatureUtils.checkSignature_EIP1271({ + signer: operator, + digestHash: operatorRegistrationDigestHash, + signature: operatorSignature.signature + }); // Set the operator as registered avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.REGISTERED; From d44f280a71e0fa7f56be14490b1ba339485d0f0d Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:46:06 -0400 Subject: [PATCH 05/43] refactor: remove isOperatorSetAVS mapping --- src/contracts/core/AVSDirectory.sol | 5 +---- src/contracts/core/AVSDirectoryStorage.sol | 3 --- src/test/unit/AVSDirectoryUnit.t.sol | 2 -- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 48d4c8cd6..c91895551 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -171,9 +171,6 @@ contract AVSDirectory is emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.REGISTERED); } - // Mutate calling AVS to operator set AVS status, preventing further legacy registrations. - if (!isOperatorSetAVS[msg.sender]) isOperatorSetAVS[msg.sender] = true; - // Loop over `operatorSetIds` array and register `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { // Assert avs is on standby mode for the given `operator` and `operatorSetIds[i]`. @@ -274,7 +271,7 @@ contract AVSDirectory is "AVSDirectory.registerOperatorToAVS: operator not registered to EigenLayer yet" ); require( - !isOperatorSetAVS[msg.sender], + operatorAVSOperatorSetCount[msg.sender][operator] == 0, "AVSDirectory.registerOperatorToAVS: operator set AVS cannot register operators with legacy method" ); diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index e4d5d33c3..c3b7da61c 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -38,9 +38,6 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { /// @dev Salt is used in the `registerOperatorToAVS` and `registerOperatorToOperatorSet` function. mapping(address => mapping(bytes32 => bool)) public operatorSaltIsSpent; - /// @notice Mapping: AVS => whether or not the AVS uses operator set - mapping(address => bool) public isOperatorSetAVS; - /// @notice Mapping: avs => operator => operatorSetID => whether the operator is registered for the operator set mapping(address => mapping(address => mapping(uint32 => bool))) public isOperatorInOperatorSet; diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 821e9b6ce..92406cd4c 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -387,7 +387,6 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni assertEq(avsDirectory.operatorAVSOperatorSetCount(address(this), operator), oids.length); assertEq(uint8(avsDirectory.avsOperatorStatus(address(this), operator)), 1); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); - assertTrue(avsDirectory.isOperatorSetAVS(address(this))); } function testFuzz_Correctness( @@ -426,7 +425,6 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni assertEq(uint8(avsDirectory.avsOperatorStatus(address(this), operator)), 1); assertTrue(avsDirectory.isOperatorInOperatorSet(address(this), operator, operatorSetId)); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); - assertTrue(avsDirectory.isOperatorSetAVS(address(this))); } function testFuzz_revert_NoSignatureNoStandby( From dea2473ec8a46b75c8fcbc37630a2b0ed875b82e Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Tue, 9 Jul 2024 13:49:24 -0400 Subject: [PATCH 06/43] refactor: remove unused beaconChainETHStrategy constant --- src/contracts/core/AVSDirectory.sol | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index c91895551..61977920d 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -21,9 +21,6 @@ contract AVSDirectory is /// @dev Returns the chain ID from the time the contract was deployed. uint256 internal immutable ORIGINAL_CHAIN_ID; - /// @notice Returns the canonical beacon chain ETH strategy. - IStrategy public constant beaconChainETHStrategy = IStrategy(0xbeaC0eeEeeeeEEeEeEEEEeeEEeEeeeEeeEEBEaC0); - /** * * INITIALIZING FUNCTIONS From 2d60939726b823061ff70cfb492ed7feb28f2bce Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Tue, 9 Jul 2024 14:38:32 -0400 Subject: [PATCH 07/43] refactor: storage optimization/overhaul --- src/contracts/core/AVSDirectory.sol | 72 ++++++++++++---------- src/contracts/core/AVSDirectoryStorage.sol | 14 +---- src/contracts/interfaces/IAVSDirectory.sol | 15 ++--- src/test/events/IAVSDirectoryEvents.sol | 2 +- src/test/unit/AVSDirectoryUnit.t.sol | 47 +++++++------- 5 files changed, 71 insertions(+), 79 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 61977920d..e1b8c0b50 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -103,9 +103,11 @@ contract AVSDirectory is // Loop through each standby parameter and update the state accordingly. for (uint256 i; i < standbyParams.length; ++i) { + MemberSetInfo storage setInfo = + memberSetInfo[standbyParams[i].operatorSet.avs][operator][standbyParams[i].operatorSet.id]; + // Update the standby status for the given operator set. - onStandby[standbyParams[i].operatorSet.avs][operator][standbyParams[i].operatorSet.id] = - standbyParams[i].onStandby; + setInfo.onStandby = standbyParams[i].onStandby; emit StandbyParamUpdated(operator, standbyParams[i].operatorSet, standbyParams[i].onStandby); } @@ -162,30 +164,31 @@ contract AVSDirectory is // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. operatorSaltIsSpent[operator][operatorSignature.salt] = true; + MemberInfo storage info = memberInfo[msg.sender][operator]; + // Register `operator` if not already registered. - if (avsOperatorStatus[msg.sender][operator] != OperatorAVSRegistrationStatus.REGISTERED) { - avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.REGISTERED; - emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.REGISTERED); + if (!info.isOperatorForAVS) { + info.isOperatorForAVS = true; + emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, true); } // Loop over `operatorSetIds` array and register `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { + MemberSetInfo storage setInfo = memberSetInfo[msg.sender][operator][operatorSetIds[i]]; + // Assert avs is on standby mode for the given `operator` and `operatorSetIds[i]`. if (operatorSignature.signature.length == 0) { - require( - onStandby[msg.sender][operator][operatorSetIds[i]], - "AVSDirectory.registerOperatorToOperatorSets: avs not on standby" - ); + require(setInfo.onStandby, "AVSDirectory.registerOperatorToOperatorSets: avs not on standby"); } // Assert `operator` has not already been registered to `operatorSetIds[i]`. require( - !isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]], + !setInfo.isMember, "AVSDirectory.registerOperatorToOperatorSets: operator already registered to operator set" ); - // Mutate `isOperatorInOperatorSet` to `true` for `operatorSetIds[i]`. - isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]] = true; + // Mutate `isMember` to `true` for `operatorSetIds[i]`. + setInfo.isMember = true; emit OperatorAddedToOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); } @@ -193,7 +196,7 @@ contract AVSDirectory is // Increase `operatorAVSOperatorSetCount` by `operatorSetIds.length`. // You would have to add the operator to 2**256-2 operator sets before overflow is possible here. unchecked { - operatorAVSOperatorSetCount[msg.sender][operator] += operatorSetIds.length; + info.registrationCount += uint248(operatorSetIds.length); } } @@ -214,27 +217,31 @@ contract AVSDirectory is ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { // Loop over `operatorSetIds` array and deregister `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { + MemberSetInfo storage setInfo = memberSetInfo[msg.sender][operator][operatorSetIds[i]]; + // Assert `operator` is registered for this iterations operator set. require( - isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]], + setInfo.isMember, "AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set" ); - // Mutate `isOperatorInOperatorSet` to `false` for `operatorSetIds[i]`. - isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]] = false; + // Mutate `isMember` to `false` for `operatorSetIds[i]`. + setInfo.isMember = false; emit OperatorRemovedFromOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); } + MemberInfo storage info = memberInfo[msg.sender][operator]; + // The above assertion makes underflow logically impossible here. unchecked { - operatorAVSOperatorSetCount[msg.sender][operator] -= operatorSetIds.length; + info.registrationCount -= uint248(operatorSetIds.length); } // Set the operator as deregistered if no longer registered for any operator sets - if (operatorAVSOperatorSetCount[msg.sender][operator] == 0) { - avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.UNREGISTERED; - emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.UNREGISTERED); + if (info.registrationCount == 0) { + info.isOperatorForAVS = false; + emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, false); } } @@ -255,10 +262,10 @@ contract AVSDirectory is operatorSignature.expiry >= block.timestamp, "AVSDirectory.registerOperatorToAVS: operator signature expired" ); - require( - avsOperatorStatus[msg.sender][operator] != OperatorAVSRegistrationStatus.REGISTERED, - "AVSDirectory.registerOperatorToAVS: operator already registered" - ); + + MemberInfo storage info = memberInfo[msg.sender][operator]; + + require(!info.isOperatorForAVS, "AVSDirectory.registerOperatorToAVS: operator already registered"); require( !operatorSaltIsSpent[operator][operatorSignature.salt], "AVSDirectory.registerOperatorToAVS: salt already spent" @@ -268,7 +275,7 @@ contract AVSDirectory is "AVSDirectory.registerOperatorToAVS: operator not registered to EigenLayer yet" ); require( - operatorAVSOperatorSetCount[msg.sender][operator] == 0, + info.registrationCount == 0, "AVSDirectory.registerOperatorToAVS: operator set AVS cannot register operators with legacy method" ); @@ -289,12 +296,12 @@ contract AVSDirectory is }); // Set the operator as registered - avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.REGISTERED; + info.isOperatorForAVS = true; // Mark the salt as spent operatorSaltIsSpent[operator][operatorSignature.salt] = true; - emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.REGISTERED); + emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, true); } /** @@ -308,15 +315,14 @@ contract AVSDirectory is external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { - require( - avsOperatorStatus[msg.sender][operator] == OperatorAVSRegistrationStatus.REGISTERED, - "AVSDirectory.deregisterOperatorFromAVS: operator not registered" - ); + MemberInfo storage info = memberInfo[msg.sender][operator]; + + require(info.isOperatorForAVS, "AVSDirectory.deregisterOperatorFromAVS: operator not registered"); // Set the operator as deregistered - avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.UNREGISTERED; + info.isOperatorForAVS = false; - emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.UNREGISTERED); + emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, false); } /** diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index c3b7da61c..fee18ab9e 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -31,21 +31,11 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { */ bytes32 internal _DOMAIN_SEPARATOR; - /// @notice Mapping: AVS => operator => enum of operator status to the AVS - mapping(address => mapping(address => OperatorAVSRegistrationStatus)) public avsOperatorStatus; - - /// @notice Mapping: operator => 32-byte salt => whether or not the salt has already been used by the operator. - /// @dev Salt is used in the `registerOperatorToAVS` and `registerOperatorToOperatorSet` function. mapping(address => mapping(bytes32 => bool)) public operatorSaltIsSpent; - /// @notice Mapping: avs => operator => operatorSetID => whether the operator is registered for the operator set - mapping(address => mapping(address => mapping(uint32 => bool))) public isOperatorInOperatorSet; - - /// @notice Mapping: avs => operator => number of operator sets the operator is registered for the AVS - mapping(address => mapping(address => uint256)) public operatorAVSOperatorSetCount; + mapping(address => mapping(address => MemberInfo)) public memberInfo; - /// @notice Mapping: avs = operator => operatorSetId => Whether the given operator set in standby mode or not - mapping(address => mapping(address => mapping(uint32 => bool))) public onStandby; + mapping(address => mapping(address => mapping(uint32 => MemberSetInfo))) public memberSetInfo; constructor(IDelegationManager _delegation) { delegation = _delegation; diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index b24041853..b5374df79 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -5,11 +5,14 @@ import "./ISignatureUtils.sol"; import "./IStrategy.sol"; interface IAVSDirectory is ISignatureUtils { - /// @notice Enum representing the registration status of an operator with an AVS. - enum OperatorAVSRegistrationStatus { - UNREGISTERED, // Operator is not registered with the AVS. - REGISTERED // Operator is registered with the AVS. + struct MemberInfo { + uint248 registrationCount; + bool isOperatorForAVS; + } + struct MemberSetInfo { + bool isMember; + bool onStandby; } struct OperatorSet { @@ -27,9 +30,7 @@ interface IAVSDirectory is ISignatureUtils { * Specifically, when an operator enters its first operator set for an AVS, or * when it is removed from the last operator set. */ - event OperatorAVSRegistrationStatusUpdated( - address indexed operator, address indexed avs, OperatorAVSRegistrationStatus status - ); + event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isOperatorForAVS); /// @notice Emitted when an operator is added to an operator set. event OperatorAddedToOperatorSet(address operator, OperatorSet operatorSet); diff --git a/src/test/events/IAVSDirectoryEvents.sol b/src/test/events/IAVSDirectoryEvents.sol index a4f0a2962..e009ad463 100644 --- a/src/test/events/IAVSDirectoryEvents.sol +++ b/src/test/events/IAVSDirectoryEvents.sol @@ -11,5 +11,5 @@ interface IAVSDirectoryEvents { event AVSMetadataURIUpdated(address indexed avs, string metadataURI); /// @notice Emitted when an operator's registration status for an AVS is updated - event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, IAVSDirectory.OperatorAVSRegistrationStatus status); + event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool status); } diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 92406cd4c..978ce9e2f 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -367,9 +367,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni _registerOperatorWithBaseDetails(operator); cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated( - operator, address(this), IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED - ); + emit OperatorAVSRegistrationStatusUpdated(operator, address(this), true); for (uint256 i; i < oids.length; ++i) { cheats.expectEmit(true, false, false, false, address(avsDirectory)); @@ -381,11 +379,13 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni ); for (uint256 i; i < oids.length; ++i) { - assertTrue(avsDirectory.isOperatorInOperatorSet(address(this), operator, oids[i])); + (bool isMember, ) = avsDirectory.memberSetInfo(address(this), operator, oids[i]); + assertTrue(isMember); } - assertEq(avsDirectory.operatorAVSOperatorSetCount(address(this), operator), oids.length); - assertEq(uint8(avsDirectory.avsOperatorStatus(address(this), operator)), 1); + (uint248 registrationCount, bool isOperatorForAVS) = avsDirectory.memberInfo(address(this), operator); + assertEq(registrationCount, oids.length); + assertTrue(isOperatorForAVS); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); } @@ -411,9 +411,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni _registerOperatorWithBaseDetails(operator); cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated( - operator, address(this), IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED - ); + emit OperatorAVSRegistrationStatusUpdated(operator, address(this), true); cheats.expectEmit(true, false, false, false, address(avsDirectory)); emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); @@ -421,9 +419,11 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) ); - assertEq(avsDirectory.operatorAVSOperatorSetCount(address(this), operator), 1); - assertEq(uint8(avsDirectory.avsOperatorStatus(address(this), operator)), 1); - assertTrue(avsDirectory.isOperatorInOperatorSet(address(this), operator, operatorSetId)); + (uint248 registrationCount, bool isOperatorForAVS) = avsDirectory.memberInfo(address(this), operator); + assertEq(registrationCount, 1); + assertTrue(isOperatorForAVS); + (bool isMember, ) = avsDirectory.memberSetInfo(address(this), operator, operatorSetId); + assertTrue(isMember); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); } @@ -521,18 +521,15 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); cheats.expectEmit(true, true, true, false, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated( - operator, address(this), IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED - ); + emit OperatorAVSRegistrationStatusUpdated(operator, address(this), true); avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); - assertEq(avsDirectory.isOperatorInOperatorSet(address(this), operator, operatorSetId), false); - assertEq(avsDirectory.operatorAVSOperatorSetCount(address(this), operator), 0); - assertEq( - uint8(avsDirectory.avsOperatorStatus(address(this), operator)), - uint8(IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED) - ); + (bool isMember, ) = avsDirectory.memberSetInfo(address(this), operator, operatorSetId); + assertEq(isMember, false); + (uint248 registrationCount, bool isOperatorForAVS) = avsDirectory.memberInfo(address(this), operator); + assertEq(registrationCount, 0); + assertEq(isOperatorForAVS, false); } } @@ -628,8 +625,8 @@ contract AVSDirectoryUnitTests_updateStandbyParams is AVSDirectoryUnitTests { avsDirectory.updateStandbyParams( operator, params, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) ); - - assertEq(avsDirectory.onStandby(avs, operator, operatorSetId), standby); + (, bool onStandby) = avsDirectory.memberSetInfo(avs, operator, operatorSetId); + assertEq(onStandby, standby); } } @@ -664,9 +661,7 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni _registerOperatorWithBaseDetails(operator); cheats.expectEmit(true, true, true, true, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated( - operator, defaultAVS, IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED - ); + emit OperatorAVSRegistrationStatusUpdated(operator, defaultAVS, true); uint256 expiry = type(uint256).max; From 8d67ab8a158c360f0e23ceb9b6f12eca9325f68b Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Tue, 9 Jul 2024 14:52:38 -0400 Subject: [PATCH 08/43] nit: move updateStandbyParams fn --- src/contracts/core/AVSDirectory.sol | 114 ++++++++++++++-------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index e1b8c0b50..293e73838 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -56,63 +56,6 @@ contract AVSDirectory is * */ - /** - * @notice Updates the standby parameters for an operator across multiple operator sets. - * Allows the AVS to add the operator to a given operator set if they are not already registered. - * - * @param operator The address of the operator for which the standby parameters are being updated. - * @param standbyParams The new standby parameters for the operator. - * @param operatorSignature If non-empty, the signature of the operator authorizing the modification. - * If empty, the `msg.sender` must be the operator. - */ - function updateStandbyParams( - address operator, - StandbyParam[] calldata standbyParams, - SignatureWithSaltAndExpiry calldata operatorSignature - ) external { - // Check if the operator's signature is provided or not. - if (operatorSignature.signature.length == 0) { - // If the signature length is zero, assert that the caller is the operator. - require(msg.sender == operator, "AVSDirectory.updateStandbyParams: invalid signature"); - } else { - // If a signature is provided, perform the following checks: - - // Assert that the operator's signature has not expired. - require( - operatorSignature.expiry >= block.timestamp, - "AVSDirectory.updateStandbyParams: operator signature expired" - ); - - // Assert that the operator's signature cannot be replayed. - require( - !operatorSaltIsSpent[operator][operatorSignature.salt], "AVSDirectory.updateStandbyParams: salt spent" - ); - - // Assert that the operator's signature is valid. - EIP1271SignatureUtils.checkSignature_EIP1271({ - signer: operator, - digestHash: calculateUpdateStandbyDigestHash( - standbyParams, operatorSignature.salt, operatorSignature.expiry - ), - signature: operatorSignature.signature - }); - - // Mark the salt as spent to prevent replay attacks. - operatorSaltIsSpent[operator][operatorSignature.salt] = true; - } - - // Loop through each standby parameter and update the state accordingly. - for (uint256 i; i < standbyParams.length; ++i) { - MemberSetInfo storage setInfo = - memberSetInfo[standbyParams[i].operatorSet.avs][operator][standbyParams[i].operatorSet.id]; - - // Update the standby status for the given operator set. - setInfo.onStandby = standbyParams[i].onStandby; - - emit StandbyParamUpdated(operator, standbyParams[i].operatorSet, standbyParams[i].onStandby); - } - } - /** * @notice Called by AVSs to add an operator to an operator set. * @@ -325,6 +268,63 @@ contract AVSDirectory is emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, false); } + /** + * @notice Updates the standby parameters for an operator across multiple operator sets. + * Allows the AVS to add the operator to a given operator set if they are not already registered. + * + * @param operator The address of the operator for which the standby parameters are being updated. + * @param standbyParams The new standby parameters for the operator. + * @param operatorSignature If non-empty, the signature of the operator authorizing the modification. + * If empty, the `msg.sender` must be the operator. + */ + function updateStandbyParams( + address operator, + StandbyParam[] calldata standbyParams, + SignatureWithSaltAndExpiry calldata operatorSignature + ) external { + // Check if the operator's signature is provided or not. + if (operatorSignature.signature.length == 0) { + // If the signature length is zero, assert that the caller is the operator. + require(msg.sender == operator, "AVSDirectory.updateStandbyParams: invalid signature"); + } else { + // If a signature is provided, perform the following checks: + + // Assert that the operator's signature has not expired. + require( + operatorSignature.expiry >= block.timestamp, + "AVSDirectory.updateStandbyParams: operator signature expired" + ); + + // Assert that the operator's signature cannot be replayed. + require( + !operatorSaltIsSpent[operator][operatorSignature.salt], "AVSDirectory.updateStandbyParams: salt spent" + ); + + // Assert that the operator's signature is valid. + EIP1271SignatureUtils.checkSignature_EIP1271({ + signer: operator, + digestHash: calculateUpdateStandbyDigestHash( + standbyParams, operatorSignature.salt, operatorSignature.expiry + ), + signature: operatorSignature.signature + }); + + // Mark the salt as spent to prevent replay attacks. + operatorSaltIsSpent[operator][operatorSignature.salt] = true; + } + + // Loop through each standby parameter and update the state accordingly. + for (uint256 i; i < standbyParams.length; ++i) { + MemberSetInfo storage setInfo = + memberSetInfo[standbyParams[i].operatorSet.avs][operator][standbyParams[i].operatorSet.id]; + + // Update the standby status for the given operator set. + setInfo.onStandby = standbyParams[i].onStandby; + + emit StandbyParamUpdated(operator, standbyParams[i].operatorSet, standbyParams[i].onStandby); + } + } + /** * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. * From 5867547ba77e4857d9e417682a61d82b019e0651 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Wed, 10 Jul 2024 13:45:06 -0400 Subject: [PATCH 09/43] fix: variable name consistency --- src/contracts/core/AVSDirectory.sol | 2 +- src/contracts/core/AVSDirectoryStorage.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 293e73838..ec18248cd 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -363,7 +363,7 @@ contract AVSDirectory is bytes32 salt, uint256 expiry ) public view returns (bytes32) { - return _calculateDigestHash(keccak256(abi.encode(OPERATOR_STANDBY_UPDATE, standbyParams, salt, expiry))); + return _calculateDigestHash(keccak256(abi.encode(OPERATOR_STANDBY_UPDATE_TYPEHASH, standbyParams, salt, expiry))); } /** diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index fee18ab9e..7e81003af 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -18,7 +18,7 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { keccak256("OperatorSetRegistration(address avs,uint32[] operatorSetIds,bytes32 salt,uint256 expiry)"); /// @notice The EIP-712 typehash for the `StandbyParams` struct used by the contract - bytes32 public constant OPERATOR_STANDBY_UPDATE = + bytes32 public constant OPERATOR_STANDBY_UPDATE_TYPEHASH = keccak256("OperatorStandbyUpdate(StandbyParam[] standbyParams,bytes32 salt,uint256 expiry)"); /// @notice The DelegationManager contract for EigenLayer From da8077f1ce377902aa072018adb3f79b24bc1e53 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Wed, 10 Jul 2024 14:40:46 -0400 Subject: [PATCH 10/43] chore: improve comments + naming --- src/contracts/core/AVSDirectory.sol | 116 +++++++++++---------- src/contracts/interfaces/IAVSDirectory.sol | 8 +- src/test/unit/AVSDirectoryUnit.t.sol | 30 +++--- 3 files changed, 81 insertions(+), 73 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index ec18248cd..edbfc0f76 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -74,11 +74,6 @@ contract AVSDirectory is uint32[] calldata operatorSetIds, ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { - // Assert `operator` is actually an operator. - require( - delegation.isOperator(operator), - "AVSDirectory.registerOperatorToOperatorSets: operator not registered to EigenLayer yet" - ); // Assert operator's signature has not expired. require( operatorSignature.expiry >= block.timestamp, @@ -89,9 +84,15 @@ contract AVSDirectory is !operatorSaltIsSpent[operator][operatorSignature.salt], "AVSDirectory.registerOperatorToOperatorSets: salt already spent" ); - + // Assert `operator` is actually an operator. + require( + delegation.isOperator(operator), + "AVSDirectory.registerOperatorToOperatorSets: operator not registered to EigenLayer yet" + ); + + // If a signature is not provided... if (operatorSignature.signature.length != 0) { - // Assert signature provided by `operator` is valid. + // Assert that `operatorSignature.signature` is a valid signature for operator set registrations. EIP1271SignatureUtils.checkSignature_EIP1271( operator, calculateOperatorSetRegistrationDigestHash({ @@ -107,39 +108,39 @@ contract AVSDirectory is // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. operatorSaltIsSpent[operator][operatorSignature.salt] = true; - MemberInfo storage info = memberInfo[msg.sender][operator]; + MemberInfo storage member = memberInfo[msg.sender][operator]; // Register `operator` if not already registered. - if (!info.isOperatorForAVS) { - info.isOperatorForAVS = true; + if (!member.isLegacyOperator) { + member.isLegacyOperator = true; emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, true); } // Loop over `operatorSetIds` array and register `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { - MemberSetInfo storage setInfo = memberSetInfo[msg.sender][operator][operatorSetIds[i]]; + MemberSetInfo storage setMember = memberSetInfo[msg.sender][operator][operatorSetIds[i]]; // Assert avs is on standby mode for the given `operator` and `operatorSetIds[i]`. if (operatorSignature.signature.length == 0) { - require(setInfo.onStandby, "AVSDirectory.registerOperatorToOperatorSets: avs not on standby"); + require(setMember.onStandby, "AVSDirectory.registerOperatorToOperatorSets: avs not on standby"); } // Assert `operator` has not already been registered to `operatorSetIds[i]`. require( - !setInfo.isMember, + !setMember.isSetOperator, "AVSDirectory.registerOperatorToOperatorSets: operator already registered to operator set" ); - // Mutate `isMember` to `true` for `operatorSetIds[i]`. - setInfo.isMember = true; + // Mutate `setMember.isSetOperator` to `true`. + setMember.isSetOperator = true; emit OperatorAddedToOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); } - // Increase `operatorAVSOperatorSetCount` by `operatorSetIds.length`. + // Increase `member.inTotalSets` by `operatorSetIds.length`. // You would have to add the operator to 2**256-2 operator sets before overflow is possible here. unchecked { - info.registrationCount += uint248(operatorSetIds.length); + member.inTotalSets += uint248(operatorSetIds.length); } } @@ -160,30 +161,30 @@ contract AVSDirectory is ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { // Loop over `operatorSetIds` array and deregister `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { - MemberSetInfo storage setInfo = memberSetInfo[msg.sender][operator][operatorSetIds[i]]; + MemberSetInfo storage setMember = memberSetInfo[msg.sender][operator][operatorSetIds[i]]; // Assert `operator` is registered for this iterations operator set. require( - setInfo.isMember, + setMember.isSetOperator, "AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set" ); - // Mutate `isMember` to `false` for `operatorSetIds[i]`. - setInfo.isMember = false; + // Mutate `setMember.isSetOperator` to `false`. + setMember.isSetOperator = false; emit OperatorRemovedFromOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); } - MemberInfo storage info = memberInfo[msg.sender][operator]; + MemberInfo storage member = memberInfo[msg.sender][operator]; // The above assertion makes underflow logically impossible here. unchecked { - info.registrationCount -= uint248(operatorSetIds.length); + member.inTotalSets -= uint248(operatorSetIds.length); } // Set the operator as deregistered if no longer registered for any operator sets - if (info.registrationCount == 0) { - info.isOperatorForAVS = false; + if (member.inTotalSets == 0) { + member.isLegacyOperator = false; emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, false); } } @@ -201,48 +202,52 @@ contract AVSDirectory is address operator, ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + // Assert `operatorSignature.expiry` has not elapsed. require( operatorSignature.expiry >= block.timestamp, "AVSDirectory.registerOperatorToAVS: operator signature expired" ); - MemberInfo storage info = memberInfo[msg.sender][operator]; + MemberInfo storage member = memberInfo[msg.sender][operator]; + + // Assert `operator` is not already registered to the (caller) avs. + require(!member.isLegacyOperator, "AVSDirectory.registerOperatorToAVS: operator already registered"); - require(!info.isOperatorForAVS, "AVSDirectory.registerOperatorToAVS: operator already registered"); + // Assert `operator` is not actively registered to any operator sets. + require( + member.inTotalSets == 0, + "AVSDirectory.registerOperatorToAVS: operator set AVS cannot register operators with legacy method" + ); + + // Assert `operator` has not already spent `operatorSignature.salt`. require( !operatorSaltIsSpent[operator][operatorSignature.salt], "AVSDirectory.registerOperatorToAVS: salt already spent" ); + + // Assert `operator` is a registered operator. require( delegation.isOperator(operator), "AVSDirectory.registerOperatorToAVS: operator not registered to EigenLayer yet" ); - require( - info.registrationCount == 0, - "AVSDirectory.registerOperatorToAVS: operator set AVS cannot register operators with legacy method" - ); - - // Calculate the digest hash - bytes32 operatorRegistrationDigestHash = calculateOperatorAVSRegistrationDigestHash({ - operator: operator, - avs: msg.sender, - salt: operatorSignature.salt, - expiry: operatorSignature.expiry - }); - // forgefmt: disable-next-item - // Check that the signature is valid + // Assert that `operatorSignature.signature` is a valid signature for the operator AVS registration. EIP1271SignatureUtils.checkSignature_EIP1271({ - signer: operator, - digestHash: operatorRegistrationDigestHash, + signer: operator, + digestHash: calculateOperatorAVSRegistrationDigestHash({ + operator: operator, + avs: msg.sender, + salt: operatorSignature.salt, + expiry: operatorSignature.expiry + }), signature: operatorSignature.signature }); - // Set the operator as registered - info.isOperatorForAVS = true; - - // Mark the salt as spent + // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. operatorSaltIsSpent[operator][operatorSignature.salt] = true; + + // Mutate `member.isLegacyOperator` to `true`. + member.isLegacyOperator = true; emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, true); } @@ -258,12 +263,13 @@ contract AVSDirectory is external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { - MemberInfo storage info = memberInfo[msg.sender][operator]; + MemberInfo storage member = memberInfo[msg.sender][operator]; - require(info.isOperatorForAVS, "AVSDirectory.deregisterOperatorFromAVS: operator not registered"); + // Assert `member.isLegacyOperator` is actively registered to the (caller) avs. + require(member.isLegacyOperator, "AVSDirectory.deregisterOperatorFromAVS: operator not registered"); - // Set the operator as deregistered - info.isOperatorForAVS = false; + // Mutate `member.isLegacyOperator` to `false`. + member.isLegacyOperator = false; emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, false); } @@ -315,11 +321,11 @@ contract AVSDirectory is // Loop through each standby parameter and update the state accordingly. for (uint256 i; i < standbyParams.length; ++i) { - MemberSetInfo storage setInfo = + MemberSetInfo storage setMember = memberSetInfo[standbyParams[i].operatorSet.avs][operator][standbyParams[i].operatorSet.id]; // Update the standby status for the given operator set. - setInfo.onStandby = standbyParams[i].onStandby; + setMember.onStandby = standbyParams[i].onStandby; emit StandbyParamUpdated(operator, standbyParams[i].operatorSet, standbyParams[i].onStandby); } @@ -342,6 +348,7 @@ contract AVSDirectory is * @param salt A unique and single use value associated with the approver signature. */ function cancelSalt(bytes32 salt) external { + // Mutate `operatorSaltIsSpent` to `true` to prevent future spending. operatorSaltIsSpent[msg.sender][salt] = true; } @@ -363,7 +370,8 @@ contract AVSDirectory is bytes32 salt, uint256 expiry ) public view returns (bytes32) { - return _calculateDigestHash(keccak256(abi.encode(OPERATOR_STANDBY_UPDATE_TYPEHASH, standbyParams, salt, expiry))); + return + _calculateDigestHash(keccak256(abi.encode(OPERATOR_STANDBY_UPDATE_TYPEHASH, standbyParams, salt, expiry))); } /** diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index b5374df79..0d8cb181d 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -6,12 +6,12 @@ import "./IStrategy.sol"; interface IAVSDirectory is ISignatureUtils { struct MemberInfo { - uint248 registrationCount; - bool isOperatorForAVS; + uint248 inTotalSets; + bool isLegacyOperator; } struct MemberSetInfo { - bool isMember; + bool isSetOperator; bool onStandby; } @@ -30,7 +30,7 @@ interface IAVSDirectory is ISignatureUtils { * Specifically, when an operator enters its first operator set for an AVS, or * when it is removed from the last operator set. */ - event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isOperatorForAVS); + event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator); /// @notice Emitted when an operator is added to an operator set. event OperatorAddedToOperatorSet(address operator, OperatorSet operatorSet); diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 978ce9e2f..a3bcf3708 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -379,13 +379,13 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni ); for (uint256 i; i < oids.length; ++i) { - (bool isMember, ) = avsDirectory.memberSetInfo(address(this), operator, oids[i]); - assertTrue(isMember); + (bool isSetOperator, ) = avsDirectory.memberSetInfo(address(this), operator, oids[i]); + assertTrue(isSetOperator); } - (uint248 registrationCount, bool isOperatorForAVS) = avsDirectory.memberInfo(address(this), operator); - assertEq(registrationCount, oids.length); - assertTrue(isOperatorForAVS); + (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); + assertEq(inTotalSets, oids.length); + assertTrue(isLegacyOperator); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); } @@ -419,11 +419,11 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) ); - (uint248 registrationCount, bool isOperatorForAVS) = avsDirectory.memberInfo(address(this), operator); - assertEq(registrationCount, 1); - assertTrue(isOperatorForAVS); - (bool isMember, ) = avsDirectory.memberSetInfo(address(this), operator, operatorSetId); - assertTrue(isMember); + (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); + assertEq(inTotalSets, 1); + assertTrue(isLegacyOperator); + (bool isSetOperator, ) = avsDirectory.memberSetInfo(address(this), operator, operatorSetId); + assertTrue(isSetOperator); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); } @@ -525,11 +525,11 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); - (bool isMember, ) = avsDirectory.memberSetInfo(address(this), operator, operatorSetId); - assertEq(isMember, false); - (uint248 registrationCount, bool isOperatorForAVS) = avsDirectory.memberInfo(address(this), operator); - assertEq(registrationCount, 0); - assertEq(isOperatorForAVS, false); + (bool isSetOperator, ) = avsDirectory.memberSetInfo(address(this), operator, operatorSetId); + assertEq(isSetOperator, false); + (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); + assertEq(inTotalSets, 0); + assertEq(isLegacyOperator, false); } } From b54fc0854ec96aac4b6bf29fd0c05c2cc3dea884 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Thu, 11 Jul 2024 11:30:35 -0400 Subject: [PATCH 11/43] feat: remove simp mode --- src/contracts/core/AVSDirectory.sol | 118 +++-------------- src/contracts/core/AVSDirectoryStorage.sol | 6 +- src/contracts/interfaces/IAVSDirectory.sol | 29 ----- src/test/unit/AVSDirectoryUnit.t.sol | 143 +-------------------- 4 files changed, 21 insertions(+), 275 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index edbfc0f76..ff30f1df3 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -90,20 +90,17 @@ contract AVSDirectory is "AVSDirectory.registerOperatorToOperatorSets: operator not registered to EigenLayer yet" ); - // If a signature is not provided... - if (operatorSignature.signature.length != 0) { - // Assert that `operatorSignature.signature` is a valid signature for operator set registrations. - EIP1271SignatureUtils.checkSignature_EIP1271( - operator, - calculateOperatorSetRegistrationDigestHash({ - avs: msg.sender, - operatorSetIds: operatorSetIds, - salt: operatorSignature.salt, - expiry: operatorSignature.expiry - }), - operatorSignature.signature - ); - } + // Assert that `operatorSignature.signature` is a valid signature for operator set registrations. + EIP1271SignatureUtils.checkSignature_EIP1271( + operator, + calculateOperatorSetRegistrationDigestHash({ + avs: msg.sender, + operatorSetIds: operatorSetIds, + salt: operatorSignature.salt, + expiry: operatorSignature.expiry + }), + operatorSignature.signature + ); // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. operatorSaltIsSpent[operator][operatorSignature.salt] = true; @@ -118,21 +115,15 @@ contract AVSDirectory is // Loop over `operatorSetIds` array and register `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { - MemberSetInfo storage setMember = memberSetInfo[msg.sender][operator][operatorSetIds[i]]; - - // Assert avs is on standby mode for the given `operator` and `operatorSetIds[i]`. - if (operatorSignature.signature.length == 0) { - require(setMember.onStandby, "AVSDirectory.registerOperatorToOperatorSets: avs not on standby"); - } // Assert `operator` has not already been registered to `operatorSetIds[i]`. require( - !setMember.isSetOperator, + !isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]], "AVSDirectory.registerOperatorToOperatorSets: operator already registered to operator set" ); - // Mutate `setMember.isSetOperator` to `true`. - setMember.isSetOperator = true; + // Mutate `isOperatorInOperatorSet` to `true`. + isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]] = true; emit OperatorAddedToOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); } @@ -161,16 +152,14 @@ contract AVSDirectory is ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { // Loop over `operatorSetIds` array and deregister `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { - MemberSetInfo storage setMember = memberSetInfo[msg.sender][operator][operatorSetIds[i]]; - // Assert `operator` is registered for this iterations operator set. require( - setMember.isSetOperator, + isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]], "AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set" ); - // Mutate `setMember.isSetOperator` to `false`. - setMember.isSetOperator = false; + // Mutate `isOperatorInOperatorSet` to `false`. + isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]] = false; emit OperatorRemovedFromOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); } @@ -274,63 +263,6 @@ contract AVSDirectory is emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, false); } - /** - * @notice Updates the standby parameters for an operator across multiple operator sets. - * Allows the AVS to add the operator to a given operator set if they are not already registered. - * - * @param operator The address of the operator for which the standby parameters are being updated. - * @param standbyParams The new standby parameters for the operator. - * @param operatorSignature If non-empty, the signature of the operator authorizing the modification. - * If empty, the `msg.sender` must be the operator. - */ - function updateStandbyParams( - address operator, - StandbyParam[] calldata standbyParams, - SignatureWithSaltAndExpiry calldata operatorSignature - ) external { - // Check if the operator's signature is provided or not. - if (operatorSignature.signature.length == 0) { - // If the signature length is zero, assert that the caller is the operator. - require(msg.sender == operator, "AVSDirectory.updateStandbyParams: invalid signature"); - } else { - // If a signature is provided, perform the following checks: - - // Assert that the operator's signature has not expired. - require( - operatorSignature.expiry >= block.timestamp, - "AVSDirectory.updateStandbyParams: operator signature expired" - ); - - // Assert that the operator's signature cannot be replayed. - require( - !operatorSaltIsSpent[operator][operatorSignature.salt], "AVSDirectory.updateStandbyParams: salt spent" - ); - - // Assert that the operator's signature is valid. - EIP1271SignatureUtils.checkSignature_EIP1271({ - signer: operator, - digestHash: calculateUpdateStandbyDigestHash( - standbyParams, operatorSignature.salt, operatorSignature.expiry - ), - signature: operatorSignature.signature - }); - - // Mark the salt as spent to prevent replay attacks. - operatorSaltIsSpent[operator][operatorSignature.salt] = true; - } - - // Loop through each standby parameter and update the state accordingly. - for (uint256 i; i < standbyParams.length; ++i) { - MemberSetInfo storage setMember = - memberSetInfo[standbyParams[i].operatorSet.avs][operator][standbyParams[i].operatorSet.id]; - - // Update the standby status for the given operator set. - setMember.onStandby = standbyParams[i].onStandby; - - emit StandbyParamUpdated(operator, standbyParams[i].operatorSet, standbyParams[i].onStandby); - } - } - /** * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. * @@ -358,22 +290,6 @@ contract AVSDirectory is * */ - /** - * @notice Calculates the digest hash to be signed by an operator to register with an AVS. - * - * @param standbyParams The newly updated standby mode parameters. - * @param salt A unique and single-use value associated with the approver's signature. - * @param expiry The time after which the approver's signature becomes invalid. - */ - function calculateUpdateStandbyDigestHash( - StandbyParam[] calldata standbyParams, - bytes32 salt, - uint256 expiry - ) public view returns (bytes32) { - return - _calculateDigestHash(keccak256(abi.encode(OPERATOR_STANDBY_UPDATE_TYPEHASH, standbyParams, salt, expiry))); - } - /** * @notice Calculates the digest hash to be signed by an operator to register with an AVS. * diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index 7e81003af..d6983fa46 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -17,10 +17,6 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { bytes32 public constant OPERATOR_SET_REGISTRATION_TYPEHASH = keccak256("OperatorSetRegistration(address avs,uint32[] operatorSetIds,bytes32 salt,uint256 expiry)"); - /// @notice The EIP-712 typehash for the `StandbyParams` struct used by the contract - bytes32 public constant OPERATOR_STANDBY_UPDATE_TYPEHASH = - keccak256("OperatorStandbyUpdate(StandbyParam[] standbyParams,bytes32 salt,uint256 expiry)"); - /// @notice The DelegationManager contract for EigenLayer IDelegationManager public immutable delegation; @@ -35,7 +31,7 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { mapping(address => mapping(address => MemberInfo)) public memberInfo; - mapping(address => mapping(address => mapping(uint32 => MemberSetInfo))) public memberSetInfo; + mapping(address => mapping(address => mapping(uint32 => bool))) public isOperatorInOperatorSet; constructor(IDelegationManager _delegation) { delegation = _delegation; diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index 0d8cb181d..f4b4b41e1 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -2,7 +2,6 @@ pragma solidity >=0.5.0; import "./ISignatureUtils.sol"; -import "./IStrategy.sol"; interface IAVSDirectory is ISignatureUtils { struct MemberInfo { @@ -10,21 +9,11 @@ interface IAVSDirectory is ISignatureUtils { bool isLegacyOperator; } - struct MemberSetInfo { - bool isSetOperator; - bool onStandby; - } - struct OperatorSet { address avs; uint32 id; } - struct StandbyParam { - OperatorSet operatorSet; - bool onStandby; - } - /** * @notice Emitted when an operator's registration status with an AVS is updated. * Specifically, when an operator enters its first operator set for an AVS, or @@ -42,24 +31,6 @@ interface IAVSDirectory is ISignatureUtils { /// @dev The URI is never stored; it is simply emitted through an event for off-chain indexing. event AVSMetadataURIUpdated(address indexed avs, string metadataURI); - /// @notice Emitted when an operator updates their standby parameters. - event StandbyParamUpdated(address operator, OperatorSet operatorSet, bool onStandby); - - /** - * @notice Updates the standby parameters for an operator across multiple operator sets. - * Allows the AVS to add the operator to a given operator set if they are not already registered. - * - * @param operator The address of the operator for which the standby parameters are being updated. - * @param standbyParams The new standby parameters for the operator. - * @param signature If non-empty, the signature of the operator authorizing the modification. - * If empty, the `msg.sender` must be the operator. - */ - function updateStandbyParams( - address operator, - StandbyParam[] calldata standbyParams, - SignatureWithSaltAndExpiry calldata signature - ) external; - /** * @notice Called by the AVS's service manager contract to register an operator with the AVS. * diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index a3bcf3708..5ea6b2258 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -379,8 +379,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni ); for (uint256 i; i < oids.length; ++i) { - (bool isSetOperator, ) = avsDirectory.memberSetInfo(address(this), operator, oids[i]); - assertTrue(isSetOperator); + assertTrue(avsDirectory.isOperatorInOperatorSet(address(this), operator, oids[i])); } (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); @@ -422,47 +421,9 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); assertEq(inTotalSets, 1); assertTrue(isLegacyOperator); - (bool isSetOperator, ) = avsDirectory.memberSetInfo(address(this), operator, operatorSetId); - assertTrue(isSetOperator); + assertTrue(avsDirectory.isOperatorInOperatorSet(address(this), operator, operatorSetId)); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); } - - function testFuzz_revert_NoSignatureNoStandby( - uint256 operatorPk, - uint32 operatorSetId, - bytes32 salt, - uint256 expiry - ) public virtual { - // Make sure sigature is always non-expired. - cheats.warp(0); - operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); - - uint32[] memory oids = new uint32[](1); - oids[0] = operatorSetId; - - IAVSDirectory.StandbyParam[] memory params = new IAVSDirectory.StandbyParam[](1); - params[0] = IAVSDirectory.StandbyParam(IAVSDirectory.OperatorSet(address(this), operatorSetId), true); - - address operator = cheats.addr(operatorPk); - (uint8 v, bytes32 r, bytes32 s) = - cheats.sign(operatorPk, avsDirectory.calculateUpdateStandbyDigestHash(params, keccak256(""), expiry)); - - _registerOperatorWithBaseDetails(operator); - - cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: avs not on standby"); - avsDirectory.registerOperatorToOperatorSets( - operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), salt, expiry) - ); - - avsDirectory.updateStandbyParams( - operator, - params, - ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), keccak256(""), expiry) - ); - avsDirectory.registerOperatorToOperatorSets( - operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), 0, 0) - ); - } } contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirectoryUnitTests { @@ -525,111 +486,13 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); - (bool isSetOperator, ) = avsDirectory.memberSetInfo(address(this), operator, operatorSetId); - assertEq(isSetOperator, false); + assertEq(avsDirectory.isOperatorInOperatorSet(address(this), operator, operatorSetId), false); (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); assertEq(inTotalSets, 0); assertEq(isLegacyOperator, false); } } -contract AVSDirectoryUnitTests_updateStandbyParams is AVSDirectoryUnitTests { - event StandbyParamUpdated(address operator, IAVSDirectory.OperatorSet operatorSet, bool onStandby); - - function testFuzz_revert_CallerNotOperatorNoSignature( - address operator, - address avs, - uint32 operatorSetId, - bool standby - ) public virtual { - IAVSDirectory.StandbyParam[] memory params = new IAVSDirectory.StandbyParam[](1); - params[0] = IAVSDirectory.StandbyParam(IAVSDirectory.OperatorSet(avs, operatorSetId), standby); - - cheats.expectRevert("AVSDirectory.updateStandbyParams: invalid signature"); - avsDirectory.updateStandbyParams( - operator, params, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(0), bytes32(0), 0) - ); - } - - function testFuzz_revert_OperatorSignatureExpired( - address operator, - address avs, - uint32 operatorSetId, - bool standby, - uint256 expiry - ) public virtual { - // Make sure signature is always expired. - cheats.warp(type(uint256).max); - expiry = bound(expiry, 0, type(uint256).max - 1); - - IAVSDirectory.StandbyParam[] memory params = new IAVSDirectory.StandbyParam[](1); - params[0] = IAVSDirectory.StandbyParam(IAVSDirectory.OperatorSet(avs, operatorSetId), standby); - - // Assert operator signature reverts when non-zero. - cheats.expectRevert("AVSDirectory.updateStandbyParams: operator signature expired"); - avsDirectory.updateStandbyParams( - operator, params, ISignatureUtils.SignatureWithSaltAndExpiry(new bytes(1), bytes32(0), expiry) - ); - } - - function testFuzz_revert_SaltSpent( - uint256 operatorPk, - address avs, - uint32 operatorSetId, - bytes32 salt, - uint256 expiry, - bool standby - ) public virtual { - // Make sure sigature is always non-expired. - cheats.warp(0); - operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); - - IAVSDirectory.StandbyParam[] memory params = new IAVSDirectory.StandbyParam[](1); - params[0] = IAVSDirectory.StandbyParam(IAVSDirectory.OperatorSet(avs, operatorSetId), standby); - - address operator = cheats.addr(operatorPk); - (uint8 v, bytes32 r, bytes32 s) = - cheats.sign(operatorPk, avsDirectory.calculateUpdateStandbyDigestHash(params, salt, expiry)); - - avsDirectory.updateStandbyParams( - operator, params, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) - ); - - cheats.expectRevert("AVSDirectory.updateStandbyParams: salt spent"); - avsDirectory.updateStandbyParams( - operator, params, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) - ); - } - - function testFuzz_Correctness( - uint256 operatorPk, - address avs, - uint32 operatorSetId, - bytes32 salt, - uint256 expiry, - bool standby - ) public virtual { - // Make sure sigature is always non-expired. - cheats.warp(0); - operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); - - IAVSDirectory.StandbyParam[] memory params = new IAVSDirectory.StandbyParam[](1); - params[0] = IAVSDirectory.StandbyParam(IAVSDirectory.OperatorSet(avs, operatorSetId), standby); - - address operator = cheats.addr(operatorPk); - (uint8 v, bytes32 r, bytes32 s) = - cheats.sign(operatorPk, avsDirectory.calculateUpdateStandbyDigestHash(params, salt, expiry)); - - cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit StandbyParamUpdated(operator, IAVSDirectory.OperatorSet(avs, operatorSetId), standby); - avsDirectory.updateStandbyParams( - operator, params, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) - ); - (, bool onStandby) = avsDirectory.memberSetInfo(avs, operator, operatorSetId); - assertEq(onStandby, standby); - } -} - contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUnitTests { function test_revert_whenRegisterDeregisterToAVSPaused() public { // set the pausing flag From e0cf6fd5c7cf722a59338193498e6a65e165b5b2 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Thu, 11 Jul 2024 15:10:58 -0400 Subject: [PATCH 12/43] refactor: rename isOperatorInOperatorSet -> isMember --- src/contracts/core/AVSDirectory.sol | 12 ++++++------ src/contracts/core/AVSDirectoryStorage.sol | 2 +- src/test/unit/AVSDirectoryUnit.t.sol | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index ff30f1df3..e947399df 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -118,12 +118,12 @@ contract AVSDirectory is // Assert `operator` has not already been registered to `operatorSetIds[i]`. require( - !isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]], + !isMember[msg.sender][operator][operatorSetIds[i]], "AVSDirectory.registerOperatorToOperatorSets: operator already registered to operator set" ); - // Mutate `isOperatorInOperatorSet` to `true`. - isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]] = true; + // Mutate `isMember` to `true`. + isMember[msg.sender][operator][operatorSetIds[i]] = true; emit OperatorAddedToOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); } @@ -154,12 +154,12 @@ contract AVSDirectory is for (uint256 i = 0; i < operatorSetIds.length; ++i) { // Assert `operator` is registered for this iterations operator set. require( - isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]], + isMember[msg.sender][operator][operatorSetIds[i]], "AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set" ); - // Mutate `isOperatorInOperatorSet` to `false`. - isOperatorInOperatorSet[msg.sender][operator][operatorSetIds[i]] = false; + // Mutate `isMember` to `false`. + isMember[msg.sender][operator][operatorSetIds[i]] = false; emit OperatorRemovedFromOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); } diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index d6983fa46..b2cb12ee6 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -31,7 +31,7 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { mapping(address => mapping(address => MemberInfo)) public memberInfo; - mapping(address => mapping(address => mapping(uint32 => bool))) public isOperatorInOperatorSet; + mapping(address => mapping(address => mapping(uint32 => bool))) public isMember; constructor(IDelegationManager _delegation) { delegation = _delegation; diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 5ea6b2258..3a13606ab 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -379,7 +379,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni ); for (uint256 i; i < oids.length; ++i) { - assertTrue(avsDirectory.isOperatorInOperatorSet(address(this), operator, oids[i])); + assertTrue(avsDirectory.isMember(address(this), operator, oids[i])); } (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); @@ -421,7 +421,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); assertEq(inTotalSets, 1); assertTrue(isLegacyOperator); - assertTrue(avsDirectory.isOperatorInOperatorSet(address(this), operator, operatorSetId)); + assertTrue(avsDirectory.isMember(address(this), operator, operatorSetId)); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); } } @@ -486,7 +486,7 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); - assertEq(avsDirectory.isOperatorInOperatorSet(address(this), operator, operatorSetId), false); + assertEq(avsDirectory.isMember(address(this), operator, operatorSetId), false); (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); assertEq(inTotalSets, 0); assertEq(isLegacyOperator, false); From a51f94d6a84f3598da589cf3ef57ec682f329e72 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Fri, 12 Jul 2024 09:42:41 -0400 Subject: [PATCH 13/43] chore: forge fmt --- src/contracts/core/AVSDirectory.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index e947399df..a0a0f85d9 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -89,7 +89,7 @@ contract AVSDirectory is delegation.isOperator(operator), "AVSDirectory.registerOperatorToOperatorSets: operator not registered to EigenLayer yet" ); - + // Assert that `operatorSignature.signature` is a valid signature for operator set registrations. EIP1271SignatureUtils.checkSignature_EIP1271( operator, @@ -115,7 +115,6 @@ contract AVSDirectory is // Loop over `operatorSetIds` array and register `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { - // Assert `operator` has not already been registered to `operatorSetIds[i]`. require( !isMember[msg.sender][operator][operatorSetIds[i]], @@ -234,7 +233,7 @@ contract AVSDirectory is // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. operatorSaltIsSpent[operator][operatorSignature.salt] = true; - + // Mutate `member.isLegacyOperator` to `true`. member.isLegacyOperator = true; From 71bc740e8e8eca5f7a4b10c3d0fafa2d34532219 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:11:58 -0400 Subject: [PATCH 14/43] feat: forced opset dereg --- src/contracts/core/AVSDirectory.sol | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index a0a0f85d9..70a1435a3 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -135,20 +135,40 @@ contract AVSDirectory is } /** - * @notice Called by AVSs or operators to remove an operator from an operator set. + * @notice Called by an operator to deregister from an operator set + * + * @param avs The address of the AVS to deregister the operator from. + * @param operatorSetIds The IDs of the operator sets. + * + * @dev msg.sender used is the operator + */ + function deregisterFromAVSOperatorSets( + address avs, + uint32[] calldata operatorSetIds + ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + _deregisterFromOperatorSets(avs, msg.sender, operatorSetIds); + } + + /** + * @notice Called by AVSs to remove an operator from an operator set. * * @param operator The address of the operator to be removed from the operator set. * @param operatorSetIds The IDs of the operator sets. * * @dev msg.sender is used as the AVS. - * @dev The operator must be registered for the msg.sender AVS and the given operator set. - * @dev If this call removes the operator from all operator sets for the msg.sender AVS, - * then an OperatorAVSRegistrationStatusUpdated event is emitted with a DEREGISTERED status. */ function deregisterOperatorFromOperatorSets( address operator, uint32[] calldata operatorSetIds ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + _deregisterFromOperatorSets(msg.sender, operator, operatorSetIds); + } + + function _deregisterFromOperatorSets( + address avs, + address operator, + uint32[] calldata operatorSetIds + ) internal { // Loop over `operatorSetIds` array and deregister `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { // Assert `operator` is registered for this iterations operator set. From 3af0eda69891249f60f6d54cf898e3046ff68bcb Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:12:37 -0400 Subject: [PATCH 15/43] chore: forge fmt src/contracts --- src/contracts/core/AVSDirectory.sol | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 70a1435a3..5693e6dac 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -136,14 +136,14 @@ contract AVSDirectory is /** * @notice Called by an operator to deregister from an operator set - * + * * @param avs The address of the AVS to deregister the operator from. * @param operatorSetIds The IDs of the operator sets. - * + * * @dev msg.sender used is the operator */ function deregisterFromAVSOperatorSets( - address avs, + address avs, uint32[] calldata operatorSetIds ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { _deregisterFromOperatorSets(avs, msg.sender, operatorSetIds); @@ -164,11 +164,7 @@ contract AVSDirectory is _deregisterFromOperatorSets(msg.sender, operator, operatorSetIds); } - function _deregisterFromOperatorSets( - address avs, - address operator, - uint32[] calldata operatorSetIds - ) internal { + function _deregisterFromOperatorSets(address avs, address operator, uint32[] calldata operatorSetIds) internal { // Loop over `operatorSetIds` array and deregister `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { // Assert `operator` is registered for this iterations operator set. From 02fff3d7eab12cad2df276dd57cabde0dbbd7848 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:28:57 -0400 Subject: [PATCH 16/43] test: forced opset dereg --- src/contracts/core/AVSDirectory.sol | 10 ++-- src/test/unit/AVSDirectoryUnit.t.sol | 71 +++++++++++++++++++++++----- 2 files changed, 63 insertions(+), 18 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 5693e6dac..5e75296ad 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -169,17 +169,17 @@ contract AVSDirectory is for (uint256 i = 0; i < operatorSetIds.length; ++i) { // Assert `operator` is registered for this iterations operator set. require( - isMember[msg.sender][operator][operatorSetIds[i]], + isMember[avs][operator][operatorSetIds[i]], "AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set" ); // Mutate `isMember` to `false`. - isMember[msg.sender][operator][operatorSetIds[i]] = false; + isMember[avs][operator][operatorSetIds[i]] = false; - emit OperatorRemovedFromOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); + emit OperatorRemovedFromOperatorSet(operator, OperatorSet({avs: avs, id: operatorSetIds[i]})); } - MemberInfo storage member = memberInfo[msg.sender][operator]; + MemberInfo storage member = memberInfo[avs][operator]; // The above assertion makes underflow logically impossible here. unchecked { @@ -189,7 +189,7 @@ contract AVSDirectory is // Set the operator as deregistered if no longer registered for any operator sets if (member.inTotalSets == 0) { member.isLegacyOperator = false; - emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, false); + emit OperatorAVSRegistrationStatusUpdated(operator, avs, false); } } diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 3a13606ab..58ba3e23c 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -170,6 +170,30 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { // filter out disallowed stakerOptOutWindowBlocks values cheats.assume(operatorDetails.stakerOptOutWindowBlocks <= delegationManager.MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()); } + + function _registerOperatorToOperatorSets( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) internal virtual { + expiry = bound(expiry, 1, type(uint256).max); + cheats.warp(0); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + } } contract AVSDirectoryUnitTests_initialize is AVSDirectoryUnitTests { @@ -426,32 +450,53 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni } } -contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirectoryUnitTests { +contract AVSDirectoryUnitTests_deregisterFromAVSOperatorSets is AVSDirectoryUnitTests { event OperatorRemovedFromOperatorSet(address operator, IAVSDirectory.OperatorSet operatorSet); - function _registerOperatorToOperatorSets( + function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + address operator = cheats.addr(operatorPk); + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + cheats.prank(operator); + cheats.expectRevert("AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set"); + avsDirectory.deregisterFromAVSOperatorSets(address(this), oids); + } + + function testFuzz_Correctness( uint256 operatorPk, uint32 operatorSetId, bytes32 salt, uint256 expiry - ) internal virtual { - expiry = bound(expiry, 1, type(uint256).max); - cheats.warp(0); + ) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + _registerOperatorToOperatorSets(operatorPk, operatorSetId, salt, expiry); + + address operator = cheats.addr(operatorPk); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; - address operator = cheats.addr(operatorPk); - (uint8 v, bytes32 r, bytes32 s) = cheats.sign( - operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) - ); + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); - _registerOperatorWithBaseDetails(operator); + cheats.expectEmit(true, true, true, false, address(avsDirectory)); + emit OperatorAVSRegistrationStatusUpdated(operator, address(this), true); - avsDirectory.registerOperatorToOperatorSets( - operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) - ); + cheats.prank(operator); + avsDirectory.deregisterFromAVSOperatorSets(address(this), oids); + + assertEq(avsDirectory.isMember(address(this), operator, operatorSetId), false); + (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); + assertEq(inTotalSets, 0); + assertEq(isLegacyOperator, false); } +} + +contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirectoryUnitTests { + event OperatorRemovedFromOperatorSet(address operator, IAVSDirectory.OperatorSet operatorSet); function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); From 776611d288cdc76f619cf2ebaa291da1be5e35eb Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Fri, 12 Jul 2024 11:34:29 -0400 Subject: [PATCH 17/43] refactor: remove OperatorSet struct --- src/contracts/core/AVSDirectory.sol | 4 ++-- src/contracts/interfaces/IAVSDirectory.sol | 9 ++------- src/test/unit/AVSDirectoryUnit.t.sol | 14 +++++++------- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 5e75296ad..dd0db49e0 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -124,7 +124,7 @@ contract AVSDirectory is // Mutate `isMember` to `true`. isMember[msg.sender][operator][operatorSetIds[i]] = true; - emit OperatorAddedToOperatorSet(operator, OperatorSet({avs: msg.sender, id: operatorSetIds[i]})); + emit OperatorAddedToOperatorSet(operator, msg.sender, operatorSetIds[i]); } // Increase `member.inTotalSets` by `operatorSetIds.length`. @@ -176,7 +176,7 @@ contract AVSDirectory is // Mutate `isMember` to `false`. isMember[avs][operator][operatorSetIds[i]] = false; - emit OperatorRemovedFromOperatorSet(operator, OperatorSet({avs: avs, id: operatorSetIds[i]})); + emit OperatorRemovedFromOperatorSet(operator, avs, operatorSetIds[i]); } MemberInfo storage member = memberInfo[avs][operator]; diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index f4b4b41e1..3b3e8d092 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -9,11 +9,6 @@ interface IAVSDirectory is ISignatureUtils { bool isLegacyOperator; } - struct OperatorSet { - address avs; - uint32 id; - } - /** * @notice Emitted when an operator's registration status with an AVS is updated. * Specifically, when an operator enters its first operator set for an AVS, or @@ -22,10 +17,10 @@ interface IAVSDirectory is ISignatureUtils { event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator); /// @notice Emitted when an operator is added to an operator set. - event OperatorAddedToOperatorSet(address operator, OperatorSet operatorSet); + event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId); /// @notice Emitted when an operator is removed from an operator set. - event OperatorRemovedFromOperatorSet(address operator, OperatorSet operatorSet); + event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId); /// @notice Emitted when an AVS updates their metadata URI (Uniform Resource Identifier). /// @dev The URI is never stored; it is simply emitted through an event for off-chain indexing. diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 58ba3e23c..77b9148e0 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -224,7 +224,7 @@ contract AVSDirectoryUnitTests_domainSeparator is AVSDirectoryUnitTests { } contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUnitTests { - event OperatorAddedToOperatorSet(address operator, IAVSDirectory.OperatorSet operatorSet); + event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId); function testFuzz_revert_SignatureIsExpired( address operator, @@ -395,7 +395,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni for (uint256 i; i < oids.length; ++i) { cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), oids[i])); + emit OperatorAddedToOperatorSet(operator, address(this), oids[i]); } avsDirectory.registerOperatorToOperatorSets( @@ -437,7 +437,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni emit OperatorAVSRegistrationStatusUpdated(operator, address(this), true); cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); + emit OperatorAddedToOperatorSet(operator, address(this), operatorSetId); avsDirectory.registerOperatorToOperatorSets( operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) ); @@ -451,7 +451,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni } contract AVSDirectoryUnitTests_deregisterFromAVSOperatorSets is AVSDirectoryUnitTests { - event OperatorRemovedFromOperatorSet(address operator, IAVSDirectory.OperatorSet operatorSet); + event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId); function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); @@ -480,7 +480,7 @@ contract AVSDirectoryUnitTests_deregisterFromAVSOperatorSets is AVSDirectoryUnit oids[0] = operatorSetId; cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); + emit OperatorRemovedFromOperatorSet(operator, address(this), operatorSetId); cheats.expectEmit(true, true, true, false, address(avsDirectory)); emit OperatorAVSRegistrationStatusUpdated(operator, address(this), true); @@ -496,7 +496,7 @@ contract AVSDirectoryUnitTests_deregisterFromAVSOperatorSets is AVSDirectoryUnit } contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirectoryUnitTests { - event OperatorRemovedFromOperatorSet(address operator, IAVSDirectory.OperatorSet operatorSet); + event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId); function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); @@ -524,7 +524,7 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector oids[0] = operatorSetId; cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); + emit OperatorRemovedFromOperatorSet(operator, address(this), operatorSetId); cheats.expectEmit(true, true, true, false, address(avsDirectory)); emit OperatorAVSRegistrationStatusUpdated(operator, address(this), true); From 819fea85f80932c7765e721742ce478256a2f9b1 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Mon, 15 Jul 2024 17:51:45 -0400 Subject: [PATCH 18/43] feat: add missing interface fns --- src/contracts/core/AVSDirectory.sol | 19 ++--- src/contracts/interfaces/IAVSDirectory.sol | 83 ++++++++++++++-------- 2 files changed, 65 insertions(+), 37 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index dd0db49e0..7e94fcc2d 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -73,7 +73,7 @@ contract AVSDirectory is address operator, uint32[] calldata operatorSetIds, ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature - ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { // Assert operator's signature has not expired. require( operatorSignature.expiry >= block.timestamp, @@ -145,7 +145,7 @@ contract AVSDirectory is function deregisterFromAVSOperatorSets( address avs, uint32[] calldata operatorSetIds - ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { _deregisterFromOperatorSets(avs, msg.sender, operatorSetIds); } @@ -160,7 +160,7 @@ contract AVSDirectory is function deregisterOperatorFromOperatorSets( address operator, uint32[] calldata operatorSetIds - ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { _deregisterFromOperatorSets(msg.sender, operator, operatorSetIds); } @@ -205,7 +205,7 @@ contract AVSDirectory is function registerOperatorToAVS( address operator, ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature - ) external onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { // Assert `operatorSignature.expiry` has not elapsed. require( operatorSignature.expiry >= block.timestamp, @@ -265,6 +265,7 @@ contract AVSDirectory is */ function deregisterOperatorFromAVS(address operator) external + override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { MemberInfo storage member = memberInfo[msg.sender][operator]; @@ -285,7 +286,7 @@ contract AVSDirectory is * * @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event. */ - function updateAVSMetadataURI(string calldata metadataURI) external { + function updateAVSMetadataURI(string calldata metadataURI) external override { emit AVSMetadataURIUpdated(msg.sender, metadataURI); } @@ -294,7 +295,7 @@ contract AVSDirectory is * * @param salt A unique and single use value associated with the approver signature. */ - function cancelSalt(bytes32 salt) external { + function cancelSalt(bytes32 salt) external override { // Mutate `operatorSaltIsSpent` to `true` to prevent future spending. operatorSaltIsSpent[msg.sender][salt] = true; } @@ -318,7 +319,7 @@ contract AVSDirectory is address avs, bytes32 salt, uint256 expiry - ) public view returns (bytes32) { + ) public view override returns (bytes32) { return _calculateDigestHash(keccak256(abi.encode(OPERATOR_AVS_REGISTRATION_TYPEHASH, operator, avs, salt, expiry))); } @@ -336,7 +337,7 @@ contract AVSDirectory is uint32[] calldata operatorSetIds, bytes32 salt, uint256 expiry - ) public view returns (bytes32) { + ) public view override returns (bytes32) { return _calculateDigestHash( keccak256(abi.encode(OPERATOR_SET_REGISTRATION_TYPEHASH, avs, operatorSetIds, salt, expiry)) ); @@ -344,7 +345,7 @@ contract AVSDirectory is /// @notice Getter function for the current EIP-712 domain separator for this contract. /// @dev The domain separator will change in the event of a fork that changes the ChainID. - function domainSeparator() public view returns (bytes32) { + function domainSeparator() public view override returns (bytes32) { return _calculateDomainSeparator(); } diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index 3b3e8d092..7687aa59e 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -27,34 +27,17 @@ interface IAVSDirectory is ISignatureUtils { event AVSMetadataURIUpdated(address indexed avs, string metadataURI); /** - * @notice Called by the AVS's service manager contract to register an operator with the AVS. * - * @param operator The address of the operator to register. - * @param operatorSignature The signature, salt, and expiry of the operator's signature. + * EXTERNAL FUNCTIONS * - * @dev msg.sender must be the AVS. - * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. */ - function registerOperatorToAVS( - address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature - ) external; - - /** - * @notice Called by an AVS to deregister an operator from the AVS. - * - * @param operator The address of the operator to deregister. - * - * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. - */ - function deregisterOperatorFromAVS(address operator) external; /** * @notice Called by AVSs to add an operator to an operator set. * * @param operator The address of the operator to be added to the operator set. * @param operatorSetIds The IDs of the operator sets. - * @param signature The signature of the operator on their intent to register. + * @param operatorSignature The signature of the operator on their intent to register. * * @dev msg.sender is used as the AVS. * @dev The operator must not have a pending deregistration from the operator set. @@ -65,23 +48,51 @@ interface IAVSDirectory is ISignatureUtils { function registerOperatorToOperatorSets( address operator, uint32[] calldata operatorSetIds, - ISignatureUtils.SignatureWithSaltAndExpiry memory signature + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature ) external; /** - * @notice Called by AVSs or operators to remove an operator from an operator set. + * @notice Called by an operator to deregister from an operator set + * + * @param avs The address of the AVS to deregister the operator from. + * @param operatorSetIds The IDs of the operator sets. + * + * @dev msg.sender used is the operator + */ + function deregisterFromAVSOperatorSets(address avs, uint32[] calldata operatorSetIds) external; + + /** + * @notice Called by AVSs to remove an operator from an operator set. * * @param operator The address of the operator to be removed from the operator set. * @param operatorSetIds The IDs of the operator sets. * * @dev msg.sender is used as the AVS. - * @dev The operator must be registered for the msg.sender AVS and the given operator set. - * @dev If this removes the operator from all operator sets for the msg.sender AVS, - * then an OperatorAVSRegistrationStatusUpdated event is emitted with a DEREGISTERED status. */ function deregisterOperatorFromOperatorSets(address operator, uint32[] calldata operatorSetIds) external; - // VIEW + /** + * @notice Called by the AVS's service manager contract to register an operator with the AVS. + * + * @param operator The address of the operator to register. + * @param operatorSignature The signature, salt, and expiry of the operator's signature. + * + * @dev msg.sender must be the AVS. + * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. + */ + function registerOperatorToAVS( + address operator, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external; + + /** + * @notice Called by an AVS to deregister an operator from the AVS. + * + * @param operator The address of the operator to deregister. + * + * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. + */ + function deregisterOperatorFromAVS(address operator) external; /** * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. @@ -93,12 +104,24 @@ interface IAVSDirectory is ISignatureUtils { function updateAVSMetadataURI(string calldata metadataURI) external; /** - * @notice Returns whether the salt has already been used by the operator or not. + * @notice Called by an operator to cancel a salt that has been used to register with an AVS. + * + * @param salt A unique and single use value associated with the approver signature. + */ + function cancelSalt(bytes32 salt) external; + + /** + * + * VIEW FUNCTIONS * - * @dev The salt is used in the `registerOperatorToAVS` function. */ + function operatorSaltIsSpent(address operator, bytes32 salt) external view returns (bool); + // function memberInfo(address avs, address operator) external view returns (MemberInfo memory); + + function isMember(address avs, address operator, uint32 operatorSetId) external view returns (bool); + /** * @notice Calculates the digest hash to be signed by an operator to register with an AVS. * @@ -124,11 +147,15 @@ interface IAVSDirectory is ISignatureUtils { */ function calculateOperatorSetRegistrationDigestHash( address avs, - uint32[] memory operatorSetIds, + uint32[] calldata operatorSetIds, bytes32 salt, uint256 expiry ) external view returns (bytes32); + /// @notice Getter function for the current EIP-712 domain separator for this contract. + /// @dev The domain separator will change in the event of a fork that changes the ChainID. + function domainSeparator() external view returns (bytes32); + /// @notice The EIP-712 typehash for the Registration struct used by the contract. function OPERATOR_AVS_REGISTRATION_TYPEHASH() external view returns (bytes32); From c246585cbf4533289ca60a56071a6008c7d1c039 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Mon, 15 Jul 2024 17:58:13 -0400 Subject: [PATCH 19/43] feat: add missing interface fns --- src/contracts/interfaces/IAVSDirectory.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index 7687aa59e..c0e7ffcb2 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -118,7 +118,7 @@ interface IAVSDirectory is ISignatureUtils { function operatorSaltIsSpent(address operator, bytes32 salt) external view returns (bool); - // function memberInfo(address avs, address operator) external view returns (MemberInfo memory); + function memberInfo(address avs, address operator) external view returns (uint248 inTotalSets, bool isLegacyOperator); function isMember(address avs, address operator, uint32 operatorSetId) external view returns (bool); From 7d4c2cf82ed9cb2bc13f531fc3ac3f9536102a83 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:19:57 -0400 Subject: [PATCH 20/43] feat: operator set initialization --- src/contracts/core/AVSDirectory.sol | 20 ++++++++++++++++++++ src/contracts/core/AVSDirectoryStorage.sol | 2 ++ src/contracts/interfaces/IAVSDirectory.sol | 9 +++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 7e94fcc2d..4f09c15fc 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -56,6 +56,21 @@ contract AVSDirectory is * */ + /** + * @notice Initializes an operator set for an AVS. + * + * @param operatorSetId The ID of the operator set to initialize. + * + * @dev msg.sender must be the AVS. + */ + function createOperatorSet(uint32 operatorSetId) external { + require( + !isOperatorSet[msg.sender][operatorSetId], "AVSDirectory._createOperatorSet: operator set already exists" + ); + isOperatorSet[msg.sender][operatorSetId] = true; + emit OperatorSetCreated(msg.sender, operatorSetId); + } + /** * @notice Called by AVSs to add an operator to an operator set. * @@ -115,6 +130,11 @@ contract AVSDirectory is // Loop over `operatorSetIds` array and register `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { + require( + isOperatorSet[msg.sender][operatorSetIds[i]], + "AVSDirectory.registerOperatorToOperatorSets: invalid operator set" + ); + // Assert `operator` has not already been registered to `operatorSetIds[i]`. require( !isMember[msg.sender][operator][operatorSetIds[i]], diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index b2cb12ee6..aa85ff7e5 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -29,6 +29,8 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { mapping(address => mapping(bytes32 => bool)) public operatorSaltIsSpent; + mapping(address => mapping(uint32 => bool)) public isOperatorSet; + mapping(address => mapping(address => MemberInfo)) public memberInfo; mapping(address => mapping(address => mapping(uint32 => bool))) public isMember; diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index c0e7ffcb2..265c3152f 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -9,6 +9,9 @@ interface IAVSDirectory is ISignatureUtils { bool isLegacyOperator; } + /// @notice Emitted when an operator set is created by an AVS. + event OperatorSetCreated(address indexed avs, uint32 operatorSetId); + /** * @notice Emitted when an operator's registration status with an AVS is updated. * Specifically, when an operator enters its first operator set for an AVS, or @@ -115,10 +118,12 @@ interface IAVSDirectory is ISignatureUtils { * VIEW FUNCTIONS * */ - function operatorSaltIsSpent(address operator, bytes32 salt) external view returns (bool); - function memberInfo(address avs, address operator) external view returns (uint248 inTotalSets, bool isLegacyOperator); + function memberInfo( + address avs, + address operator + ) external view returns (uint248 inTotalSets, bool isLegacyOperator); function isMember(address avs, address operator, uint32 operatorSetId) external view returns (bool); From 555bf98c8602474f83d231bca6546f1baea0d4f5 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:26:34 -0400 Subject: [PATCH 21/43] test: operator set initialization --- src/test/unit/AVSDirectoryUnit.t.sol | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 77b9148e0..8140c4850 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -235,6 +235,8 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni expiry = bound(expiry, 0, type(uint256).max - 1); cheats.warp(type(uint256).max); + avsDirectory.createOperatorSet(operatorSetId); + _registerOperatorWithBaseDetails(operator); uint32[] memory oids = new uint32[](1); @@ -257,6 +259,8 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni cheats.warp(0); + avsDirectory.createOperatorSet(operatorSetId); + uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -292,6 +296,8 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni expiry = bound(expiry, 1, type(uint256).max); cheats.warp(0); + avsDirectory.createOperatorSet(operatorSetId); + uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -313,6 +319,8 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni cheats.warp(0); + avsDirectory.createOperatorSet(operatorSetId); + uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -348,6 +356,8 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni cheats.warp(0); + avsDirectory.createOperatorSet(operatorSetId); + uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -381,6 +391,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni uint32[] memory oids = new uint32[](operatorSetIdsLength); for (uint256 i; i < oids.length; ++i) { oids[i] = uint32(uint256(keccak256(abi.encodePacked(i))) % type(uint32).max); + avsDirectory.createOperatorSet(oids[i]); } address operator = cheats.addr(operatorPk); @@ -423,6 +434,8 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni cheats.warp(0); + avsDirectory.createOperatorSet(operatorSetId); + uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -460,6 +473,8 @@ contract AVSDirectoryUnitTests_deregisterFromAVSOperatorSets is AVSDirectoryUnit uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; + avsDirectory.createOperatorSet(operatorSetId); + cheats.prank(operator); cheats.expectRevert("AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set"); avsDirectory.deregisterFromAVSOperatorSets(address(this), oids); @@ -473,6 +488,8 @@ contract AVSDirectoryUnitTests_deregisterFromAVSOperatorSets is AVSDirectoryUnit ) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + avsDirectory.createOperatorSet(operatorSetId); + _registerOperatorToOperatorSets(operatorPk, operatorSetId, salt, expiry); address operator = cheats.addr(operatorPk); @@ -501,6 +518,8 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + avsDirectory.createOperatorSet(operatorSetId); + address operator = cheats.addr(operatorPk); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -517,6 +536,8 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector ) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + avsDirectory.createOperatorSet(operatorSetId); + _registerOperatorToOperatorSets(operatorPk, operatorSetId, salt, expiry); address operator = cheats.addr(operatorPk); From 7d1d1e72ec60d96adbcaafdfd8a8b5dbf0cc562f Mon Sep 17 00:00:00 2001 From: Yash Patil <40046473+ypatil12@users.noreply.github.com> Date: Mon, 22 Jul 2024 08:43:01 -0400 Subject: [PATCH 22/43] feat: operator set migration; completely separate legacy and opset reg (#636) * feat: bring back full storage; segregate events * feat: make operator set creation w/arrays; update interface * fix: update natspec * feat: update force dereg func * chore: fmt * feat: operator set migration (#637) * feat: add migration * test: add unit tests for migration * chore: format * fix: check operator set avs in parent func * fix: compilation * chore: format * feat: bring back opertor set struct (#639) --- src/contracts/core/AVSDirectory.sol | 319 +++++++---- src/contracts/core/AVSDirectoryStorage.sol | 15 +- src/contracts/interfaces/IAVSDirectory.sol | 122 ++++- src/test/events/IAVSDirectoryEvents.sol | 24 +- src/test/unit/AVSDirectoryUnit.t.sol | 610 ++++++++++++++++++--- 5 files changed, 879 insertions(+), 211 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 4f09c15fc..6e3b509c1 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -52,27 +52,82 @@ contract AVSDirectory is /** * - * EXTERNAL FUNCTIONS + * EXTERNAL FUNCTIONS * */ /** - * @notice Initializes an operator set for an AVS. + * @notice Called by an AVS to create a list of new operatorSets. * - * @param operatorSetId The ID of the operator set to initialize. + * @param operatorSetIds The IDs of the operator set to initialize. * * @dev msg.sender must be the AVS. + * @dev The AVS may create operator sets before it becomes an operator set AVS. */ - function createOperatorSet(uint32 operatorSetId) external { + function createOperatorSets(uint32[] calldata operatorSetIds) external { + for (uint256 i = 0; i < operatorSetIds.length; ++i) { + require( + !isOperatorSet[msg.sender][operatorSetIds[i]], + "AVSDirectory.createOperatorSet: operator set already exists" + ); + isOperatorSet[msg.sender][operatorSetIds[i]] = true; + emit OperatorSetCreated(OperatorSet({avs: msg.sender, operatorSetId: operatorSetIds[i]})); + } + } + + /** + * @notice Sets the AVS as an operator set AVS, preventing legacy M2 operator registrations. + * + * @dev msg.sender must be the AVS. + */ + function becomeOperatorSetAVS() external { + require(!isOperatorSetAVS[msg.sender], "AVSDirectory.becomeOperatorSetAVS: already an operator set AVS"); + isOperatorSetAVS[msg.sender] = true; + emit AVSMigratedToOperatorSets(msg.sender); + } + + /** + * @notice Called by an AVS to migrate operators that have a legacy M2 registration to operator sets. + * + * @param operators The list of operators to migrate + * @param operatorSetIds The list of operatorSets to migrate the operators to + * + * @dev The msg.sender used is the AVS + * @dev The operator can only be migrated at most once per AVS + * @dev The AVS can no longer register operators via the legacy M2 registration path once it begins migration + * @dev The operator is deregistered from the M2 legacy AVS once migrated + */ + function migrateOperatorsToOperatorSets( + address[] calldata operators, + uint32[][] calldata operatorSetIds + ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + // Assert that the AVS is an operator set AVS. require( - !isOperatorSet[msg.sender][operatorSetId], "AVSDirectory._createOperatorSet: operator set already exists" + isOperatorSetAVS[msg.sender], "AVSDirectory.migrateOperatorsToOperatorSets: AVS is not an operator set AVS" ); - isOperatorSet[msg.sender][operatorSetId] = true; - emit OperatorSetCreated(msg.sender, operatorSetId); + + for (uint256 i = 0; i < operators.length; i++) { + // Assert that the operator is registered & has not been migrated. + require( + avsOperatorStatus[msg.sender][operators[i]] == OperatorAVSRegistrationStatus.REGISTERED, + "AVSDirectory.migrateOperatorsToOperatorSets: operator already migrated or not a legacy registered operator" + ); + + // Migrate operator to operator sets. + _registerToOperatorSets(msg.sender, operators[i], operatorSetIds[i]); + + // Deregister operator from AVS - this prevents the operator from being migrated again since + // the AVS can no longer use the legacy M2 registration path + avsOperatorStatus[msg.sender][operators[i]] = OperatorAVSRegistrationStatus.UNREGISTERED; + emit OperatorAVSRegistrationStatusUpdated( + operators[i], msg.sender, OperatorAVSRegistrationStatus.UNREGISTERED + ); + emit OperatorMigratedToOperatorSets(operators[i], msg.sender, operatorSetIds[i]); + } } /** - * @notice Called by AVSs to add an operator to an operator set. + * @notice Called by AVSs to add an operator to a list of operatorSets. * * @param operator The address of the operator to be added to the operator set. * @param operatorSetIds The IDs of the operator sets. @@ -80,9 +135,6 @@ contract AVSDirectory is * * @dev msg.sender is used as the AVS. * @dev The operator must not have a pending deregistration from the operator set. - * @dev If this is the first operator set in the AVS that the operator is - * registering for, a OperatorAVSRegistrationStatusUpdated event is emitted with - * a REGISTERED status. */ function registerOperatorToOperatorSets( address operator, @@ -94,16 +146,20 @@ contract AVSDirectory is operatorSignature.expiry >= block.timestamp, "AVSDirectory.registerOperatorToOperatorSets: operator signature expired" ); - // Assert operator's signature `salt` has not already been spent. - require( - !operatorSaltIsSpent[operator][operatorSignature.salt], - "AVSDirectory.registerOperatorToOperatorSets: salt already spent" - ); // Assert `operator` is actually an operator. require( delegation.isOperator(operator), "AVSDirectory.registerOperatorToOperatorSets: operator not registered to EigenLayer yet" ); + // Assert that the AVS is an operator set AVS. + require( + isOperatorSetAVS[msg.sender], "AVSDirectory.registerOperatorToOperatorSets: AVS is not an operator set AVS" + ); + // Assert operator's signature `salt` has not already been spent. + require( + !operatorSaltIsSpent[operator][operatorSignature.salt], + "AVSDirectory.registerOperatorToOperatorSets: salt already spent" + ); // Assert that `operatorSignature.signature` is a valid signature for operator set registrations. EIP1271SignatureUtils.checkSignature_EIP1271( @@ -120,53 +176,56 @@ contract AVSDirectory is // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. operatorSaltIsSpent[operator][operatorSignature.salt] = true; - MemberInfo storage member = memberInfo[msg.sender][operator]; - - // Register `operator` if not already registered. - if (!member.isLegacyOperator) { - member.isLegacyOperator = true; - emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, true); - } - - // Loop over `operatorSetIds` array and register `operator` for each item. - for (uint256 i = 0; i < operatorSetIds.length; ++i) { - require( - isOperatorSet[msg.sender][operatorSetIds[i]], - "AVSDirectory.registerOperatorToOperatorSets: invalid operator set" - ); - - // Assert `operator` has not already been registered to `operatorSetIds[i]`. - require( - !isMember[msg.sender][operator][operatorSetIds[i]], - "AVSDirectory.registerOperatorToOperatorSets: operator already registered to operator set" - ); - - // Mutate `isMember` to `true`. - isMember[msg.sender][operator][operatorSetIds[i]] = true; - - emit OperatorAddedToOperatorSet(operator, msg.sender, operatorSetIds[i]); - } - - // Increase `member.inTotalSets` by `operatorSetIds.length`. - // You would have to add the operator to 2**256-2 operator sets before overflow is possible here. - unchecked { - member.inTotalSets += uint248(operatorSetIds.length); - } + _registerToOperatorSets(msg.sender, operator, operatorSetIds); } /** * @notice Called by an operator to deregister from an operator set * + * @param operator The operator to deregister from the operatorSets. * @param avs The address of the AVS to deregister the operator from. * @param operatorSetIds The IDs of the operator sets. + * @param operatorSignature the signature of the operator on their intent to deregister or empty if the operator itself is calling * - * @dev msg.sender used is the operator + * @dev if the operatorSignature is empty, the caller must be the operator + * @dev this will likely only be called in case the AVS contracts are in a state that prevents operators from deregistering */ - function deregisterFromAVSOperatorSets( + function forceDeregisterFromOperatorSets( + address operator, address avs, - uint32[] calldata operatorSetIds + uint32[] calldata operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { - _deregisterFromOperatorSets(avs, msg.sender, operatorSetIds); + if (operatorSignature.signature.length == 0) { + require(msg.sender == operator, "AVSDirectory.forceDeregisterFromOperatorSets: caller must be operator"); + } else { + // Assert operator's signature has not expired. + require( + operatorSignature.expiry >= block.timestamp, + "AVSDirectory.forceDeregisterFromOperatorSets: operator signature expired" + ); + // Assert operator's signature `salt` has not already been spent. + require( + !operatorSaltIsSpent[operator][operatorSignature.salt], + "AVSDirectory.forceDeregisterFromOperatorSets: salt already spent" + ); + + // Assert that `operatorSignature.signature` is a valid signature for operator set deregistrations. + EIP1271SignatureUtils.checkSignature_EIP1271( + operator, + calculateOperatorSetForceDeregistrationTypehash({ + avs: avs, + operatorSetIds: operatorSetIds, + salt: operatorSignature.salt, + expiry: operatorSignature.expiry + }), + operatorSignature.signature + ); + + // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. + operatorSaltIsSpent[operator][operatorSignature.salt] = true; + } + _deregisterFromOperatorSets(avs, operator, operatorSetIds); } /** @@ -184,35 +243,33 @@ contract AVSDirectory is _deregisterFromOperatorSets(msg.sender, operator, operatorSetIds); } - function _deregisterFromOperatorSets(address avs, address operator, uint32[] calldata operatorSetIds) internal { - // Loop over `operatorSetIds` array and deregister `operator` for each item. - for (uint256 i = 0; i < operatorSetIds.length; ++i) { - // Assert `operator` is registered for this iterations operator set. - require( - isMember[avs][operator][operatorSetIds[i]], - "AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set" - ); - - // Mutate `isMember` to `false`. - isMember[avs][operator][operatorSetIds[i]] = false; - - emit OperatorRemovedFromOperatorSet(operator, avs, operatorSetIds[i]); - } - - MemberInfo storage member = memberInfo[avs][operator]; - - // The above assertion makes underflow logically impossible here. - unchecked { - member.inTotalSets -= uint248(operatorSetIds.length); - } + /** + * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. + * + * @param metadataURI The URI for metadata associated with an AVS. + * + * @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event. + */ + function updateAVSMetadataURI(string calldata metadataURI) external override { + emit AVSMetadataURIUpdated(msg.sender, metadataURI); + } - // Set the operator as deregistered if no longer registered for any operator sets - if (member.inTotalSets == 0) { - member.isLegacyOperator = false; - emit OperatorAVSRegistrationStatusUpdated(operator, avs, false); - } + /** + * @notice Called by an operator to cancel a salt that has been used to register with an AVS. + * + * @param salt A unique and single use value associated with the approver signature. + */ + function cancelSalt(bytes32 salt) external override { + // Mutate `operatorSaltIsSpent` to `true` to prevent future spending. + operatorSaltIsSpent[msg.sender][salt] = true; } + /** + * + * LEGACY EXTERNAL FUNCTIONS - SUPPORT DEPRECATED BY SLASHING RELEASE + * + */ + /** * @notice Called by the AVS's service manager contract to register an operator with the AVS. * @@ -232,15 +289,13 @@ contract AVSDirectory is "AVSDirectory.registerOperatorToAVS: operator signature expired" ); - MemberInfo storage member = memberInfo[msg.sender][operator]; - - // Assert `operator` is not already registered to the (caller) avs. - require(!member.isLegacyOperator, "AVSDirectory.registerOperatorToAVS: operator already registered"); + // Assert that the AVS is not an operator set AVS. + require(!isOperatorSetAVS[msg.sender], "AVSDirectory.registerOperatorToAVS: AVS is an operator set AVS"); - // Assert `operator` is not actively registered to any operator sets. + // Assert that the `operator` is not actively registered to the AVS. require( - member.inTotalSets == 0, - "AVSDirectory.registerOperatorToAVS: operator set AVS cannot register operators with legacy method" + avsOperatorStatus[msg.sender][operator] != OperatorAVSRegistrationStatus.REGISTERED, + "AVSDirectory.registerOperatorToAVS: operator already registered" ); // Assert `operator` has not already spent `operatorSignature.salt`. @@ -270,10 +325,10 @@ contract AVSDirectory is // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. operatorSaltIsSpent[operator][operatorSignature.salt] = true; - // Mutate `member.isLegacyOperator` to `true`. - member.isLegacyOperator = true; + // Set the operator as registered + avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.REGISTERED; - emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, true); + emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.REGISTERED); } /** @@ -288,36 +343,71 @@ contract AVSDirectory is override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { - MemberInfo storage member = memberInfo[msg.sender][operator]; - - // Assert `member.isLegacyOperator` is actively registered to the (caller) avs. - require(member.isLegacyOperator, "AVSDirectory.deregisterOperatorFromAVS: operator not registered"); + require( + avsOperatorStatus[msg.sender][operator] == OperatorAVSRegistrationStatus.REGISTERED, + "AVSDirectory.deregisterOperatorFromAVS: operator not registered" + ); - // Mutate `member.isLegacyOperator` to `false`. - member.isLegacyOperator = false; + // Set the operator as deregistered + avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.UNREGISTERED; - emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, false); + emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.UNREGISTERED); } /** - * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. * - * @param metadataURI The URI for metadata associated with an AVS. + * INTERNAL FUNCTIONS * - * @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event. */ - function updateAVSMetadataURI(string calldata metadataURI) external override { - emit AVSMetadataURIUpdated(msg.sender, metadataURI); + + /** + * @notice Helper function used by migration & registration functions to register an operator to operator sets. + * @param avs The AVS that the operator is registering to. + * @param operator The operator to register. + * @param operatorSetIds The IDs of the operator sets. + */ + function _registerToOperatorSets(address avs, address operator, uint32[] calldata operatorSetIds) internal { + // Loop over `operatorSetIds` array and register `operator` for each item. + for (uint256 i = 0; i < operatorSetIds.length; ++i) { + require( + isOperatorSet[avs][operatorSetIds[i]], + "AVSDirectory._registerOperatorToOperatorSets: invalid operator set" + ); + + // Assert `operator` has not already been registered to `operatorSetIds[i]`. + require( + !isMember[avs][operator][operatorSetIds[i]], + "AVSDirectory._registerOperatorToOperatorSets: operator already registered to operator set" + ); + + // Mutate `isMember` to `true`. + isMember[avs][operator][operatorSetIds[i]] = true; + + emit OperatorAddedToOperatorSet(operator, OperatorSet({avs: avs, operatorSetId: operatorSetIds[i]})); + } } /** - * @notice Called by an operator to cancel a salt that has been used to register with an AVS. + * @notice Internal function to deregister an operator from an operator set. * - * @param salt A unique and single use value associated with the approver signature. + * @param avs The AVS that the operator is deregistering from. + * @param operator The operator to deregister. + * @param operatorSetIds The IDs of the operator sets. */ - function cancelSalt(bytes32 salt) external override { - // Mutate `operatorSaltIsSpent` to `true` to prevent future spending. - operatorSaltIsSpent[msg.sender][salt] = true; + function _deregisterFromOperatorSets(address avs, address operator, uint32[] calldata operatorSetIds) internal { + // Loop over `operatorSetIds` array and deregister `operator` for each item. + for (uint256 i = 0; i < operatorSetIds.length; ++i) { + // Assert `operator` is registered for this iterations operator set. + require( + isMember[avs][operator][operatorSetIds[i]], + "AVSDirectory._deregisterOperatorFromOperatorSet: operator not registered for operator set" + ); + + // Mutate `isMember` to `false`. + isMember[avs][operator][operatorSetIds[i]] = false; + + emit OperatorRemovedFromOperatorSet(operator, OperatorSet({avs: avs, operatorSetId: operatorSetIds[i]})); + } } /** @@ -363,6 +453,25 @@ contract AVSDirectory is ); } + /** + * @notice Calculates the digest hash to be signed by an operator to force deregister from an operator set. + * + * @param avs The AVS that operator is deregistering from. + * @param operatorSetIds An array of operator set IDs the operator is deregistering from. + * @param salt A unique and single use value associated with the approver signature. + * @param expiry Time after which the approver's signature becomes invalid. + */ + function calculateOperatorSetForceDeregistrationTypehash( + address avs, + uint32[] calldata operatorSetIds, + bytes32 salt, + uint256 expiry + ) public view returns (bytes32) { + return _calculateDigestHash( + keccak256(abi.encode(OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH, avs, operatorSetIds, salt, expiry)) + ); + } + /// @notice Getter function for the current EIP-712 domain separator for this contract. /// @dev The domain separator will change in the event of a fork that changes the ChainID. function domainSeparator() public view override returns (bytes32) { diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index aa85ff7e5..710b55442 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -17,6 +17,10 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { bytes32 public constant OPERATOR_SET_REGISTRATION_TYPEHASH = keccak256("OperatorSetRegistration(address avs,uint32[] operatorSetIds,bytes32 salt,uint256 expiry)"); + /// @notice The EIP-712 typehash for the `OperatorSetMembership` struct used by the contract + bytes32 public constant OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH = + keccak256("OperatorSetForceDeregistration(address avs,uint32[] operatorSetIds,bytes32 salt,uint256 expiry)"); + /// @notice The DelegationManager contract for EigenLayer IDelegationManager public immutable delegation; @@ -27,12 +31,19 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { */ bytes32 internal _DOMAIN_SEPARATOR; + /// @notice Mapping: avs => operator => OperatorAVSRegistrationStatus struct + mapping(address => mapping(address => OperatorAVSRegistrationStatus)) public avsOperatorStatus; + + /// @notice Mapping: operator => salt => whether the salt has been used mapping(address => mapping(bytes32 => bool)) public operatorSaltIsSpent; - mapping(address => mapping(uint32 => bool)) public isOperatorSet; + /// @notice Mapping: avs => whether it is a an operator set AVS + mapping(address => bool) public isOperatorSetAVS; - mapping(address => mapping(address => MemberInfo)) public memberInfo; + /// @notice Mapping: avs => operatorSetId => whether the operatorSet exists + mapping(address => mapping(uint32 => bool)) public isOperatorSet; + /// @notice Mapping: avs = operator => operatorSetId => whether the operator is a member of the operatorSet mapping(address => mapping(address => mapping(uint32 => bool))) public isMember; constructor(IDelegationManager _delegation) { diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index 265c3152f..5e91d1d7b 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -4,31 +4,47 @@ pragma solidity >=0.5.0; import "./ISignatureUtils.sol"; interface IAVSDirectory is ISignatureUtils { - struct MemberInfo { - uint248 inTotalSets; - bool isLegacyOperator; + /// @notice Enum representing the registration status of an operator with an AVS. + /// @notice Only used by legacy M2 AVSs that have not integrated with operatorSets. + enum OperatorAVSRegistrationStatus { + UNREGISTERED, // Operator not registered to AVS + REGISTERED // Operator registered to AVS + + } + + /// @notice Struct representing an operator set + struct OperatorSet { + address avs; + uint32 operatorSetId; } /// @notice Emitted when an operator set is created by an AVS. - event OperatorSetCreated(address indexed avs, uint32 operatorSetId); + event OperatorSetCreated(OperatorSet operatorSet); /** - * @notice Emitted when an operator's registration status with an AVS is updated. - * Specifically, when an operator enters its first operator set for an AVS, or - * when it is removed from the last operator set. + * @notice Emitted when an operator's registration status with an AVS id udpated + * @notice Only used by legacy M2 AVSs that have not integrated with operatorSets. */ - event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator); + event OperatorAVSRegistrationStatusUpdated( + address indexed operator, address indexed avs, OperatorAVSRegistrationStatus status + ); /// @notice Emitted when an operator is added to an operator set. - event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId); + event OperatorAddedToOperatorSet(address indexed operator, OperatorSet operatorSet); /// @notice Emitted when an operator is removed from an operator set. - event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId); + event OperatorRemovedFromOperatorSet(address indexed operator, OperatorSet operatorSet); /// @notice Emitted when an AVS updates their metadata URI (Uniform Resource Identifier). /// @dev The URI is never stored; it is simply emitted through an event for off-chain indexing. event AVSMetadataURIUpdated(address indexed avs, string metadataURI); + /// @notice Emitted when an AVS migrates to using operator sets. + event AVSMigratedToOperatorSets(address indexed avs); + + /// @notice Emitted when an operator is migrated from M2 registration to operator sets. + event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds); + /** * * EXTERNAL FUNCTIONS @@ -36,7 +52,40 @@ interface IAVSDirectory is ISignatureUtils { */ /** - * @notice Called by AVSs to add an operator to an operator set. + * @notice Called by an AVS to create a list of new operatorSets. + * + * @param operatorSetIds The IDs of the operator set to initialize. + * + * @dev msg.sender must be the AVS. + * @dev The AVS may create operator sets before it becomes an operator set AVS. + */ + function createOperatorSets(uint32[] calldata operatorSetIds) external; + + /** + * @notice Sets the AVS as an operator set AVS, preventing legacy M2 operator registrations. + * + * @dev msg.sender must be the AVS. + */ + function becomeOperatorSetAVS() external; + + /** + * @notice Called by an AVS to migrate operators that have a legacy M2 registration to operator sets. + * + * @param operators The list of operators to migrate + * @param operatorSetIds The list of operatorSets to migrate the operators to + * + * @dev The msg.sender used is the AVS + * @dev The operator can only be migrated at most once per AVS + * @dev The AVS can no longer register operators via the legacy M2 registration path once it begins migration + * @dev The operator is deregistered from the M2 legacy AVS once migrated + */ + function migrateOperatorsToOperatorSets( + address[] calldata operators, + uint32[][] calldata operatorSetIds + ) external; + + /** + * @notice Called by AVSs to add an operator to list of operatorSets. * * @param operator The address of the operator to be added to the operator set. * @param operatorSetIds The IDs of the operator sets. @@ -44,9 +93,6 @@ interface IAVSDirectory is ISignatureUtils { * * @dev msg.sender is used as the AVS. * @dev The operator must not have a pending deregistration from the operator set. - * @dev If this is the first operator set in the AVS that the operator is - * registering for, a OperatorAVSRegistrationStatusUpdated event is emitted with - * a REGISTERED status. */ function registerOperatorToOperatorSets( address operator, @@ -54,16 +100,6 @@ interface IAVSDirectory is ISignatureUtils { ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature ) external; - /** - * @notice Called by an operator to deregister from an operator set - * - * @param avs The address of the AVS to deregister the operator from. - * @param operatorSetIds The IDs of the operator sets. - * - * @dev msg.sender used is the operator - */ - function deregisterFromAVSOperatorSets(address avs, uint32[] calldata operatorSetIds) external; - /** * @notice Called by AVSs to remove an operator from an operator set. * @@ -74,6 +110,24 @@ interface IAVSDirectory is ISignatureUtils { */ function deregisterOperatorFromOperatorSets(address operator, uint32[] calldata operatorSetIds) external; + /** + * @notice Called by an operator to deregister from an operator set + * + * @param operator The operator to deregister from the operatorSets. + * @param avs The address of the AVS to deregister the operator from. + * @param operatorSetIds The IDs of the operator sets. + * @param operatorSignature the signature of the operator on their intent to deregister or empty if the operator itself is calling + * + * @dev if the operatorSignature is empty, the caller must be the operator + * @dev this will likely only be called in case the AVS contracts are in a state that prevents operators from deregistering + */ + function forceDeregisterFromOperatorSets( + address operator, + address avs, + uint32[] calldata operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external; + /** * @notice Called by the AVS's service manager contract to register an operator with the AVS. * @@ -120,11 +174,6 @@ interface IAVSDirectory is ISignatureUtils { */ function operatorSaltIsSpent(address operator, bytes32 salt) external view returns (bool); - function memberInfo( - address avs, - address operator - ) external view returns (uint248 inTotalSets, bool isLegacyOperator); - function isMember(address avs, address operator, uint32 operatorSetId) external view returns (bool); /** @@ -157,6 +206,21 @@ interface IAVSDirectory is ISignatureUtils { uint256 expiry ) external view returns (bytes32); + /** + * @notice Calculates the digest hash to be signed by an operator to force deregister from an operator set. + * + * @param avs The AVS that operator is deregistering from. + * @param operatorSetIds An array of operator set IDs the operator is deregistering from. + * @param salt A unique and single use value associated with the approver signature. + * @param expiry Time after which the approver's signature becomes invalid. + */ + function calculateOperatorSetForceDeregistrationTypehash( + address avs, + uint32[] calldata operatorSetIds, + bytes32 salt, + uint256 expiry + ) external view returns (bytes32); + /// @notice Getter function for the current EIP-712 domain separator for this contract. /// @dev The domain separator will change in the event of a fork that changes the ChainID. function domainSeparator() external view returns (bytes32); diff --git a/src/test/events/IAVSDirectoryEvents.sol b/src/test/events/IAVSDirectoryEvents.sol index e009ad463..217d880cb 100644 --- a/src/test/events/IAVSDirectoryEvents.sol +++ b/src/test/events/IAVSDirectoryEvents.sol @@ -4,12 +4,28 @@ pragma solidity ^0.8.12; import "src/contracts/interfaces/IAVSDirectory.sol"; interface IAVSDirectoryEvents { + /// @notice Emitted when an operator set is created by an AVS. + event OperatorSetCreated(IAVSDirectory.OperatorSet operatorSet); + /** - * @notice Emitted when @param avs indicates that they are updating their MetadataURI string - * @dev Note that these strings are *never stored in storage* and are instead purely emitted in events for off-chain indexing + * @notice Emitted when an operator's registration status with an AVS id udpated + * @notice Only used by legacy M2 AVSs that have not integrated with operatorSets. */ + event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, IAVSDirectory.OperatorAVSRegistrationStatus status); + + /// @notice Emitted when an operator is added to an operator set. + event OperatorAddedToOperatorSet(address indexed operator, IAVSDirectory.OperatorSet operatorSet); + + /// @notice Emitted when an operator is removed from an operator set. + event OperatorRemovedFromOperatorSet(address indexed operator, IAVSDirectory.OperatorSet operatorSet); + + /// @notice Emitted when an AVS updates their metadata URI (Uniform Resource Identifier). + /// @dev The URI is never stored; it is simply emitted through an event for off-chain indexing. event AVSMetadataURIUpdated(address indexed avs, string metadataURI); - /// @notice Emitted when an operator's registration status for an AVS is updated - event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool status); + /// @notice Emitted when an AVS migrates to using operator sets + event AVSMigratedToOperatorSets(address indexed avs); + + /// @notice Emitted when an operator is migrated from M2 registration to operator sets. + event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds); } diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 8140c4850..2d5aa5337 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -171,35 +171,56 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { cheats.assume(operatorDetails.stakerOptOutWindowBlocks <= delegationManager.MAX_STAKER_OPT_OUT_WINDOW_BLOCKS()); } - function _registerOperatorToOperatorSets( + function _registerOperatorToOperatorSet( uint256 operatorPk, uint32 operatorSetId, bytes32 salt, uint256 expiry ) internal virtual { - expiry = bound(expiry, 1, type(uint256).max); - cheats.warp(0); - uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; + _registerOperatorToOperatorSets(operatorPk, oids, salt, expiry); + } + + function _registerOperatorToOperatorSets( + uint256 operatorPk, + uint32[] memory operatorSetIds, + bytes32 salt, + uint256 expiry + ) internal virtual { + expiry = bound(expiry, 1, type(uint256).max); + cheats.warp(0); + address operator = cheats.addr(operatorPk); (uint8 v, bytes32 r, bytes32 s) = cheats.sign( - operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), operatorSetIds, salt, expiry) ); + // Set AVS as operator set avs + avsDirectory.becomeOperatorSetAVS(); + _registerOperatorWithBaseDetails(operator); avsDirectory.registerOperatorToOperatorSets( - operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + operator, operatorSetIds, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) ); } + + function _createOperatorSet(uint32 operatorSetId) internal { + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + avsDirectory.createOperatorSets(oids); + } + + function _createOperatorSets(uint32[] memory operatorSetIds) internal { + avsDirectory.createOperatorSets(operatorSetIds); + } } contract AVSDirectoryUnitTests_initialize is AVSDirectoryUnitTests { function testFuzz_Correctness( address delegationManager, - address strategyManager, address owner, address pauserRegistry, uint256 initialPausedStatus @@ -207,7 +228,6 @@ contract AVSDirectoryUnitTests_initialize is AVSDirectoryUnitTests { AVSDirectory dir = new AVSDirectory(IDelegationManager(delegationManager)); assertEq(address(dir.delegation()), delegationManager); - // assertEq(address(dir.strategyManager()), strategyManager); cheats.expectRevert("Initializable: contract is already initialized"); dir.initialize(owner, IPauserRegistry(pauserRegistry), initialPausedStatus); @@ -223,9 +243,7 @@ contract AVSDirectoryUnitTests_domainSeparator is AVSDirectoryUnitTests { } } -contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUnitTests { - event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId); - +contract AVSDirectoryUnitTests_registerOperatorToOperatorSet is AVSDirectoryUnitTests { function testFuzz_revert_SignatureIsExpired( address operator, uint32 operatorSetId, @@ -235,7 +253,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni expiry = bound(expiry, 0, type(uint256).max - 1); cheats.warp(type(uint256).max); - avsDirectory.createOperatorSet(operatorSetId); + _createOperatorSet(operatorSetId); _registerOperatorWithBaseDetails(operator); @@ -248,18 +266,48 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni ); } + function testFuzz_revert_notOperatorSetAVS( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + _createOperatorSet(operatorSetId); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: AVS is not an operator set AVS"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + } + function testFuzz_revert_OperatorRegistered( uint256 operatorPk, uint32 operatorSetId, bytes32 salt, uint256 expiry ) public virtual { + avsDirectory.becomeOperatorSetAVS(); operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); expiry = bound(expiry, 1, type(uint256).max); cheats.warp(0); - avsDirectory.createOperatorSet(operatorSetId); + _createOperatorSet(operatorSetId); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -280,7 +328,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, keccak256(""), expiry) ); - cheats.expectRevert("AVSDirectory.registerOperatorToOperatorSets: operator already registered to operator set"); + cheats.expectRevert("AVSDirectory._registerOperatorToOperatorSets: operator already registered to operator set"); avsDirectory.registerOperatorToOperatorSets( operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), keccak256(""), expiry) ); @@ -292,11 +340,12 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni bytes32 salt, uint256 expiry ) public virtual { + avsDirectory.becomeOperatorSetAVS(); cheats.assume(operator != address(0)); expiry = bound(expiry, 1, type(uint256).max); cheats.warp(0); - avsDirectory.createOperatorSet(operatorSetId); + _createOperatorSet(operatorSetId); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -313,13 +362,14 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni bytes32 salt, uint256 expiry ) public virtual { + avsDirectory.becomeOperatorSetAVS(); operatorSetId = uint32(bound(operatorSetId, 1, type(uint32).max)); operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); expiry = bound(expiry, 1, type(uint256).max); cheats.warp(0); - avsDirectory.createOperatorSet(operatorSetId); + _createOperatorSet(operatorSetId); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -356,7 +406,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni cheats.warp(0); - avsDirectory.createOperatorSet(operatorSetId); + _createOperatorSet(operatorSetId); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -369,11 +419,41 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni _registerOperatorWithBaseDetails(operator); - cheats.prank(badAvs); + cheats.startPrank(badAvs); + avsDirectory.becomeOperatorSetAVS(); cheats.expectRevert("EIP1271SignatureUtils.checkSignature_EIP1271: signature not from signer"); avsDirectory.registerOperatorToOperatorSets( operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) ); + cheats.stopPrank(); + } + + function testFuzz_revert_invalidOperatorSet( + uint256 operatorPk, + uint32 operatorSetId, + bytes32 salt, + uint256 expiry + ) public virtual { + avsDirectory.becomeOperatorSetAVS(); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + cheats.expectRevert("AVSDirectory._registerOperatorToOperatorSets: invalid operator set"); + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); } function testFuzz_MultipleCorrectness( @@ -382,6 +462,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni bytes32 salt, uint256 expiry ) public virtual { + avsDirectory.becomeOperatorSetAVS(); operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); operatorSetIdsLength = bound(operatorSetIdsLength, 1, 16); expiry = bound(expiry, 1, type(uint256).max); @@ -391,7 +472,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni uint32[] memory oids = new uint32[](operatorSetIdsLength); for (uint256 i; i < oids.length; ++i) { oids[i] = uint32(uint256(keccak256(abi.encodePacked(i))) % type(uint32).max); - avsDirectory.createOperatorSet(oids[i]); + _createOperatorSet(oids[i]); } address operator = cheats.addr(operatorPk); @@ -401,12 +482,9 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni _registerOperatorWithBaseDetails(operator); - cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated(operator, address(this), true); - for (uint256 i; i < oids.length; ++i) { cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorAddedToOperatorSet(operator, address(this), oids[i]); + emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), oids[i])); } avsDirectory.registerOperatorToOperatorSets( @@ -417,9 +495,6 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni assertTrue(avsDirectory.isMember(address(this), operator, oids[i])); } - (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); - assertEq(inTotalSets, oids.length); - assertTrue(isLegacyOperator); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); } @@ -429,12 +504,13 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni bytes32 salt, uint256 expiry ) public virtual { + avsDirectory.becomeOperatorSetAVS(); operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); expiry = bound(expiry, 1, type(uint256).max); cheats.warp(0); - avsDirectory.createOperatorSet(operatorSetId); + _createOperatorSet(operatorSetId); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -447,24 +523,17 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSets is AVSDirectoryUni _registerOperatorWithBaseDetails(operator); cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated(operator, address(this), true); - - cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorAddedToOperatorSet(operator, address(this), operatorSetId); + emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); avsDirectory.registerOperatorToOperatorSets( operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) ); - (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); - assertEq(inTotalSets, 1); - assertTrue(isLegacyOperator); assertTrue(avsDirectory.isMember(address(this), operator, operatorSetId)); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); } } -contract AVSDirectoryUnitTests_deregisterFromAVSOperatorSets is AVSDirectoryUnitTests { - event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId); +contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUnitTests { function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); @@ -473,58 +542,159 @@ contract AVSDirectoryUnitTests_deregisterFromAVSOperatorSets is AVSDirectoryUnit uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; - avsDirectory.createOperatorSet(operatorSetId); + _createOperatorSet(operatorSetId); + + ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; cheats.prank(operator); - cheats.expectRevert("AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set"); - avsDirectory.deregisterFromAVSOperatorSets(address(this), oids); + cheats.expectRevert("AVSDirectory._deregisterOperatorFromOperatorSet: operator not registered for operator set"); + + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, emptySig); } - function testFuzz_Correctness( - uint256 operatorPk, - uint32 operatorSetId, - bytes32 salt, - uint256 expiry - ) public virtual { + function testFuzz_revert_operatorNotCaller(uint256 operatorPk, uint32 operatorSetId) public { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); - avsDirectory.createOperatorSet(operatorSetId); + address operator = cheats.addr(operatorPk); + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; - _registerOperatorToOperatorSets(operatorPk, operatorSetId, salt, expiry); + _createOperatorSet(operatorSetId); + + ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + + cheats.expectRevert("AVSDirectory.forceDeregisterFromOperatorSets: caller must be operator"); + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, emptySig); + } + + function testFuzz_forceDeregisterFromOperatorSets(uint256 operatorPk, uint32 operatorSetId, uint8 operatorSetsToAdd, bytes32 salt) public { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + operatorSetsToAdd = uint8(bound(operatorSetsToAdd, 1, type(uint8).max)); + address operator = cheats.addr(operatorPk); + + // Create operator sets + operatorSetId = uint32(bound(operatorSetId, 1, type(uint32).max - uint32(operatorSetsToAdd))); + uint32[] memory oids = new uint32[](operatorSetsToAdd); + for (uint32 i = 0; i < operatorSetsToAdd; i++) { + oids[i] = operatorSetId + i; + _createOperatorSet(oids[i]); + } + + // Register operator to operator sets + _registerOperatorToOperatorSets( + operatorPk, oids, salt, type(uint256).max + ); + + // Deregister operator from operator sets + ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; + cheats.prank(operator); + for(uint i = 0; i < oids.length; i++) { + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), oids[i])); + } + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, emptySig); + + for (uint32 i = 0; i < operatorSetsToAdd; i++) { + assertFalse(avsDirectory.isMember(address(this), operator, oids[i]), "operator still in operator set"); + } + } + + function testFuzz_revert_sigExpired(uint256 operatorPk, uint32 operatorSetId, bytes32 salt) public { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); address operator = cheats.addr(operatorPk); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; - cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorRemovedFromOperatorSet(operator, address(this), operatorSetId); + _createOperatorSet(operatorSetId); - cheats.expectEmit(true, true, true, false, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated(operator, address(this), true); + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = _createForceDeregSignature + (operatorPk, address(this), oids, 0, salt); - cheats.prank(operator); - avsDirectory.deregisterFromAVSOperatorSets(address(this), oids); + cheats.warp(type(uint256).max); + cheats.expectRevert("AVSDirectory.forceDeregisterFromOperatorSets: operator signature expired"); + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, operatorSig); + } - assertEq(avsDirectory.isMember(address(this), operator, operatorSetId), false); - (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); - assertEq(inTotalSets, 0); - assertEq(isLegacyOperator, false); + function testFuzz_revert_saltAlreadySpent(uint256 operatorPk, uint32 operatorSetId, bytes32 salt) public { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + + address operator = cheats.addr(operatorPk); + uint32[] memory oids = new uint32[](1); + oids[0] = operatorSetId; + + // Register operator to operator sets + _createOperatorSet(operatorSetId); + _registerOperatorToOperatorSets( + operatorPk, oids, salt, type(uint256).max + ); + + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = _createForceDeregSignature + (operatorPk, address(this), oids, type(uint256).max, salt); + + cheats.expectRevert("AVSDirectory.forceDeregisterFromOperatorSets: salt already spent"); + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, operatorSig); + } + + function testFuzz_forceDeregisterFromOperatorSets_onBehalf(uint256 operatorPk, uint32 operatorSetId, uint8 operatorSetsToAdd, bytes32 salt1, bytes32 salt2) public { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + operatorSetsToAdd = uint8(bound(operatorSetsToAdd, 1, type(uint8).max)); + address operator = cheats.addr(operatorPk); + + // Create operator sets + operatorSetId = uint32(bound(operatorSetId, 1, type(uint32).max - uint32(operatorSetsToAdd))); + uint32[] memory oids = new uint32[](operatorSetsToAdd); + for (uint32 i = 0; i < oids.length; i++) { + oids[i] = operatorSetId + i; + _createOperatorSet(oids[i]); + } + + // Register operator to operator sets + _registerOperatorToOperatorSets( + operatorPk, oids, salt1, type(uint256).max + ); + + // Deregister operator from operator sets + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = _createForceDeregSignature + (operatorPk, address(this), oids, type(uint256).max, salt2); + + for (uint i = 0; i < oids.length; i++) { + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), oids[i])); + } + + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, operatorSig); + + for (uint32 i = 0; i < operatorSetsToAdd; i++) { + assertFalse(avsDirectory.isMember(address(this), operator, oids[i])); + } + } + + function _createForceDeregSignature(uint256 operatorPk, address avs, uint32[] memory oids, uint256 expiry, bytes32 salt) internal view returns (ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature) { + operatorSignature.expiry = expiry; + address operator = cheats.addr(operatorPk); + operatorSignature.salt = salt; + { + bytes32 digestHash = avsDirectory.calculateOperatorSetForceDeregistrationTypehash(avs, oids, salt, expiry); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign(operatorPk, digestHash); + operatorSignature.signature = abi.encodePacked(r, s, v); + } + return operatorSignature; } } contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirectoryUnitTests { - event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId); function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); - avsDirectory.createOperatorSet(operatorSetId); + _createOperatorSet(operatorSetId); address operator = cheats.addr(operatorPk); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; - cheats.expectRevert("AVSDirectory.deregisterOperatorFromOperatorSet: operator not registered for operator set"); + cheats.expectRevert("AVSDirectory._deregisterOperatorFromOperatorSet: operator not registered for operator set"); avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); } @@ -536,30 +706,281 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector ) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); - avsDirectory.createOperatorSet(operatorSetId); + _createOperatorSet(operatorSetId); - _registerOperatorToOperatorSets(operatorPk, operatorSetId, salt, expiry); + _registerOperatorToOperatorSet(operatorPk, operatorSetId, salt, expiry); address operator = cheats.addr(operatorPk); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorRemovedFromOperatorSet(operator, address(this), operatorSetId); - - cheats.expectEmit(true, true, true, false, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated(operator, address(this), true); + emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); assertEq(avsDirectory.isMember(address(this), operator, operatorSetId), false); - (uint248 inTotalSets, bool isLegacyOperator) = avsDirectory.memberInfo(address(this), operator); - assertEq(inTotalSets, 0); - assertEq(isLegacyOperator, false); } } -contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUnitTests { +contract AVSDirectoryUnitTests_createOperatorSet is AVSDirectoryUnitTests { + function test_createOperatorSet() public { + + uint32[] memory oids = new uint32[](2); + oids[0] = 1; + oids[1] = 2; + + for(uint i = 0; i < oids.length; i++) { + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorSetCreated(IAVSDirectory.OperatorSet({avs: address(this), operatorSetId: oids[i]})); + } + + avsDirectory.createOperatorSets(oids); + + assertTrue(avsDirectory.isOperatorSet(address(this), oids[0])); + assertTrue(avsDirectory.isOperatorSet(address(this), oids[1])); + } + + function test_revert_operatorSetExists() public { + _createOperatorSet(1); + cheats.expectRevert("AVSDirectory.createOperatorSet: operator set already exists"); + _createOperatorSet(1); + } +} + +contract AVSDirectoryUnitTests_becomeOperatorSetAVS is AVSDirectoryUnitTests { + function test_becomeOperatorSetAVS() public { + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit AVSMigratedToOperatorSets(address(this)); + + avsDirectory.becomeOperatorSetAVS(); + + assertTrue(avsDirectory.isOperatorSetAVS(address(this))); + } + + function test_revert_alreadyOperatorSetAVS() public { + avsDirectory.becomeOperatorSetAVS(); + cheats.expectRevert("AVSDirectory.becomeOperatorSetAVS: already an operator set AVS"); + avsDirectory.becomeOperatorSetAVS(); + } +} + +contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUnitTests { + address[] operators = new address[](1); + uint32[][] operatorSetIds = new uint32[][](1); + + function test_revert_paused() public { + cheats.prank(pauser); + avsDirectory.pause(2 ** PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS); + + operators = new address[](1); + operatorSetIds = new uint32[][](1); + + cheats.expectRevert("Pausable: index is paused"); + cheats.prank(defaultAVS); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function test_revert_notOperatorSetAVS() public { + cheats.expectRevert("AVSDirectory.migrateOperatorsToOperatorSets: AVS is not an operator set AVS"); + cheats.prank(defaultAVS); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function test_revert_operatorNotM2Registered() public { + address operator = cheats.addr(delegationSignerPrivateKey); + operators = new address[](1); + operators[0] = operator; + + avsDirectory.becomeOperatorSetAVS(); + cheats.expectRevert("AVSDirectory.migrateOperatorsToOperatorSets: operator already migrated or not a legacy registered operator"); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function test_revert_operatorAlreadyMigrated(bytes32 salt) public { + // Register Operator to M2 + address operator = cheats.addr(delegationSignerPrivateKey); + _registerOperatorLegacyM2(delegationSignerPrivateKey, salt); + + // Format calldata + operators = new address[](1); + operators[0] = operator; + operatorSetIds = new uint32[][](1); + operatorSetIds[0] = new uint32[](1); + operatorSetIds[0][0] = 1; + + // Setup Operator Sets + _createOperatorSet(1); + avsDirectory.becomeOperatorSetAVS(); + + // Migrate Operator + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + + // Revert when trying to migrate operator again + cheats.expectRevert("AVSDirectory.migrateOperatorsToOperatorSets: operator already migrated or not a legacy registered operator"); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function testFuzz_revert_invalidOperatorSet(bytes32 salt) public { + // Register Operator to M2 + address operator = cheats.addr(delegationSignerPrivateKey); + _registerOperatorLegacyM2(delegationSignerPrivateKey, salt); + + // Format calldata + operators = new address[](1); + operators[0] = operator; + operatorSetIds = new uint32[][](1); + operatorSetIds[0] = new uint32[](1); + operatorSetIds[0][0] = 1; + + // Become operator set AVS + avsDirectory.becomeOperatorSetAVS(); + + // Revert + cheats.expectRevert("AVSDirectory._registerOperatorToOperatorSets: invalid operator set"); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function testFuzz_revert_operatorAlreadyRegisteredFromMigration(bytes32 salt) public { + // Register Operator to M2 + address operator = cheats.addr(delegationSignerPrivateKey); + _registerOperatorLegacyM2(delegationSignerPrivateKey, salt); + + // Format calldata + operators = new address[](1); + operators[0] = operator; + operatorSetIds = new uint32[][](1); + operatorSetIds[0] = new uint32[](2); + operatorSetIds[0][0] = 1; + operatorSetIds[0][1] = 1; + + // Become operator set AVS + _createOperatorSet(1); + avsDirectory.becomeOperatorSetAVS(); + + // Revert + cheats.expectRevert("AVSDirectory._registerOperatorToOperatorSets: operator already registered to operator set"); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function testFuzz_revert_operatorAlreadyRegisteredFromNormalReg(bytes32 salt1, bytes32 salt2) public { + // Register Operator to M2 + address operator = cheats.addr(delegationSignerPrivateKey); + _registerOperatorLegacyM2(delegationSignerPrivateKey, salt1); + + // Format calldata + operators = new address[](1); + operators[0] = operator; + operatorSetIds = new uint32[][](1); + operatorSetIds[0] = new uint32[](1); + operatorSetIds[0][0] = 1; + + // Register Operator To Operator Set - cannot use helper method since it re-registers operator in DM + avsDirectory.becomeOperatorSetAVS(); + _createOperatorSet(1); + uint256 expiry = type(uint256).max; + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + delegationSignerPrivateKey, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), operatorSetIds[0], salt2, expiry) + ); + avsDirectory.registerOperatorToOperatorSets( + operator, operatorSetIds[0], ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt2, expiry) + ); + + // Revert + cheats.expectRevert("AVSDirectory._registerOperatorToOperatorSets: operator already registered to operator set"); + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + } + + function testFuzz_correctness(bytes32 salt) public { + // Register Operator to M2 + address operator = cheats.addr(delegationSignerPrivateKey); + _registerOperatorLegacyM2(delegationSignerPrivateKey, salt); + + // Format calldata + operators = new address[](1); + operators[0] = operator; + operatorSetIds = new uint32[][](1); + operatorSetIds[0] = new uint32[](1); + operatorSetIds[0][0] = 1; + + // Become operator set AVS + avsDirectory.becomeOperatorSetAVS(); + _createOperatorSet(1); + + // Expect Emits + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), 1)); + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorAVSRegistrationStatusUpdated(operator, address(this), IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorMigratedToOperatorSets(operator, address(this), operatorSetIds[0]); + + // Migrate + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + + // Checks + assertTrue(avsDirectory.isMember(address(this), operator, 1)); + assertTrue(avsDirectory.avsOperatorStatus(address(this), operator) == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + } + + function testFuzz_correctness_multiple(uint256 privateKey, uint8 numOperators, bytes32 salt, uint8 numOids) public { + // Create Operator Set IDs + uint32[] memory oids = new uint32[](numOids); + for (uint32 i = 0; i < numOids; i++) { + oids[i] = i; + } + + // Create Operators, Initailize Calldata, Register Operators + privateKey = bound(privateKey, 1, MAX_PRIVATE_KEY - numOperators); + operators = new address[](numOperators); + operatorSetIds = new uint32[][](numOperators); + for (uint i = 0; i < numOperators; i++) { + _registerOperatorLegacyM2(privateKey + i, salt); + operators[i] = cheats.addr(privateKey + i); + operatorSetIds[i] = oids; + } + + // Become operator set AVS + avsDirectory.becomeOperatorSetAVS(); + _createOperatorSets(oids); + + // Expect Emits + for (uint i = 0; i < numOperators; i++) { + for (uint j = 0; j < oids.length; j++) { + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorAddedToOperatorSet(operators[i], IAVSDirectory.OperatorSet(address(this), oids[j])); + } + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorAVSRegistrationStatusUpdated(operators[i], address(this), IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorMigratedToOperatorSets(operators[i], address(this), operatorSetIds[i]); + } + + // Migrate + avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); + + // Checks + for (uint i = 0; i < numOperators; i++) { + for (uint j = 0; j < oids.length; j++) { + assertTrue(avsDirectory.isMember(address(this), operators[i], oids[j])); + } + assertTrue(avsDirectory.avsOperatorStatus(address(this), operators[i]) == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + } + } + + function _registerOperatorLegacyM2(uint256 privateKey, bytes32 salt) internal { + address operator = cheats.addr(privateKey); + _registerOperatorWithBaseDetails(operator); + + uint256 expiry = type(uint256).max; + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = + _getOperatorAVSRegistrationSignature(privateKey, operator, address(this), salt, expiry); + + avsDirectory.registerOperatorToAVS(operator, operatorSignature); + } +} + +contract AVSDirectoryUnitTests_legacyOperatorAVSRegistration is AVSDirectoryUnitTests { function test_revert_whenRegisterDeregisterToAVSPaused() public { // set the pausing flag cheats.prank(pauser); @@ -574,6 +995,32 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni avsDirectory.deregisterOperatorFromAVS(address(0)); } + function test_revert_deregisterOperatorFromAVS_operatorNotRegistered() public { + cheats.expectRevert("AVSDirectory.deregisterOperatorFromAVS: operator not registered"); + avsDirectory.deregisterOperatorFromAVS(address(0)); + } + + function testFuzz_deregisterOperatorFromAVS(bytes32 salt) public { + address operator = cheats.addr(delegationSignerPrivateKey); + assertFalse(delegationManager.isOperator(operator), "bad test setup"); + _registerOperatorWithBaseDetails(operator); + + uint256 expiry = type(uint256).max; + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + + cheats.prank(defaultAVS); + avsDirectory.registerOperatorToAVS(operator, operatorSignature); + + cheats.expectEmit(true, true, true, true, address(avsDirectory)); + emit OperatorAVSRegistrationStatusUpdated(operator, defaultAVS, IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + + cheats.prank(defaultAVS); + avsDirectory.deregisterOperatorFromAVS(operator); + + assertTrue(avsDirectory.avsOperatorStatus(defaultAVS, operator) == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + } + // @notice Tests that an avs who calls `updateAVSMetadataURI` will correctly see an `AVSMetadataURIUpdated` event emitted with their input function testFuzz_UpdateAVSMetadataURI(string memory metadataURI) public { // call `updateAVSMetadataURI` and check for event @@ -583,6 +1030,25 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni avsDirectory.updateAVSMetadataURI(metadataURI); } + function testFuzz_revert_whenAVSIsOperatorSetAVS(bytes32 salt) public { + // set the AVS to be an operator set AVS + cheats.prank(defaultAVS); + avsDirectory.becomeOperatorSetAVS(); + + // Register Operator to EigenLayer + address operator = cheats.addr(delegationSignerPrivateKey); + assertFalse(delegationManager.isOperator(operator), "bad test setup"); + _registerOperatorWithBaseDetails(operator); + + uint256 expiry = type(uint256).max; + + cheats.prank(defaultAVS); + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature = + _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); + cheats.expectRevert("AVSDirectory.registerOperatorToAVS: AVS is an operator set AVS"); + avsDirectory.registerOperatorToAVS(operator, operatorSignature); + } + // @notice Verifies an operator registers successfull to avs and see an `OperatorAVSRegistrationStatusUpdated` event emitted function testFuzz_registerOperatorToAVS(bytes32 salt) public { address operator = cheats.addr(delegationSignerPrivateKey); @@ -590,7 +1056,7 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni _registerOperatorWithBaseDetails(operator); cheats.expectEmit(true, true, true, true, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated(operator, defaultAVS, true); + emit OperatorAVSRegistrationStatusUpdated(operator, defaultAVS, IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED); uint256 expiry = type(uint256).max; @@ -599,6 +1065,8 @@ contract AVSDirectoryUnitTests_operatorAVSRegisterationStatus is AVSDirectoryUni _getOperatorAVSRegistrationSignature(delegationSignerPrivateKey, operator, defaultAVS, salt, expiry); avsDirectory.registerOperatorToAVS(operator, operatorSignature); + + assertTrue(avsDirectory.avsOperatorStatus(defaultAVS, operator) == IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED); } // @notice Verifies an operator registers successfull to avs and see an `OperatorAVSRegistrationStatusUpdated` event emitted From 894053501b868ee616509b5cd4fed063960ea1e1 Mon Sep 17 00:00:00 2001 From: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Date: Mon, 22 Jul 2024 15:32:27 -0400 Subject: [PATCH 23/43] feat: operator commission bips (#627) * feat: operator commission bips configured with a delay * build: bindings * fix: interfaces and comments * fix: storage gap and comments * chore: tests cleanup * build: bindings * chore: `forge fmt src/contracts` * feat: `operatorCommissionUpdates` length getter * fix: remove unused imports * fix: optimizations * chore: uncheckeds and remove dup view * build: bindings * chore: format --------- Co-authored-by: clandestine.eth <96172957+0xClandestine@users.noreply.github.com> --- pkg/bindings/AVSDirectory/binding.go | 494 +++++++++++++++++- pkg/bindings/AVSDirectoryStorage/binding.go | 471 ++++++++++++++++- .../DelayedWithdrawalRouter/binding.go | 2 +- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 2 +- pkg/bindings/EigenPodManager/binding.go | 4 + pkg/bindings/EigenStrategy/binding.go | 4 +- pkg/bindings/IAVSDirectory/binding.go | 398 +++++++++++++- pkg/bindings/IRewardsCoordinator/binding.go | 278 ++++++++-- pkg/bindings/RewardsCoordinator/binding.go | 293 ++++++++++- .../RewardsCoordinatorStorage/binding.go | 291 ++++++++++- pkg/bindings/StrategyBase/binding.go | 4 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 4 +- pkg/bindings/StrategyManager/binding.go | 4 + src/contracts/core/RewardsCoordinator.sol | 88 +++- .../core/RewardsCoordinatorStorage.sol | 5 +- .../interfaces/IRewardsCoordinator.sol | 61 ++- src/test/events/IRewardsCoordinatorEvents.sol | 9 + src/test/unit/RewardsCoordinatorUnit.t.sol | 299 ++++++++++- 19 files changed, 2561 insertions(+), 152 deletions(-) diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index e91d51eb1..65c5706da 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -38,8 +38,8 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b5060405162001f7838038062001f78833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051611e01620001776000396000610ea801526000818161032401526109830152611e016000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80638da5cb5b116100b8578063d79aceab1161007c578063d79aceab146102f8578063df5cf7231461031f578063ec76f44214610346578063f2fde38b14610359578063f698da251461036c578063fabc1cbc1461037457600080fd5b80638da5cb5b1461029b5780639926ee7d146102ac578063a1060c88146102bf578063a364f4da146102d2578063a98fb355146102e557600080fd5b806349075da31161010a57806349075da3146101fa578063595c6a67146102355780635ac86ab71461023d5780635c975abb14610260578063715018a614610268578063886f11951461027057600080fd5b806310d67a2f14610147578063136439dd1461015c5780631794bb3c1461016f57806320606b7014610182578063374823b5146101bc575b600080fd5b61015a6101553660046118ab565b610387565b005b61015a61016a3660046118cf565b610443565b61015a61017d3660046118e8565b610582565b6101a97f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6101ea6101ca366004611929565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016101b3565b610228610208366004611955565b609860209081526000928352604080842090915290825290205460ff1681565b6040516101b391906119a4565b61015a6106ac565b6101ea61024b3660046119cc565b606654600160ff9092169190911b9081161490565b6066546101a9565b61015a610773565b606554610283906001600160a01b031681565b6040516001600160a01b0390911681526020016101b3565b6033546001600160a01b0316610283565b61015a6102ba366004611a5f565b610787565b6101a96102cd366004611b46565b610b1a565b61015a6102e03660046118ab565b610bd3565b61015a6102f3366004611b8c565b610d3c565b6101a97fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102837f000000000000000000000000000000000000000000000000000000000000000081565b61015a6103543660046118cf565b610d83565b61015a6103673660046118ab565b610e2e565b6101a9610ea4565b61015a6103823660046118cf565b610ee2565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103fe9190611bfe565b6001600160a01b0316336001600160a01b0316146104375760405162461bcd60e51b815260040161042e90611c1b565b60405180910390fd5b6104408161103e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561048b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104af9190611c65565b6104cb5760405162461bcd60e51b815260040161042e90611c87565b606654818116146105445760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156105a25750600054600160ff909116105b806105bc5750303b1580156105bc575060005460ff166001145b61061f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161042e565b6000805460ff191660011790558015610642576000805461ff0019166101001790555b61064c8383611135565b61065461121f565b609755610660846112b6565b80156106a6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107189190611c65565b6107345760405162461bcd60e51b815260040161042e90611c87565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b61077b611308565b61078560006112b6565b565b606654600090600190811614156107dc5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b42826040015110156108445760405162461bcd60e51b815260206004820152603e6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161042e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561087e5761087e61198e565b14156108e05760405162461bcd60e51b815260206004820152603f6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161042e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156109645760405162461bcd60e51b81526020600482015260366024820152600080516020611dac8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161042e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ee9190611c65565b610a645760405162461bcd60e51b815260206004820152604d6024820152600080516020611dac83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161042e565b6000610a7a843385602001518660400151610b1a565b9050610a8b84828560000151611362565b3360008181526098602090815260408083206001600160a01b0389168085529083528184208054600160ff199182168117909255609985528386208a860151875290945293829020805490931684179092555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610b0c91906119a4565b60405180910390a350505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd6020808301919091526001600160a01b0387811683850152861660608301526080820185905260a08083018590528351808403909101815260c0909201909252805191012060009081610b90610ea4565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b60665460009060019081161415610c285760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161042e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115610c6257610c6261198e565b14610cd55760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161042e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610d3091906119a4565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051610d77929190611ccf565b60405180910390a25050565b33600090815260996020908152604080832084845290915290205460ff1615610e085760405162461bcd60e51b815260206004820152603160248201527f4156534469726563746f72792e63616e63656c53616c743a2063616e6e6f742060448201527018d85b98d95b081cdc195b9d081cd85b1d607a1b606482015260840161042e565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b610e36611308565b6001600160a01b038116610e9b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042e565b610440816112b6565b60007f0000000000000000000000000000000000000000000000000000000000000000461415610ed5575060975490565b610edd61121f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f599190611bfe565b6001600160a01b0316336001600160a01b031614610f895760405162461bcd60e51b815260040161042e90611c1b565b6066541981196066541916146110075760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161042e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610577565b6001600160a01b0381166110cc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161042e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561115657506001600160a01b03821615155b6111d85760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161042e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261121b8261103e565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6033546001600160a01b031633146107855760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042e565b6001600160a01b0383163b1561148157604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906113a29086908690600401611cfe565b602060405180830381865afa1580156113bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e39190611d5b565b6001600160e01b0319161461147c5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161042e565b505050565b826001600160a01b03166114958383611521565b6001600160a01b03161461147c5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161042e565b60008060006115308585611545565b9150915061153d816115b5565b509392505050565b60008082516041141561157c5760208301516040840151606085015160001a61157087828585611770565b945094505050506115ae565b8251604014156115a6576020830151604084015161159b86838361185d565b9350935050506115ae565b506000905060025b9250929050565b60008160048111156115c9576115c961198e565b14156115d25750565b60018160048111156115e6576115e661198e565b14156116345760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161042e565b60028160048111156116485761164861198e565b14156116965760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161042e565b60038160048111156116aa576116aa61198e565b14156117035760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161042e565b60048160048111156117175761171761198e565b14156104405760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161042e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156117a75750600090506003611854565b8460ff16601b141580156117bf57508460ff16601c14155b156117d05750600090506004611854565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611824573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661184d57600060019250925050611854565b9150600090505b94509492505050565b6000806001600160ff1b0383168161187a60ff86901c601b611d85565b905061188887828885611770565b935093505050935093915050565b6001600160a01b038116811461044057600080fd5b6000602082840312156118bd57600080fd5b81356118c881611896565b9392505050565b6000602082840312156118e157600080fd5b5035919050565b6000806000606084860312156118fd57600080fd5b833561190881611896565b9250602084013561191881611896565b929592945050506040919091013590565b6000806040838503121561193c57600080fd5b823561194781611896565b946020939093013593505050565b6000806040838503121561196857600080fd5b823561197381611896565b9150602083013561198381611896565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106119c657634e487b7160e01b600052602160045260246000fd5b91905290565b6000602082840312156119de57600080fd5b813560ff811681146118c857600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611a2857611a286119ef565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715611a5757611a576119ef565b604052919050565b60008060408385031215611a7257600080fd5b8235611a7d81611896565b915060208381013567ffffffffffffffff80821115611a9b57600080fd5b9085019060608288031215611aaf57600080fd5b611ab7611a05565b823582811115611ac657600080fd5b8301601f81018913611ad757600080fd5b803583811115611ae957611ae96119ef565b611afb601f8201601f19168701611a2e565b93508084528986828401011115611b1157600080fd5b808683018786013760008682860101525050818152838301358482015260408301356040820152809450505050509250929050565b60008060008060808587031215611b5c57600080fd5b8435611b6781611896565b93506020850135611b7781611896565b93969395505050506040820135916060013590565b60008060208385031215611b9f57600080fd5b823567ffffffffffffffff80821115611bb757600080fd5b818501915085601f830112611bcb57600080fd5b813581811115611bda57600080fd5b866020828501011115611bec57600080fd5b60209290920196919550909350505050565b600060208284031215611c1057600080fd5b81516118c881611896565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c7757600080fd5b815180151581146118c857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015611d3257858101830151858201606001528201611d16565b81811115611d44576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215611d6d57600080fd5b81516001600160e01b0319811681146118c857600080fd5b60008219821115611da657634e487b7160e01b600052601160045260246000fd5b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f41a26469706673582212203078326ec29ef6e4c0629c3db8b9232b52ccd0d073d4926089bdbc0d9eef3c0f64736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromAVSOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"memberInfo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"inTotalSets\",\"type\":\"uint248\",\"internalType\":\"uint248\"},{\"name\":\"isLegacyOperator\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isLegacyOperator\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60c06040523480156200001157600080fd5b5060405162002b9838038062002b98833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051612a1a6200017e600039600061181c0152600081816104120152818161096501526110c10152612a1a6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80639926ee7d116100f9578063d79aceab11610097578063f2fde38b11610071578063f2fde38b14610468578063f37c521c1461047b578063f698da25146104da578063fabc1cbc146104e257600080fd5b8063d79aceab146103e6578063df5cf7231461040d578063ec76f4421461043457600080fd5b8063a364f4da116100d3578063a364f4da14610386578063a98fb35514610399578063c1a8e2c5146103ac578063c825fe68146103bf57600080fd5b80639926ee7d1461034d5780639c6c518414610360578063a1060c881461037357600080fd5b8063595c6a6711610166578063715018a611610140578063715018a6146102f6578063886f1195146102fe5780638da5cb5b14610329578063955e66961461033a57600080fd5b8063595c6a67146102c35780635ac86ab7146102cb5780635c975abb146102ee57600080fd5b80631e2199e2116101a25780631e2199e21461020457806320606b7014610217578063374823b5146102515780633c4385d01461028f57600080fd5b806310d67a2f146101c9578063136439dd146101de5780631794bb3c146101f1575b600080fd5b6101dc6101d73660046121b8565b6104f5565b005b6101dc6101ec3660046121dc565b6105b1565b6101dc6101ff3660046121f5565b6106f0565b6101dc61021236600461239e565b61081a565b61023e7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61027f61025f36600461241a565b609860209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610248565b61027f61029d36600461245f565b609a60209081526000938452604080852082529284528284209052825290205460ff1681565b6101dc610d21565b61027f6102d93660046124a6565b606654600160ff9092169190911b9081161490565b60665461023e565b6101dc610de8565b606554610311906001600160a01b031681565b6040516001600160a01b039091168152602001610248565b6033546001600160a01b0316610311565b61023e6103483660046124c9565b610dfc565b6101dc61035b366004612530565b610e61565b6101dc61036e366004612580565b611230565b61023e6103813660046125d5565b611265565b6101dc6103943660046121b8565b6112cf565b6101dc6103a736600461261b565b6113da565b6101dc6103ba366004612580565b611421565b61023e7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61023e7fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6103117f000000000000000000000000000000000000000000000000000000000000000081565b6101dc6104423660046121dc565b33600090815260986020908152604080832093835292905220805460ff19166001179055565b6101dc6104763660046121b8565b611456565b6104bb61048936600461268d565b60996020908152600092835260408084209091529082529020546001600160f81b03811690600160f81b900460ff1682565b604080516001600160f81b039093168352901515602083015201610248565b61023e6114cc565b6101dc6104f03660046121dc565b6114db565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056c91906126c6565b6001600160a01b0316336001600160a01b0316146105a55760405162461bcd60e51b815260040161059c906126e3565b60405180910390fd5b6105ae81611637565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061d919061272d565b6106395760405162461bcd60e51b815260040161059c9061274f565b606654818116146106b25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161059c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b61078d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161059c565b6000805460ff1916600117905580156107b0576000805461ff0019166101001790555b6107ba838361172e565b6107c2611818565b6097556107ce846118e1565b8015610814576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b606654600090600190811614156108435760405162461bcd60e51b815260040161059c90612797565b42826040015110156108bb5760405162461bcd60e51b8152602060048201526047602482015260008051602061298583398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a40161059c565b6001600160a01b038516600090815260986020908152604080832085830151845290915290205460ff16156109465760405162461bcd60e51b815260206004820152603f602482015260008051602061298583398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e7400606482015260840161059c565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d0919061272d565b610a4f5760405162461bcd60e51b8152602060048201526056602482015260008051602061298583398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a40161059c565b610a6f85610a6833878787602001518860400151610dfc565b8451611933565b6001600160a01b03851660008181526098602090815260408083208683015184528252808320805460ff1916600117905533835260998252808320938352929052208054600160f81b900460ff16610b045780546001600160f81b0316600160f81b1781556040516001815233906001600160a01b038816906000805160206129a58339815191529060200160405180910390a35b60005b84811015610cf657336000908152609a602090815260408083206001600160a01b038b168452909152812090878784818110610b4557610b456127ce565b9050602002016020810190610b5a91906127e4565b63ffffffff16815260208101919091526040016000205460ff1615610bfb5760405162461bcd60e51b8152602060048201526058602482015260008051602061298583398151915260448201527f70657261746f72536574733a206f70657261746f7220616c726561647920726560648201527f676973746572656420746f206f70657261746f72207365740000000000000000608482015260a40161059c565b336000908152609a602090815260408083206001600160a01b038b1684529091528120600191888885818110610c3357610c336127ce565b9050602002016020810190610c4891906127e4565b63ffffffff1681526020810191909152604001600020805460ff19169115159190911790557f0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba3098733888885818110610ca257610ca26127ce565b9050602002016020810190610cb791906127e4565b604080516001600160a01b03948516815293909216602084015263ffffffff169082015260600160405180910390a1610cef81612815565b9050610b07565b5080546001600160f81b031981166001600160f81b0391821695909501169390931790925550505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8d919061272d565b610da95760405162461bcd60e51b815260040161059c9061274f565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610df0611af2565b610dfa60006118e1565b565b6000610e577f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610e3c96959493929190612830565b60405160208183030381529060405280519060200120611b4c565b9695505050505050565b60665460009060019081161415610e8a5760405162461bcd60e51b815260040161059c90612797565b4282604001511015610ef25760405162461bcd60e51b815260206004820152603e60248201526000805160206129c583398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161059c565b3360009081526099602090815260408083206001600160a01b038716845290915290208054600160f81b900460ff1615610f825760405162461bcd60e51b815260206004820152603f60248201526000805160206129c583398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161059c565b80546001600160f81b03161561101e5760405162461bcd60e51b815260206004820152606160248201526000805160206129c583398151915260448201527f56533a206f70657261746f7220736574204156532063616e6e6f74207265676960648201527f73746572206f70657261746f72732077697468206c6567616379206d6574686f6084820152601960fa1b60a482015260c40161059c565b6001600160a01b038416600090815260986020908152604080832086830151845290915290205460ff16156110a25760405162461bcd60e51b815260206004820152603660248201526000805160206129c58339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161059c565b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112c919061272d565b6111a25760405162461bcd60e51b815260206004820152604d60248201526000805160206129c583398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161059c565b6111c1846111ba863387602001518860400151611265565b8551611933565b6001600160a01b0384166000818152609860209081526040808320878301518452825291829020805460ff1916600190811790915584546001600160f81b0316600160f81b17855591519182523392916000805160206129a5833981519152910160405180910390a350505050565b606654600090600190811614156112595760405162461bcd60e51b815260040161059c90612797565b61081484338585611b93565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290526000906112c69060c001610e3c565b95945050505050565b606654600090600190811614156112f85760405162461bcd60e51b815260040161059c90612797565b3360009081526099602090815260408083206001600160a01b038616845290915290208054600160f81b900460ff166113995760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161059c565b80546001600160f81b031681556040516000815233906001600160a01b038516906000805160206129a58339815191529060200160405180910390a3505050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516114159291906128a0565b60405180910390a25050565b6066546000906001908116141561144a5760405162461bcd60e51b815260040161059c90612797565b61081433858585611b93565b61145e611af2565b6001600160a01b0381166114c35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161059c565b6105ae816118e1565b60006114d6611818565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155291906126c6565b6001600160a01b0316336001600160a01b0316146115825760405162461bcd60e51b815260040161059c906126e3565b6066541981196066541916146116005760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161059c565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106e5565b6001600160a01b0381166116c55760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161059c565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561174f57506001600160a01b03821615155b6117d15760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161059c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261181482611637565b5050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611849575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b15611a5257604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e9061197390869086906004016128cf565b602060405180830381865afa158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b4919061292c565b6001600160e01b03191614611a4d5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161059c565b505050565b826001600160a01b0316611a668383611e2e565b6001600160a01b031614611a4d5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161059c565b6033546001600160a01b03163314610dfa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161059c565b6000611b56611818565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60005b81811015611d9c576001600160a01b038086166000908152609a60209081526040808320938816835292905290812090848484818110611bd857611bd86127ce565b9050602002016020810190611bed91906127e4565b63ffffffff16815260208101919091526040016000205460ff16611c9f5760405162461bcd60e51b815260206004820152605860248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4f70657261746f725365743a206f70657261746f72206e6f742072656760648201527f6973746572656420666f72206f70657261746f72207365740000000000000000608482015260a40161059c565b6001600160a01b038086166000908152609a60209081526040808320938816835292905290812081858585818110611cd957611cd96127ce565b9050602002016020810190611cee91906127e4565b63ffffffff1681526020810191909152604001600020805460ff19169115159190911790557f9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df828486858585818110611d4857611d486127ce565b9050602002016020810190611d5d91906127e4565b604080516001600160a01b03948516815293909216602084015263ffffffff169082015260600160405180910390a1611d9581612815565b9050611b96565b506001600160a01b03808516600090815260996020908152604080832093871683529290522080546001600160f81b03808216849003166001600160f81b031990911681178255611e275780546001600160f81b03168155604051600081526001600160a01b0386811691908616906000805160206129a58339815191529060200160405180910390a35b5050505050565b6000806000611e3d8585611e52565b91509150611e4a81611ec2565b509392505050565b600080825160411415611e895760208301516040840151606085015160001a611e7d8782858561207d565b94509450505050611ebb565b825160401415611eb35760208301516040840151611ea886838361216a565b935093505050611ebb565b506000905060025b9250929050565b6000816004811115611ed657611ed6612956565b1415611edf5750565b6001816004811115611ef357611ef3612956565b1415611f415760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161059c565b6002816004811115611f5557611f55612956565b1415611fa35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161059c565b6003816004811115611fb757611fb7612956565b14156120105760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161059c565b600481600481111561202457612024612956565b14156105ae5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161059c565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156120b45750600090506003612161565b8460ff16601b141580156120cc57508460ff16601c14155b156120dd5750600090506004612161565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612131573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661215a57600060019250925050612161565b9150600090505b94509492505050565b6000806001600160ff1b0383168161218760ff86901c601b61296c565b90506121958782888561207d565b935093505050935093915050565b6001600160a01b03811681146105ae57600080fd5b6000602082840312156121ca57600080fd5b81356121d5816121a3565b9392505050565b6000602082840312156121ee57600080fd5b5035919050565b60008060006060848603121561220a57600080fd5b8335612215816121a3565b92506020840135612225816121a3565b929592945050506040919091013590565b60008083601f84011261224857600080fd5b50813567ffffffffffffffff81111561226057600080fd5b6020830191508360208260051b8501011115611ebb57600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156122b4576122b461227b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156122e3576122e361227b565b604052919050565b6000606082840312156122fd57600080fd5b612305612291565b9050813567ffffffffffffffff8082111561231f57600080fd5b818401915084601f83011261233357600080fd5b81356020828211156123475761234761227b565b612359601f8301601f191682016122ba565b9250818352868183860101111561236f57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b600080600080606085870312156123b457600080fd5b84356123bf816121a3565b9350602085013567ffffffffffffffff808211156123dc57600080fd5b6123e888838901612236565b9095509350604087013591508082111561240157600080fd5b5061240e878288016122eb565b91505092959194509250565b6000806040838503121561242d57600080fd5b8235612438816121a3565b946020939093013593505050565b803563ffffffff8116811461245a57600080fd5b919050565b60008060006060848603121561247457600080fd5b833561247f816121a3565b9250602084013561248f816121a3565b915061249d60408501612446565b90509250925092565b6000602082840312156124b857600080fd5b813560ff811681146121d557600080fd5b6000806000806000608086880312156124e157600080fd5b85356124ec816121a3565b9450602086013567ffffffffffffffff81111561250857600080fd5b61251488828901612236565b9699909850959660408101359660609091013595509350505050565b6000806040838503121561254357600080fd5b823561254e816121a3565b9150602083013567ffffffffffffffff81111561256a57600080fd5b612576858286016122eb565b9150509250929050565b60008060006040848603121561259557600080fd5b83356125a0816121a3565b9250602084013567ffffffffffffffff8111156125bc57600080fd5b6125c886828701612236565b9497909650939450505050565b600080600080608085870312156125eb57600080fd5b84356125f6816121a3565b93506020850135612606816121a3565b93969395505050506040820135916060013590565b6000806020838503121561262e57600080fd5b823567ffffffffffffffff8082111561264657600080fd5b818501915085601f83011261265a57600080fd5b81358181111561266957600080fd5b86602082850101111561267b57600080fd5b60209290920196919550909350505050565b600080604083850312156126a057600080fd5b82356126ab816121a3565b915060208301356126bb816121a3565b809150509250929050565b6000602082840312156126d857600080fd5b81516121d5816121a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561273f57600080fd5b815180151581146121d557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156127f657600080fd5b6121d582612446565b634e487b7160e01b600052601160045260246000fd5b6000600019821415612829576128296127ff565b5060010190565b8681526001600160a01b03861660208083019190915260a0604083018190528201859052600090869060c08401835b888110156128885763ffffffff61287585612446565b168252928201929082019060010161285f565b50606085019690965250505060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015612903578581018301518582016060015282016128e7565b81811115612915576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561293e57600080fd5b81516001600160e01b0319811681146121d557600080fd5b634e487b7160e01b600052602160045260246000fd5b6000821982111561297f5761297f6127ff565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220abc08f435dccd66e9e342b55c33d48f0b14953f563bc7cf580c802cd03e5343764736f6c634300080c0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. @@ -271,35 +271,35 @@ func (_AVSDirectory *AVSDirectoryCallerSession) OPERATORAVSREGISTRATIONTYPEHASH( return _AVSDirectory.Contract.OPERATORAVSREGISTRATIONTYPEHASH(&_AVSDirectory.CallOpts) } -// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68. // -// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) -func (_AVSDirectory *AVSDirectoryCaller) AvsOperatorStatus(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (uint8, error) { +// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectory *AVSDirectoryCaller) OPERATORSETREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error) { var out []interface{} - err := _AVSDirectory.contract.Call(opts, &out, "avsOperatorStatus", arg0, arg1) + err := _AVSDirectory.contract.Call(opts, &out, "OPERATOR_SET_REGISTRATION_TYPEHASH") if err != nil { - return *new(uint8), err + return *new([32]byte), err } - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err } -// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68. // -// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) -func (_AVSDirectory *AVSDirectorySession) AvsOperatorStatus(arg0 common.Address, arg1 common.Address) (uint8, error) { - return _AVSDirectory.Contract.AvsOperatorStatus(&_AVSDirectory.CallOpts, arg0, arg1) +// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectory *AVSDirectorySession) OPERATORSETREGISTRATIONTYPEHASH() ([32]byte, error) { + return _AVSDirectory.Contract.OPERATORSETREGISTRATIONTYPEHASH(&_AVSDirectory.CallOpts) } -// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68. // -// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) -func (_AVSDirectory *AVSDirectoryCallerSession) AvsOperatorStatus(arg0 common.Address, arg1 common.Address) (uint8, error) { - return _AVSDirectory.Contract.AvsOperatorStatus(&_AVSDirectory.CallOpts, arg0, arg1) +// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectory *AVSDirectoryCallerSession) OPERATORSETREGISTRATIONTYPEHASH() ([32]byte, error) { + return _AVSDirectory.Contract.OPERATORSETREGISTRATIONTYPEHASH(&_AVSDirectory.CallOpts) } // CalculateOperatorAVSRegistrationDigestHash is a free data retrieval call binding the contract method 0xa1060c88. @@ -333,6 +333,37 @@ func (_AVSDirectory *AVSDirectoryCallerSession) CalculateOperatorAVSRegistration return _AVSDirectory.Contract.CalculateOperatorAVSRegistrationDigestHash(&_AVSDirectory.CallOpts, operator, avs, salt, expiry) } +// CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. +// +// Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectory *AVSDirectoryCaller) CalculateOperatorSetRegistrationDigestHash(opts *bind.CallOpts, avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + var out []interface{} + err := _AVSDirectory.contract.Call(opts, &out, "calculateOperatorSetRegistrationDigestHash", avs, operatorSetIds, salt, expiry) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. +// +// Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectory *AVSDirectorySession) CalculateOperatorSetRegistrationDigestHash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _AVSDirectory.Contract.CalculateOperatorSetRegistrationDigestHash(&_AVSDirectory.CallOpts, avs, operatorSetIds, salt, expiry) +} + +// CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. +// +// Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectory *AVSDirectoryCallerSession) CalculateOperatorSetRegistrationDigestHash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _AVSDirectory.Contract.CalculateOperatorSetRegistrationDigestHash(&_AVSDirectory.CallOpts, avs, operatorSetIds, salt, expiry) +} + // Delegation is a free data retrieval call binding the contract method 0xdf5cf723. // // Solidity: function delegation() view returns(address) @@ -395,6 +426,82 @@ func (_AVSDirectory *AVSDirectoryCallerSession) DomainSeparator() ([32]byte, err return _AVSDirectory.Contract.DomainSeparator(&_AVSDirectory.CallOpts) } +// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// +// Solidity: function isMember(address , address , uint32 ) view returns(bool) +func (_AVSDirectory *AVSDirectoryCaller) IsMember(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { + var out []interface{} + err := _AVSDirectory.contract.Call(opts, &out, "isMember", arg0, arg1, arg2) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// +// Solidity: function isMember(address , address , uint32 ) view returns(bool) +func (_AVSDirectory *AVSDirectorySession) IsMember(arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { + return _AVSDirectory.Contract.IsMember(&_AVSDirectory.CallOpts, arg0, arg1, arg2) +} + +// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// +// Solidity: function isMember(address , address , uint32 ) view returns(bool) +func (_AVSDirectory *AVSDirectoryCallerSession) IsMember(arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { + return _AVSDirectory.Contract.IsMember(&_AVSDirectory.CallOpts, arg0, arg1, arg2) +} + +// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// +// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) +func (_AVSDirectory *AVSDirectoryCaller) MemberInfo(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (struct { + InTotalSets *big.Int + IsLegacyOperator bool +}, error) { + var out []interface{} + err := _AVSDirectory.contract.Call(opts, &out, "memberInfo", arg0, arg1) + + outstruct := new(struct { + InTotalSets *big.Int + IsLegacyOperator bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.InTotalSets = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.IsLegacyOperator = *abi.ConvertType(out[1], new(bool)).(*bool) + + return *outstruct, err + +} + +// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// +// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) +func (_AVSDirectory *AVSDirectorySession) MemberInfo(arg0 common.Address, arg1 common.Address) (struct { + InTotalSets *big.Int + IsLegacyOperator bool +}, error) { + return _AVSDirectory.Contract.MemberInfo(&_AVSDirectory.CallOpts, arg0, arg1) +} + +// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// +// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) +func (_AVSDirectory *AVSDirectoryCallerSession) MemberInfo(arg0 common.Address, arg1 common.Address) (struct { + InTotalSets *big.Int + IsLegacyOperator bool +}, error) { + return _AVSDirectory.Contract.MemberInfo(&_AVSDirectory.CallOpts, arg0, arg1) +} + // OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5. // // Solidity: function operatorSaltIsSpent(address , bytes32 ) view returns(bool) @@ -571,6 +678,27 @@ func (_AVSDirectory *AVSDirectoryTransactorSession) CancelSalt(salt [32]byte) (* return _AVSDirectory.Contract.CancelSalt(&_AVSDirectory.TransactOpts, salt) } +// DeregisterFromAVSOperatorSets is a paid mutator transaction binding the contract method 0x9c6c5184. +// +// Solidity: function deregisterFromAVSOperatorSets(address avs, uint32[] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectoryTransactor) DeregisterFromAVSOperatorSets(opts *bind.TransactOpts, avs common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectory.contract.Transact(opts, "deregisterFromAVSOperatorSets", avs, operatorSetIds) +} + +// DeregisterFromAVSOperatorSets is a paid mutator transaction binding the contract method 0x9c6c5184. +// +// Solidity: function deregisterFromAVSOperatorSets(address avs, uint32[] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectorySession) DeregisterFromAVSOperatorSets(avs common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectory.Contract.DeregisterFromAVSOperatorSets(&_AVSDirectory.TransactOpts, avs, operatorSetIds) +} + +// DeregisterFromAVSOperatorSets is a paid mutator transaction binding the contract method 0x9c6c5184. +// +// Solidity: function deregisterFromAVSOperatorSets(address avs, uint32[] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectoryTransactorSession) DeregisterFromAVSOperatorSets(avs common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectory.Contract.DeregisterFromAVSOperatorSets(&_AVSDirectory.TransactOpts, avs, operatorSetIds) +} + // DeregisterOperatorFromAVS is a paid mutator transaction binding the contract method 0xa364f4da. // // Solidity: function deregisterOperatorFromAVS(address operator) returns() @@ -592,6 +720,27 @@ func (_AVSDirectory *AVSDirectoryTransactorSession) DeregisterOperatorFromAVS(op return _AVSDirectory.Contract.DeregisterOperatorFromAVS(&_AVSDirectory.TransactOpts, operator) } +// DeregisterOperatorFromOperatorSets is a paid mutator transaction binding the contract method 0xc1a8e2c5. +// +// Solidity: function deregisterOperatorFromOperatorSets(address operator, uint32[] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectoryTransactor) DeregisterOperatorFromOperatorSets(opts *bind.TransactOpts, operator common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectory.contract.Transact(opts, "deregisterOperatorFromOperatorSets", operator, operatorSetIds) +} + +// DeregisterOperatorFromOperatorSets is a paid mutator transaction binding the contract method 0xc1a8e2c5. +// +// Solidity: function deregisterOperatorFromOperatorSets(address operator, uint32[] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectorySession) DeregisterOperatorFromOperatorSets(operator common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectory.Contract.DeregisterOperatorFromOperatorSets(&_AVSDirectory.TransactOpts, operator, operatorSetIds) +} + +// DeregisterOperatorFromOperatorSets is a paid mutator transaction binding the contract method 0xc1a8e2c5. +// +// Solidity: function deregisterOperatorFromOperatorSets(address operator, uint32[] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectoryTransactorSession) DeregisterOperatorFromOperatorSets(operator common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectory.Contract.DeregisterOperatorFromOperatorSets(&_AVSDirectory.TransactOpts, operator, operatorSetIds) +} + // Initialize is a paid mutator transaction binding the contract method 0x1794bb3c. // // Solidity: function initialize(address initialOwner, address _pauserRegistry, uint256 initialPausedStatus) returns() @@ -676,6 +825,27 @@ func (_AVSDirectory *AVSDirectoryTransactorSession) RegisterOperatorToAVS(operat return _AVSDirectory.Contract.RegisterOperatorToAVS(&_AVSDirectory.TransactOpts, operator, operatorSignature) } +// RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. +// +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectory *AVSDirectoryTransactor) RegisterOperatorToOperatorSets(opts *bind.TransactOpts, operator common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectory.contract.Transact(opts, "registerOperatorToOperatorSets", operator, operatorSetIds, operatorSignature) +} + +// RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. +// +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectory *AVSDirectorySession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectory.Contract.RegisterOperatorToOperatorSets(&_AVSDirectory.TransactOpts, operator, operatorSetIds, operatorSignature) +} + +// RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. +// +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectory *AVSDirectoryTransactorSession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectory.Contract.RegisterOperatorToOperatorSets(&_AVSDirectory.TransactOpts, operator, operatorSetIds, operatorSignature) +} + // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. // // Solidity: function renounceOwnership() returns() @@ -1129,15 +1299,15 @@ func (it *AVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator) Close() erro // AVSDirectoryOperatorAVSRegistrationStatusUpdated represents a OperatorAVSRegistrationStatusUpdated event raised by the AVSDirectory contract. type AVSDirectoryOperatorAVSRegistrationStatusUpdated struct { - Operator common.Address - Avs common.Address - Status uint8 - Raw types.Log // Blockchain specific contextual infos + Operator common.Address + Avs common.Address + IsLegacyOperator bool + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. +// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorAVSRegistrationStatusUpdated(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*AVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator, error) { var operatorRule []interface{} @@ -1156,9 +1326,9 @@ func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorAVSRegistrationStatusUp return &AVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator{contract: _AVSDirectory.contract, event: "OperatorAVSRegistrationStatusUpdated", logs: logs, sub: sub}, nil } -// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. +// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorAVSRegistrationStatusUpdated(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOperatorAVSRegistrationStatusUpdated, operator []common.Address, avs []common.Address) (event.Subscription, error) { var operatorRule []interface{} @@ -1202,9 +1372,9 @@ func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorAVSRegistrationStatusUpd }), nil } -// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. +// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorAVSRegistrationStatusUpdated(log types.Log) (*AVSDirectoryOperatorAVSRegistrationStatusUpdated, error) { event := new(AVSDirectoryOperatorAVSRegistrationStatusUpdated) if err := _AVSDirectory.contract.UnpackLog(event, "OperatorAVSRegistrationStatusUpdated", log); err != nil { @@ -1214,6 +1384,278 @@ func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorAVSRegistrationStatusUpd return event, nil } +// AVSDirectoryOperatorAddedToOperatorSetIterator is returned from FilterOperatorAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorAddedToOperatorSet events raised by the AVSDirectory contract. +type AVSDirectoryOperatorAddedToOperatorSetIterator struct { + Event *AVSDirectoryOperatorAddedToOperatorSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AVSDirectoryOperatorAddedToOperatorSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryOperatorAddedToOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryOperatorAddedToOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AVSDirectoryOperatorAddedToOperatorSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AVSDirectoryOperatorAddedToOperatorSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AVSDirectoryOperatorAddedToOperatorSet represents a OperatorAddedToOperatorSet event raised by the AVSDirectory contract. +type AVSDirectoryOperatorAddedToOperatorSet struct { + Operator common.Address + Avs common.Address + OperatorSetId uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// +// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts) (*AVSDirectoryOperatorAddedToOperatorSetIterator, error) { + + logs, sub, err := _AVSDirectory.contract.FilterLogs(opts, "OperatorAddedToOperatorSet") + if err != nil { + return nil, err + } + return &AVSDirectoryOperatorAddedToOperatorSetIterator{contract: _AVSDirectory.contract, event: "OperatorAddedToOperatorSet", logs: logs, sub: sub}, nil +} + +// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// +// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOperatorAddedToOperatorSet) (event.Subscription, error) { + + logs, sub, err := _AVSDirectory.contract.WatchLogs(opts, "OperatorAddedToOperatorSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AVSDirectoryOperatorAddedToOperatorSet) + if err := _AVSDirectory.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// +// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorAddedToOperatorSet(log types.Log) (*AVSDirectoryOperatorAddedToOperatorSet, error) { + event := new(AVSDirectoryOperatorAddedToOperatorSet) + if err := _AVSDirectory.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AVSDirectoryOperatorRemovedFromOperatorSetIterator is returned from FilterOperatorRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorRemovedFromOperatorSet events raised by the AVSDirectory contract. +type AVSDirectoryOperatorRemovedFromOperatorSetIterator struct { + Event *AVSDirectoryOperatorRemovedFromOperatorSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AVSDirectoryOperatorRemovedFromOperatorSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryOperatorRemovedFromOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryOperatorRemovedFromOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AVSDirectoryOperatorRemovedFromOperatorSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AVSDirectoryOperatorRemovedFromOperatorSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AVSDirectoryOperatorRemovedFromOperatorSet represents a OperatorRemovedFromOperatorSet event raised by the AVSDirectory contract. +type AVSDirectoryOperatorRemovedFromOperatorSet struct { + Operator common.Address + Avs common.Address + OperatorSetId uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// +// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts) (*AVSDirectoryOperatorRemovedFromOperatorSetIterator, error) { + + logs, sub, err := _AVSDirectory.contract.FilterLogs(opts, "OperatorRemovedFromOperatorSet") + if err != nil { + return nil, err + } + return &AVSDirectoryOperatorRemovedFromOperatorSetIterator{contract: _AVSDirectory.contract, event: "OperatorRemovedFromOperatorSet", logs: logs, sub: sub}, nil +} + +// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// +// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOperatorRemovedFromOperatorSet) (event.Subscription, error) { + + logs, sub, err := _AVSDirectory.contract.WatchLogs(opts, "OperatorRemovedFromOperatorSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AVSDirectoryOperatorRemovedFromOperatorSet) + if err := _AVSDirectory.contract.UnpackLog(event, "OperatorRemovedFromOperatorSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// +// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorRemovedFromOperatorSet(log types.Log) (*AVSDirectoryOperatorRemovedFromOperatorSet, error) { + event := new(AVSDirectoryOperatorRemovedFromOperatorSet) + if err := _AVSDirectory.contract.UnpackLog(event, "OperatorRemovedFromOperatorSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // AVSDirectoryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the AVSDirectory contract. type AVSDirectoryOwnershipTransferredIterator struct { Event *AVSDirectoryOwnershipTransferred // Event containing the contract specifics and raw log diff --git a/pkg/bindings/AVSDirectoryStorage/binding.go b/pkg/bindings/AVSDirectoryStorage/binding.go index 2070a8e69..94ad040a7 100644 --- a/pkg/bindings/AVSDirectoryStorage/binding.go +++ b/pkg/bindings/AVSDirectoryStorage/binding.go @@ -38,7 +38,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryStorageMetaData contains all meta data concerning the AVSDirectoryStorage contract. var AVSDirectoryStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"memberInfo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"inTotalSets\",\"type\":\"uint248\",\"internalType\":\"uint248\"},{\"name\":\"isLegacyOperator\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isLegacyOperator\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false}]", } // AVSDirectoryStorageABI is the input ABI used to generate the binding from. @@ -249,35 +249,35 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) OPERATORAVSREGISTR return _AVSDirectoryStorage.Contract.OPERATORAVSREGISTRATIONTYPEHASH(&_AVSDirectoryStorage.CallOpts) } -// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68. // -// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) -func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) AvsOperatorStatus(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (uint8, error) { +// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) OPERATORSETREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error) { var out []interface{} - err := _AVSDirectoryStorage.contract.Call(opts, &out, "avsOperatorStatus", arg0, arg1) + err := _AVSDirectoryStorage.contract.Call(opts, &out, "OPERATOR_SET_REGISTRATION_TYPEHASH") if err != nil { - return *new(uint8), err + return *new([32]byte), err } - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err } -// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68. // -// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) -func (_AVSDirectoryStorage *AVSDirectoryStorageSession) AvsOperatorStatus(arg0 common.Address, arg1 common.Address) (uint8, error) { - return _AVSDirectoryStorage.Contract.AvsOperatorStatus(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) OPERATORSETREGISTRATIONTYPEHASH() ([32]byte, error) { + return _AVSDirectoryStorage.Contract.OPERATORSETREGISTRATIONTYPEHASH(&_AVSDirectoryStorage.CallOpts) } -// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68. // -// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) -func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) AvsOperatorStatus(arg0 common.Address, arg1 common.Address) (uint8, error) { - return _AVSDirectoryStorage.Contract.AvsOperatorStatus(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) OPERATORSETREGISTRATIONTYPEHASH() ([32]byte, error) { + return _AVSDirectoryStorage.Contract.OPERATORSETREGISTRATIONTYPEHASH(&_AVSDirectoryStorage.CallOpts) } // CalculateOperatorAVSRegistrationDigestHash is a free data retrieval call binding the contract method 0xa1060c88. @@ -311,6 +311,37 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) CalculateOperatorA return _AVSDirectoryStorage.Contract.CalculateOperatorAVSRegistrationDigestHash(&_AVSDirectoryStorage.CallOpts, operator, avs, salt, expiry) } +// CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. +// +// Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) CalculateOperatorSetRegistrationDigestHash(opts *bind.CallOpts, avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + var out []interface{} + err := _AVSDirectoryStorage.contract.Call(opts, &out, "calculateOperatorSetRegistrationDigestHash", avs, operatorSetIds, salt, expiry) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. +// +// Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) CalculateOperatorSetRegistrationDigestHash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _AVSDirectoryStorage.Contract.CalculateOperatorSetRegistrationDigestHash(&_AVSDirectoryStorage.CallOpts, avs, operatorSetIds, salt, expiry) +} + +// CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. +// +// Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) CalculateOperatorSetRegistrationDigestHash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _AVSDirectoryStorage.Contract.CalculateOperatorSetRegistrationDigestHash(&_AVSDirectoryStorage.CallOpts, avs, operatorSetIds, salt, expiry) +} + // Delegation is a free data retrieval call binding the contract method 0xdf5cf723. // // Solidity: function delegation() view returns(address) @@ -342,6 +373,82 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) Delegation() (comm return _AVSDirectoryStorage.Contract.Delegation(&_AVSDirectoryStorage.CallOpts) } +// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// +// Solidity: function isMember(address , address , uint32 ) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) IsMember(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { + var out []interface{} + err := _AVSDirectoryStorage.contract.Call(opts, &out, "isMember", arg0, arg1, arg2) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// +// Solidity: function isMember(address , address , uint32 ) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) IsMember(arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { + return _AVSDirectoryStorage.Contract.IsMember(&_AVSDirectoryStorage.CallOpts, arg0, arg1, arg2) +} + +// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// +// Solidity: function isMember(address , address , uint32 ) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) IsMember(arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { + return _AVSDirectoryStorage.Contract.IsMember(&_AVSDirectoryStorage.CallOpts, arg0, arg1, arg2) +} + +// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// +// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) MemberInfo(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (struct { + InTotalSets *big.Int + IsLegacyOperator bool +}, error) { + var out []interface{} + err := _AVSDirectoryStorage.contract.Call(opts, &out, "memberInfo", arg0, arg1) + + outstruct := new(struct { + InTotalSets *big.Int + IsLegacyOperator bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.InTotalSets = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.IsLegacyOperator = *abi.ConvertType(out[1], new(bool)).(*bool) + + return *outstruct, err + +} + +// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// +// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) MemberInfo(arg0 common.Address, arg1 common.Address) (struct { + InTotalSets *big.Int + IsLegacyOperator bool +}, error) { + return _AVSDirectoryStorage.Contract.MemberInfo(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +} + +// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// +// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) MemberInfo(arg0 common.Address, arg1 common.Address) (struct { + InTotalSets *big.Int + IsLegacyOperator bool +}, error) { + return _AVSDirectoryStorage.Contract.MemberInfo(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +} + // OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5. // // Solidity: function operatorSaltIsSpent(address , bytes32 ) view returns(bool) @@ -394,6 +501,27 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) DeregisterOper return _AVSDirectoryStorage.Contract.DeregisterOperatorFromAVS(&_AVSDirectoryStorage.TransactOpts, operator) } +// DeregisterOperatorFromOperatorSets is a paid mutator transaction binding the contract method 0xc1a8e2c5. +// +// Solidity: function deregisterOperatorFromOperatorSets(address operator, uint32[] operatorSetIds) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) DeregisterOperatorFromOperatorSets(opts *bind.TransactOpts, operator common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectoryStorage.contract.Transact(opts, "deregisterOperatorFromOperatorSets", operator, operatorSetIds) +} + +// DeregisterOperatorFromOperatorSets is a paid mutator transaction binding the contract method 0xc1a8e2c5. +// +// Solidity: function deregisterOperatorFromOperatorSets(address operator, uint32[] operatorSetIds) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) DeregisterOperatorFromOperatorSets(operator common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.DeregisterOperatorFromOperatorSets(&_AVSDirectoryStorage.TransactOpts, operator, operatorSetIds) +} + +// DeregisterOperatorFromOperatorSets is a paid mutator transaction binding the contract method 0xc1a8e2c5. +// +// Solidity: function deregisterOperatorFromOperatorSets(address operator, uint32[] operatorSetIds) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) DeregisterOperatorFromOperatorSets(operator common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.DeregisterOperatorFromOperatorSets(&_AVSDirectoryStorage.TransactOpts, operator, operatorSetIds) +} + // RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d. // // Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns() @@ -415,6 +543,27 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) RegisterOperat return _AVSDirectoryStorage.Contract.RegisterOperatorToAVS(&_AVSDirectoryStorage.TransactOpts, operator, operatorSignature) } +// RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. +// +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) RegisterOperatorToOperatorSets(opts *bind.TransactOpts, operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectoryStorage.contract.Transact(opts, "registerOperatorToOperatorSets", operator, operatorSetIds, signature) +} + +// RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. +// +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.RegisterOperatorToOperatorSets(&_AVSDirectoryStorage.TransactOpts, operator, operatorSetIds, signature) +} + +// RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. +// +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.RegisterOperatorToOperatorSets(&_AVSDirectoryStorage.TransactOpts, operator, operatorSetIds, signature) +} + // UpdateAVSMetadataURI is a paid mutator transaction binding the contract method 0xa98fb355. // // Solidity: function updateAVSMetadataURI(string metadataURI) returns() @@ -650,15 +799,15 @@ func (it *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator) Close // AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated represents a OperatorAVSRegistrationStatusUpdated event raised by the AVSDirectoryStorage contract. type AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated struct { - Operator common.Address - Avs common.Address - Status uint8 - Raw types.Log // Blockchain specific contextual infos + Operator common.Address + Avs common.Address + IsLegacyOperator bool + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. +// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorAVSRegistrationStatusUpdated(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator, error) { var operatorRule []interface{} @@ -677,9 +826,9 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorAVSRegist return &AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator{contract: _AVSDirectoryStorage.contract, event: "OperatorAVSRegistrationStatusUpdated", logs: logs, sub: sub}, nil } -// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. +// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAVSRegistrationStatusUpdated(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated, operator []common.Address, avs []common.Address) (event.Subscription, error) { var operatorRule []interface{} @@ -723,9 +872,9 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAVSRegistr }), nil } -// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. +// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorAVSRegistrationStatusUpdated(log types.Log) (*AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated, error) { event := new(AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated) if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorAVSRegistrationStatusUpdated", log); err != nil { @@ -734,3 +883,275 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorAVSRegistr event.Raw = log return event, nil } + +// AVSDirectoryStorageOperatorAddedToOperatorSetIterator is returned from FilterOperatorAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorAddedToOperatorSet events raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorAddedToOperatorSetIterator struct { + Event *AVSDirectoryStorageOperatorAddedToOperatorSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryStorageOperatorAddedToOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryStorageOperatorAddedToOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AVSDirectoryStorageOperatorAddedToOperatorSet represents a OperatorAddedToOperatorSet event raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorAddedToOperatorSet struct { + Operator common.Address + Avs common.Address + OperatorSetId uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// +// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts) (*AVSDirectoryStorageOperatorAddedToOperatorSetIterator, error) { + + logs, sub, err := _AVSDirectoryStorage.contract.FilterLogs(opts, "OperatorAddedToOperatorSet") + if err != nil { + return nil, err + } + return &AVSDirectoryStorageOperatorAddedToOperatorSetIterator{contract: _AVSDirectoryStorage.contract, event: "OperatorAddedToOperatorSet", logs: logs, sub: sub}, nil +} + +// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// +// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorAddedToOperatorSet) (event.Subscription, error) { + + logs, sub, err := _AVSDirectoryStorage.contract.WatchLogs(opts, "OperatorAddedToOperatorSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AVSDirectoryStorageOperatorAddedToOperatorSet) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// +// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorAddedToOperatorSet(log types.Log) (*AVSDirectoryStorageOperatorAddedToOperatorSet, error) { + event := new(AVSDirectoryStorageOperatorAddedToOperatorSet) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator is returned from FilterOperatorRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorRemovedFromOperatorSet events raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator struct { + Event *AVSDirectoryStorageOperatorRemovedFromOperatorSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryStorageOperatorRemovedFromOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryStorageOperatorRemovedFromOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AVSDirectoryStorageOperatorRemovedFromOperatorSet represents a OperatorRemovedFromOperatorSet event raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorRemovedFromOperatorSet struct { + Operator common.Address + Avs common.Address + OperatorSetId uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// +// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts) (*AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator, error) { + + logs, sub, err := _AVSDirectoryStorage.contract.FilterLogs(opts, "OperatorRemovedFromOperatorSet") + if err != nil { + return nil, err + } + return &AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator{contract: _AVSDirectoryStorage.contract, event: "OperatorRemovedFromOperatorSet", logs: logs, sub: sub}, nil +} + +// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// +// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorRemovedFromOperatorSet) (event.Subscription, error) { + + logs, sub, err := _AVSDirectoryStorage.contract.WatchLogs(opts, "OperatorRemovedFromOperatorSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AVSDirectoryStorageOperatorRemovedFromOperatorSet) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorRemovedFromOperatorSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// +// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorRemovedFromOperatorSet(log types.Log) (*AVSDirectoryStorageOperatorRemovedFromOperatorSet, error) { + event := new(AVSDirectoryStorageOperatorRemovedFromOperatorSet) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorRemovedFromOperatorSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/bindings/DelayedWithdrawalRouter/binding.go b/pkg/bindings/DelayedWithdrawalRouter/binding.go index 31fb64ca0..4943de658 100644 --- a/pkg/bindings/DelayedWithdrawalRouter/binding.go +++ b/pkg/bindings/DelayedWithdrawalRouter/binding.go @@ -44,7 +44,7 @@ type IDelayedWithdrawalRouterUserDelayedWithdrawals struct { // DelayedWithdrawalRouterMetaData contains all meta data concerning the DelayedWithdrawalRouter contract. var DelayedWithdrawalRouterMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canClaimDelayedWithdrawal\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createDelayedWithdrawal\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getClaimableUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userDelayedWithdrawalByIndex\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.UserDelayedWithdrawals\",\"components\":[{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawalsLength\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelayedWithdrawalCreated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"index\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelayedWithdrawalsClaimed\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amountClaimed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001f0e38038062001f0e8339810160408190526200003491620001a8565b6001600160a01b038116620000cb5760405162461bcd60e51b815260206004820152604c60248201527f44656c617965645769746864726177616c526f757465722e636f6e737472756360448201527f746f723a205f656967656e506f644d616e616765722063616e6e6f742062652060648201526b7a65726f206164647265737360a01b608482015260a4015b60405180910390fd5b6001600160a01b038116608052620000e2620000e9565b50620001da565b600054610100900460ff1615620001535760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000c2565b60005460ff9081161015620001a6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611d11620001fd600039600081816101fa0152610c000152611d116000f3fe60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000000000000000000000000000000000000000000169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea264697066735822122000d7cf28f4403941c299573f87dac2e0ac298f40aace10d232ce8c2e9d0894a564736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001f0e38038062001f0e8339810160408190526200003491620001a8565b6001600160a01b038116620000cb5760405162461bcd60e51b815260206004820152604c60248201527f44656c617965645769746864726177616c526f757465722e636f6e737472756360448201527f746f723a205f656967656e506f644d616e616765722063616e6e6f742062652060648201526b7a65726f206164647265737360a01b608482015260a4015b60405180910390fd5b6001600160a01b038116608052620000e2620000e9565b50620001da565b600054610100900460ff1615620001535760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000c2565b60005460ff9081161015620001a6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611d11620001fd600039600081816101fa0152610c000152611d116000f3fe60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000000000000000000000000000000000000000000169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea264697066735822122005b0ecc66b0468e43c0d5b0ff9c7b1e449b7556e61ae26d108ff696ed83f730364736f6c634300080c0033", } // DelayedWithdrawalRouterABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelegationManager/binding.go b/pkg/bindings/DelegationManager/binding.go index 46c335b3f..d244533e3 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -63,7 +63,7 @@ type ISignatureUtilsSignatureWithExpiry struct { // DelegationManagerMetaData contains all meta data concerning the DelegationManager contract. var DelegationManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDelegatableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newMinWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b5060405162005c4638038062005c46833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a1d6200022960003960006126a00152600081816105b10152818161102e015281816113aa01528181611c23015281816129f901528181613eac0152614398015260006107620152600081816104f901528181610ffc0152818161137801528181611cb701528181612ac601528181612c4901528181613fd2015261443e0152615a1d6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a61035536600461484e565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a23660046148b4565b6109ce565b6103ba6103b536600461484e565b610a90565b604051610364919061490f565b6103da6103d53660046149ac565b610df9565b005b6103da6103ea3660046149ff565b610f3e565b6103da6103fd366004614a23565b610ff1565b6103da610410366004614a64565b6110a8565b6103da610423366004614a7d565b6111e7565b61035a6104363660046149ff565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a23565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614ae8565b611229565b6103da6104bc366004614a23565b61136d565b61035a6104cf3660046149ff565b609b6020526000908152604090205481565b6103da6104ef366004614b8f565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149ff565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149ff565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e8c565b611641565b610575610606366004614ec8565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ef9565b611671565b6103da610644366004614a64565b61170c565b61051b6106573660046149ff565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149ff565b61171d565b6103da611757565b61035a61069b366004614f88565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615069565b61176b565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150f9565b611997565b6040516103649190615183565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da610738366004615196565b611a71565b61035a61074b3660046149ff565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a64565b609e6020526000908152604090205460ff1681565b6105756107b53660046151cb565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149ff565b60a16020526000908152604090205481565b61086e61080c3660046149ff565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151f7565b611b43565b61035a62034bc081565b6108d46108cf3660046149ff565b611bfc565b604051610364929190615278565b6103ba6108f03660046149ff565b611fb4565b6103da61090336600461529d565b612478565b6103da6109163660046152f5565b612595565b6103da6109293660046149ff565b612626565b61035a61269c565b6103da610944366004614a64565b6126da565b609d54600090815b838110156109c657600060a1600087878581811061097157610971615311565b905060200201602081019061098691906149ff565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf8161533d565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c61269c565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc90615358565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c31565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b43615311565b9050602002810190610b55919061538f565b610b639060208101906153af565b9050878783818110610b7757610b77615311565b9050602002810190610b89919061538f565b610b9390806153af565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b615311565b9050602002810190610c2d919061538f565b610c3e9060608101906040016149ff565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd1615311565b9050602002810190610ce3919061538f565b610cf49060608101906040016149ff565b8a8a86818110610d0657610d06615311565b9050602002810190610d18919061538f565b610d2290806153af565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d68615311565b9050602002810190610d7a919061538f565b610d889060208101906153af565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061283692505050565b838281518110610dd157610dd1615311565b602090810291909101015280610de68161533d565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612df6565b604080518082019091526060815260006020820152610eb43380836000612fe9565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153f8565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f3092919061544a565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615479565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc90615496565b610fee8161327f565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154e0565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613376565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611114919061553d565b6111305760405162461bcd60e51b8152600401610abc9061555a565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133f1565b6110a18484848461344b565b6001600160a01b0383166000908152609b602052604081205461122085828686611b43565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613671565b6112fb61375b565b609755611307896137f2565b61131086613844565b61131c8585858561344b565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154e0565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561393e565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc90615358565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be615311565b90506020028101906114d091906155a2565b8989848181106114e2576114e2615311565b90506020028101906114f491906153af565b89898681811061150657611506615311565b9050602002013588888781811061151f5761151f615311565b905060200201602081019061153491906155b8565b6139b9565b6115428161533d565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e6919061553d565b6116025760405162461bcd60e51b8152600401610abc9061555a565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615649565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc90615358565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139b9565b5050600160c95550505050565b6117146133f1565b610fee81613844565b60006001600160a01b0382161580159061175157506001600160a01b038083166000818152609a6020526040902054909116145b92915050565b61175f6133f1565b61176960006137f2565b565b42836020015110156117ef5760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117f88561155a565b156118815760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b61188a8461171d565b6119165760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119528783888860200151611b43565b6001600160a01b0388166000908152609b60205260409020600184019055855190915061198290889083906141a3565b61198e87878686612fe9565b50505050505050565b6060600082516001600160401b038111156119b4576119b4614c31565b6040519080825280602002602001820160405280156119dd578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a1b57611a1b615311565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a5657611a56615311565b6020908102919091010152611a6a8161533d565b90506119e3565b611a7a3361171d565b611afc5760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b3792919061544a565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611bb961269c565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c90919061565c565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611d00573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d2891908101906156d0565b9150915060008313611d3f57909590945092505050565b606080835160001415611df9576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611db457611db4615311565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611de857611de8615311565b602002602001018181525050611fa7565b8351611e0690600161578a565b6001600160401b03811115611e1d57611e1d614c31565b604051908082528060200260200182016040528015611e46578160200160208202803683370190505b50915081516001600160401b03811115611e6257611e62614c31565b604051908082528060200260200182016040528015611e8b578160200160208202803683370190505b50905060005b8451811015611f2557848181518110611eac57611eac615311565b6020026020010151838281518110611ec657611ec6615311565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611ef857611ef8615311565b6020026020010151828281518110611f1257611f12615311565b6020908102919091010152600101611e91565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f4a91906157a2565b81518110611f5a57611f5a615311565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f8a91906157a2565b81518110611f9a57611f9a615311565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fe05760405162461bcd60e51b8152600401610abc90615358565b611fe98361155a565b6120695760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120728361171d565b156120e55760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121615760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a6020526040902054909116903314806121945750336001600160a01b038216145b806121bb57506001600160a01b038181166000908152609960205260409020600101541633145b61222d5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061223986611bfc565b9092509050336001600160a01b0387161461228f57826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b0319169055815161231157604080516000815260208101909152945061246f565b81516001600160401b0381111561232a5761232a614c31565b604051908082528060200260200182016040528015612353578160200160208202803683370190505b50945060005b825181101561246d576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123b9576123b9615311565b6020026020010151826000815181106123d4576123d4615311565b60200260200101906001600160a01b031690816001600160a01b03168152505083838151811061240657612406615311565b60200260200101518160008151811061242157612421615311565b60200260200101818152505061243a89878b8585612836565b88848151811061244c5761244c615311565b602002602001018181525050505080806124659061533d565b915050612359565b505b50505050919050565b6124813361155a565b156124ff5760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6125088361171d565b6125895760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fe9565b61259e3361171d565b61261c5760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612df6565b61262e6133f1565b6001600160a01b0381166126935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137f2565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126cd575060975490565b6126d561375b565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561272d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127519190615479565b6001600160a01b0316336001600160a01b0316146127815760405162461bcd60e51b8152600401610abc90615496565b6066541981196066541916146127ff5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128cd5760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b82516129575760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612d04576001600160a01b038616156129b0576129b0868886848151811061298957612989615311565b60200260200101518685815181106129a3576129a3615311565b6020026020010151613376565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129e0576129e0615311565b60200260200101516001600160a01b03161415612aa9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a3957612a39615311565b60200260200101516040518363ffffffff1660e01b8152600401612a729291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a8c57600080fd5b505af1158015612aa0573d6000803e3d6000fd5b50505050612cfc565b846001600160a01b0316876001600160a01b03161480612b7b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612b0557612b05615311565b60200260200101516040518263ffffffff1660e01b8152600401612b3891906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b79919061553d565b155b612c475760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c8957612c89615311565b6020026020010151868581518110612ca357612ca3615311565b60200260200101516040518463ffffffff1660e01b8152600401612cc9939291906157b9565b600060405180830381600087803b158015612ce357600080fd5b505af1158015612cf7573d6000803e3d6000fd5b505050505b60010161295a565b506001600160a01b0386166000908152609f60205260408120805491829190612d2c8361533d565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d9482611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612de290839085906157dd565b60405180910390a198975050505050505050565b6213c680612e0a60608301604084016157f6565b63ffffffff161115612ebf5760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612efb90606084019084016157f6565b63ffffffff161015612f915760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612fb58282615833565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b379084906153f8565b606654600090600190811614156130125760405162461bcd60e51b8152600401610abc90615358565b6001600160a01b038085166000908152609960205260409020600101541680158015906130485750336001600160a01b03821614155b801561305d5750336001600160a01b03861614155b156131ca5742846020015110156130dc5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff16156131765760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff191660011790558501516131b79088908890859088906109ce565b90506131c8828287600001516141a3565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061322988611bfc565b9150915060005b825181101561136257613277888a85848151811061325057613250615311565b602002602001015185858151811061326a5761326a615311565b602002602001015161393e565b600101613230565b6001600160a01b03811661330d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038085166000908152609860209081526040808320938616835292905290812080548392906133ad9084906157a2565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157b9565b6033546001600160a01b031633146117695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134d35760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136695760008686838181106134f3576134f3615311565b905060200201602081019061350891906149ff565b6001600160a01b038116600090815260a1602052604081205491925086868581811061353657613536615311565b90506020020135905062034bc08111156135fa5760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a1505050806136629061533d565b90506134d7565b505050505050565b6065546001600160a01b031615801561369257506001600160a01b03821615155b6137145760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26137578261327f565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138fd5760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061397590849061578a565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157b9565b60006139c76105f387615896565b6000818152609e602052604090205490915060ff16613a485760405162461bcd60e51b815260206004820152604360248201526000805160206159c883398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a5d60a0890160808a016157f6565b63ffffffff16613a6d919061578a565b1115613af55760405162461bcd60e51b815260206004820152605f60248201526000805160206159c883398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613b0560608701604088016149ff565b6001600160a01b0316336001600160a01b031614613b925760405162461bcd60e51b815260206004820152605060248201526000805160206159c883398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613c1457613ba560a08701876153af565b85149050613c145760405162461bcd60e51b815260206004820152604260248201526000805160206159c883398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d795760005b613c4060a08801886153af565b9050811015613d73574360a16000613c5b60a08b018b6153af565b85818110613c6b57613c6b615311565b9050602002016020810190613c8091906149ff565b6001600160a01b03168152602081019190915260400160002054613caa60a08a0160808b016157f6565b63ffffffff16613cba919061578a565b1115613cd85760405162461bcd60e51b8152600401610abc906158a2565b613d6b613ce860208901896149ff565b33613cf660a08b018b6153af565b85818110613d0657613d06615311565b9050602002016020810190613d1b91906149ff565b613d2860c08c018c6153af565b86818110613d3857613d38615311565b905060200201358a8a87818110613d5157613d51615311565b9050602002016020810190613d6691906149ff565b61435d565b600101613c33565b50614168565b336000908152609a60205260408120546001600160a01b0316905b613da160a08901896153af565b9050811015614165574360a16000613dbc60a08c018c6153af565b85818110613dcc57613dcc615311565b9050602002016020810190613de191906149ff565b6001600160a01b03168152602081019190915260400160002054613e0b60a08b0160808c016157f6565b63ffffffff16613e1b919061578a565b1115613e395760405162461bcd60e51b8152600401610abc906158a2565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e5b60a08a018a6153af565b83818110613e6b57613e6b615311565b9050602002016020810190613e8091906149ff565b6001600160a01b03161415613fd0576000613e9e60208a018a6149ff565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613edf60c08e018e6153af565b87818110613eef57613eef615311565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f67919061565c565b6001600160a01b038084166000908152609a6020526040902054919250168015613fc857613fc88184613f9d60a08f018f6153af565b88818110613fad57613fad615311565b9050602002016020810190613fc291906149ff565b8561393e565b50505061415d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea13389898581811061401257614012615311565b905060200201602081019061402791906149ff565b61403460a08d018d6153af565b8681811061404457614044615311565b905060200201602081019061405991906149ff565b61406660c08e018e6153af565b8781811061407657614076615311565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140d657600080fd5b505af11580156140ea573d6000803e3d6000fd5b505050506001600160a01b0382161561415d5761415d823361410f60a08c018c6153af565b8581811061411f5761411f615311565b905060200201602081019061413491906149ff565b61414160c08d018d6153af565b8681811061415157614151615311565b9050602002013561393e565b600101613d94565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142bd57604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141e3908690869060040161592a565b602060405180830381865afa158015614200573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142249190615987565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142d1838361449d565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156144085760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143d1908890889087906004016157b9565b600060405180830381600087803b1580156143eb57600080fd5b505af11580156143ff573d6000803e3d6000fd5b50505050614496565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561448257600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b60008060006144ac85856144b9565b915091506109c681614529565b6000808251604114156144f05760208301516040840151606085015160001a6144e4878285856146e4565b94509450505050614522565b82516040141561451a576020830151604084015161450f8683836147d1565b935093505050614522565b506000905060025b9250929050565b600081600481111561453d5761453d6159b1565b14156145465750565b600181600481111561455a5761455a6159b1565b14156145a85760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145bc576145bc6159b1565b141561460a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b600381600481111561461e5761461e6159b1565b14156146775760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b600481600481111561468b5761468b6159b1565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561471b57506000905060036147c8565b8460ff16601b1415801561473357508460ff16601c14155b1561474457506000905060046147c8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614798573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147c1576000600192509250506147c8565b9150600090505b94509492505050565b6000806001600160ff1b038316816147ee60ff86901c601b61578a565b90506147fc878288856146e4565b935093505050935093915050565b60008083601f84011261481c57600080fd5b5081356001600160401b0381111561483357600080fd5b6020830191508360208260051b850101111561452257600080fd5b6000806020838503121561486157600080fd5b82356001600160401b0381111561487757600080fd5b6148838582860161480a565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b80356148af8161488f565b919050565b600080600080600060a086880312156148cc57600080fd5b85356148d78161488f565b945060208601356148e78161488f565b935060408601356148f78161488f565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b818110156149475783518352928401929184019160010161492b565b50909695505050505050565b60006060828403121561496557600080fd5b50919050565b60008083601f84011261497d57600080fd5b5081356001600160401b0381111561499457600080fd5b60208301915083602082850101111561452257600080fd5b6000806000608084860312156149c157600080fd5b6149cb8585614953565b925060608401356001600160401b038111156149e657600080fd5b6149f28682870161496b565b9497909650939450505050565b600060208284031215614a1157600080fd5b8135614a1c8161488f565b9392505050565b600080600060608486031215614a3857600080fd5b8335614a438161488f565b92506020840135614a538161488f565b929592945050506040919091013590565b600060208284031215614a7657600080fd5b5035919050565b60008060008060408587031215614a9357600080fd5b84356001600160401b0380821115614aaa57600080fd5b614ab68883890161480a565b90965094506020870135915080821115614acf57600080fd5b50614adc8782880161480a565b95989497509550505050565b60008060008060008060008060c0898b031215614b0457600080fd5b8835614b0f8161488f565b97506020890135614b1f8161488f565b9650604089013595506060890135945060808901356001600160401b0380821115614b4957600080fd5b614b558c838d0161480a565b909650945060a08b0135915080821115614b6e57600080fd5b50614b7b8b828c0161480a565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614bab57600080fd5b88356001600160401b0380821115614bc257600080fd5b614bce8c838d0161480a565b909a50985060208b0135915080821115614be757600080fd5b614bf38c838d0161480a565b909850965060408b0135915080821115614c0c57600080fd5b614c188c838d0161480a565b909650945060608b0135915080821115614b6e57600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c6957614c69614c31565b60405290565b604080519081016001600160401b0381118282101715614c6957614c69614c31565b604051601f8201601f191681016001600160401b0381118282101715614cb957614cb9614c31565b604052919050565b63ffffffff81168114610fee57600080fd5b80356148af81614cc1565b60006001600160401b03821115614cf757614cf7614c31565b5060051b60200190565b600082601f830112614d1257600080fd5b81356020614d27614d2283614cde565b614c91565b82815260059290921b84018101918181019086841115614d4657600080fd5b8286015b84811015614d6a578035614d5d8161488f565b8352918301918301614d4a565b509695505050505050565b600082601f830112614d8657600080fd5b81356020614d96614d2283614cde565b82815260059290921b84018101918181019086841115614db557600080fd5b8286015b84811015614d6a5780358352918301918301614db9565b600060e08284031215614de257600080fd5b614dea614c47565b9050614df5826148a4565b8152614e03602083016148a4565b6020820152614e14604083016148a4565b604082015260608201356060820152614e2f60808301614cd3565b608082015260a08201356001600160401b0380821115614e4e57600080fd5b614e5a85838601614d01565b60a084015260c0840135915080821115614e7357600080fd5b50614e8084828501614d75565b60c08301525092915050565b600060208284031215614e9e57600080fd5b81356001600160401b03811115614eb457600080fd5b614ec084828501614dd0565b949350505050565b600060208284031215614eda57600080fd5b813560ff81168114614a1c57600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614f1157600080fd5b85356001600160401b0380821115614f2857600080fd5b9087019060e0828a031215614f3c57600080fd5b90955060208701359080821115614f5257600080fd5b50614f5f8882890161480a565b909550935050604086013591506060860135614f7a81614eeb565b809150509295509295909350565b60008060408385031215614f9b57600080fd5b8235614fa68161488f565b91506020830135614fb68161488f565b809150509250929050565b600060408284031215614fd357600080fd5b614fdb614c6f565b905081356001600160401b0380821115614ff457600080fd5b818401915084601f83011261500857600080fd5b813560208282111561501c5761501c614c31565b61502e601f8301601f19168201614c91565b9250818352868183860101111561504457600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561508157600080fd5b853561508c8161488f565b9450602086013561509c8161488f565b935060408601356001600160401b03808211156150b857600080fd5b6150c489838a01614fc1565b945060608801359150808211156150da57600080fd5b506150e788828901614fc1565b95989497509295608001359392505050565b6000806040838503121561510c57600080fd5b82356151178161488f565b915060208301356001600160401b0381111561513257600080fd5b61513e85828601614d01565b9150509250929050565b600081518084526020808501945080840160005b838110156151785781518752958201959082019060010161515c565b509495945050505050565b602081526000614a1c6020830184615148565b600080602083850312156151a957600080fd5b82356001600160401b038111156151bf57600080fd5b6148838582860161496b565b600080604083850312156151de57600080fd5b82356151e98161488f565b946020939093013593505050565b6000806000806080858703121561520d57600080fd5b84356152188161488f565b935060208501359250604085013561522f8161488f565b9396929550929360600135925050565b600081518084526020808501945080840160005b838110156151785781516001600160a01b031687529582019590820190600101615253565b60408152600061528b604083018561523f565b82810360208401526112208185615148565b6000806000606084860312156152b257600080fd5b83356152bd8161488f565b925060208401356001600160401b038111156152d857600080fd5b6152e486828701614fc1565b925050604084013590509250925092565b60006060828403121561530757600080fd5b614a1c8383614953565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561535157615351615327565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e198336030181126153a557600080fd5b9190910192915050565b6000808335601e198436030181126153c657600080fd5b8301803591506001600160401b038211156153e057600080fd5b6020019150600581901b360382131561452257600080fd5b6060810182356154078161488f565b6001600160a01b0390811683526020840135906154238261488f565b166020830152604083013561543781614cc1565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561548b57600080fd5b8151614a1c8161488f565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561554f57600080fd5b8151614a1c81614eeb565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de198336030181126153a557600080fd5b6000602082840312156155ca57600080fd5b8135614a1c81614eeb565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261563060e085018261523f565b905060c083015184820360c08601526112208282615148565b602081526000614a1c60208301846155d5565b60006020828403121561566e57600080fd5b5051919050565b600082601f83011261568657600080fd5b81516020615696614d2283614cde565b82815260059290921b840181019181810190868411156156b557600080fd5b8286015b84811015614d6a57805183529183019183016156b9565b600080604083850312156156e357600080fd5b82516001600160401b03808211156156fa57600080fd5b818501915085601f83011261570e57600080fd5b8151602061571e614d2283614cde565b82815260059290921b8401810191818101908984111561573d57600080fd5b948201945b838610156157645785516157558161488f565b82529482019490820190615742565b9188015191965090935050508082111561577d57600080fd5b5061513e85828601615675565b6000821982111561579d5761579d615327565b500190565b6000828210156157b4576157b4615327565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ec060408301846155d5565b60006020828403121561580857600080fd5b8135614a1c81614cc1565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561583e8161488f565b6158488183615813565b5060018101602083013561585b8161488f565b6158658183615813565b50604083013561587481614cc1565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006117513683614dd0565b6020808252606e908201526000805160206159c883398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561595e57858101830151858201606001528201615942565b81811115615970576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561599957600080fd5b81516001600160e01b031981168114614a1c57600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a2646970667358221220bf8d86bcdd28ced1de84f8b1df4241e41ec500e2d5f60b98850fd1866eb2cace64736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a26469706673582212204f8ba68b8a28e3effef34dcfd60594e2fbd9e919cbab8917dc02c14df97507da64736f6c634300080c0033", } // DelegationManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go index f421d0a34..13f14ddf7 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -62,7 +62,7 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_delayedWithdrawalRouter\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activateRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delayedWithdrawalRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mostRecentWithdrawalTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonBeaconChainETHBalanceWei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provenWithdrawal\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sumOfPartialWithdrawalsClaimedGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyAndProcessWithdrawals\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"withdrawalProofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.WithdrawalProof[]\",\"components\":[{\"name\":\"withdrawalProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"slotProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"executionPayloadProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"timestampProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"historicalSummaryBlockRootProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blockRootIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"historicalSummaryIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"withdrawalIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestampRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"executionPayloadRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"},{\"name\":\"withdrawalFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyBalanceUpdates\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawBeforeRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawNonBeaconChainETHBalanceWei\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountToWithdraw\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FullWithdrawalRedeemed\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"withdrawalTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PartialWithdrawalRedeemed\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"withdrawalTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"partialWithdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x6101206040523480156200001257600080fd5b5060405162005fc038038062005fc083398101604081905262000035916200016f565b6001600160a01b0380861660805284811660a052831660c0526001600160401b0380831660e0528116610100526200006c62000077565b5050505050620001e7565b600054610100900460ff1615620000e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000137576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014f57600080fd5b50565b80516001600160401b03811681146200016a57600080fd5b919050565b600080600080600060a086880312156200018857600080fd5b8551620001958162000139565b6020870151909550620001a88162000139565b6040870151909450620001bb8162000139565b9250620001cb6060870162000152565b9150620001db6080870162000152565b90509295509295909350565b60805160a05160c05160e05161010051615cde620002e2600039600081816105b501528181612030015281816120e7015261213f015260008181610275015281816125d00152818161260401528181612c3001528181612c5d015281816143a401526143df01526000818161036d01528181610614015281816107a701528181610aef01528181610c4401528181610dcc01528181610f87015281816111680152818161129c0152818161146d015281816118ba01528181611a6201528181611ba101528181611d6e01528181611e58015261315401526000818161024101526133c60152600081816104520152610e970152615cde6000f3fe6080604052600436106101855760003560e01c806374cdd798116100d1578063c49074421161008a578063e251ef5211610064578063e251ef5214610563578063e2c8344514610583578063f2882461146105a3578063fe80b087146105d757600080fd5b8063c490744214610503578063c4d66de814610523578063dda3346c1461054357600080fd5b806374cdd7981461044057806387e0d289146104745780639b4e46341461049b578063a50600f4146104ae578063b522538a146104ce578063baa7145a146104ee57600080fd5b806334bea20a1161013e57806358eaee791161011857806358eaee791461038f5780635d3f65b6146103bc5780636fcd0e53146103dc5780637439841f1461040957600080fd5b806334bea20a146103005780633f65cf191461033b5780634665bcda1461035b57600080fd5b80630b18ff66146101db5780630cd4649e146102185780631a5057be1461022f5780631d905d5c146102635780633106ab53146102af5780633474aa16146102e057600080fd5b366101d657346037600082825461019c9190614c9f565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101e757600080fd5b506033546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561022457600080fd5b5061022d6105fb565b005b34801561023b57600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160401b03909116815260200161020f565b3480156102bb57600080fd5b506034546102d090600160401b900460ff1681565b604051901515815260200161020f565b3480156102ec57600080fd5b50603454610297906001600160401b031681565b34801561030c57600080fd5b506102d061031b366004614cdc565b603560209081526000928352604080842090915290825290205460ff1681565b34801561034757600080fd5b5061022d610356366004614d6f565b610764565b34801561036757600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561039b57600080fd5b506103af6103aa366004614e80565b610caf565b60405161020f9190614ef9565b3480156103c857600080fd5b50603854610297906001600160401b031681565b3480156103e857600080fd5b506103fc6103f7366004614f07565b610d14565b60405161020f9190614f20565b34801561041557600080fd5b506103af610424366004614f07565b600090815260366020526040902054600160c01b900460ff1690565b34801561044c57600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561048057600080fd5b5060335461029790600160a01b90046001600160401b031681565b61022d6104a9366004614f68565b610dc1565b3480156104ba57600080fd5b5061022d6104c9366004614fdb565b610f6e565b3480156104da57600080fd5b506103fc6104e9366004614e80565b611304565b3480156104fa57600080fd5b5061022d6113f7565b34801561050f57600080fd5b5061022d61051e366004615085565b611462565b34801561052f57600080fd5b5061022d61053e3660046150b1565b61169f565b34801561054f57600080fd5b5061022d61055e3660046151cb565b611877565b34801561056f57600080fd5b5061022d61057e36600461529c565b611a4a565b34801561058f57600080fd5b5061022d61059e366004615085565b611e15565b3480156105af57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e357600080fd5b506105ed60375481565b60405190815260200161020f565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106879190615397565b156106ad5760405162461bcd60e51b81526004016106a4906153b9565b60405180910390fd5b6033546001600160a01b031633146106d75760405162461bcd60e51b81526004016106a490615416565b603454600160401b900460ff16156107015760405162461bcd60e51b81526004016106a49061545e565b6034805460ff60401b1916600160401b179055603354610729906001600160a01b0316611ff8565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b0316331461078e5760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190615397565b156108375760405162461bcd60e51b81526004016106a4906153b9565b603454600160401b900460ff166108af5760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60648201526084016106a4565b85841480156108bd57508382145b61094d5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a4016106a4565b603354600160a01b90046001600160401b031615806109a2575060335461098c9061098790600160a01b90046001600160401b031661202c565b612116565b6001600160401b0316896001600160401b031610155b610a2e5760405162461bcd60e51b815260206004820152605160248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2070726f6f66206d75737420626520696e207468652065706f63686064820152701030b33a32b91030b1ba34bb30ba34b7b760791b608482015260a4016106a4565b42610a44613f486001600160401b038c16614c9f565b1015610acd5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a166004820152610b76907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6291906154ad565b8935610b7160208c018c6154c6565b612163565b6000805b87811015610c1a57610bfc8b8b358b8b85818110610b9a57610b9a61550c565b9050602002016020810190610baf9190615522565b8a8a86818110610bc157610bc161550c565b9050602002810190610bd391906154c6565b8a8a88818110610be557610be561550c565b9050602002810190610bf79190615549565b6122f1565b610c069083614c9f565b915080610c1281615592565b915050610b7a565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c40906044015b600060405180830381600087803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b5050505050505050505050505050565b600080610cf184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127ab92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610d3c6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610da757610da7614ec1565b6002811115610db857610db8614ec1565b90525092915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e095760405162461bcd60e51b81526004016106a4906155ad565b346801bc16d674ec80000014610e955760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a4016106a4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610ed86128a5565b8888886040518863ffffffff1660e01b8152600401610efc9695949392919061567f565b6000604051808303818588803b158015610f1557600080fd5b505af1158015610f29573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610f5f9291906156ce565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190615397565b156110175760405162461bcd60e51b81526004016106a4906153b9565b868414801561102557508382145b6110ae5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207660448201527f616c696461746f72496e646963657320616e642070726f6f6673206d7573742060648201526d0c4ca40e6c2daca40d8cadccee8d60931b608482015260a4016106a4565b426110c4613f486001600160401b038c16614c9f565b10156111465760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207360448201527f70656369666965642074696d657374616d7020697320746f6f2066617220696e606482015264081c185cdd60da1b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a1660048201526111ea907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa1580156111b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111db91906154ad565b8735610b7160208a018a6154c6565b6000805b8881101561128e576112708b8b8b8481811061120c5761120c61550c565b90506020020160208101906112219190615522565b8a358a8a868181106112355761123561550c565b905060200281019061124791906154c6565b8a8a888181106112595761125961550c565b905060200281019061126b9190615549565b6128ea565b61127a90836156e2565b91508061128681615592565b9150506111ee565b506033546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163c2c51c4091166112d3633b9aca0085615723565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610c71565b61132c6040805160808101825260008082526020820181905291810182905290606082015290565b6036600061136f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127ab92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156113dc576113dc614ec1565b60028111156113ed576113ed614ec1565b9052509392505050565b6033546001600160a01b031633146114215760405162461bcd60e51b81526004016106a490615416565b603454600160401b900460ff161561144b5760405162461bcd60e51b81526004016106a49061545e565b603354611460906001600160a01b0316611ff8565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114aa5760405162461bcd60e51b81526004016106a4906155ad565b6114b8633b9aca00826157be565b156115425760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a4016106a4565b6000611552633b9aca00836157d2565b6034549091506001600160401b03908116908216111561160b5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c4016106a4565b603480548291906000906116299084906001600160401b03166157e6565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161168891815260200190565b60405180910390a261169a8383612dc8565b505050565b600054610100900460ff16158080156116bf5750600054600160ff909116105b806116d95750303b1580156116d9575060005460ff166001145b61173c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106a4565b6000805460ff19166001179055801561175f576000805461ff0019166101001790555b6001600160a01b0382166117d25760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b60648201526084016106a4565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611873576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118a15760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192d9190615397565b1561194a5760405162461bcd60e51b81526004016106a4906153b9565b82518451146119d55760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a4016106a4565b60005b8451811015611a4357611a31838583815181106119f7576119f761550c565b6020026020010151878481518110611a1157611a1161550c565b60200260200101516001600160a01b0316612dd29092919063ffffffff16565b80611a3b81615592565b9150506119d8565b5050505050565b604051635ac86ab760e01b81526004808201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad59190615397565b15611af25760405162461bcd60e51b81526004016106a4906153b9565b8386148015611b0057508588145b8015611b0b57508782145b611b7f576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e67746860648201526084016106a4565b60405163d1c64cc960e01b81526001600160401b038c166004820152611c23907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1491906154ad565b8b35610b7160208e018e6154c6565b604080518082019091526000808252602082015260005b83811015611d23576000611cde8d358d8d85818110611c5b57611c5b61550c565b9050602002810190611c6d919061580e565b8c8c86818110611c7f57611c7f61550c565b9050602002810190611c9191906154c6565b8c8c88818110611ca357611ca361550c565b9050602002810190611cb59190615549565b8c8c8a818110611cc757611cc761550c565b9050602002810190611cd99190615549565b612e24565b80518451919250908490611cf3908390614c9f565b9052506020808201519084018051611d0c9083906156e2565b905250819050611d1b81615592565b915050611c3a565b50805115611d52576033548151611d52916001600160a01b031690611d4d90633b9aca009061582f565b61339c565b602081015115611e075760335460208201516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263c2c51c4092911690611da890633b9aca0090615723565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611dee57600080fd5b505af1158015611e02573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611e3f5760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecb9190615397565b15611ee85760405162461bcd60e51b81526004016106a4906153b9565b603754821115611f995760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c4016106a4565b8160376000828254611fab919061584e565b90915550506040518281526001600160a01b038416907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a261169a838361339c565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755612029814761339c565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160401b0316826001600160401b031610156120d65760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e6573697300000000000000000060648201526084016106a4565b6120e2600c6020615865565b61210c7f0000000000000000000000000000000000000000000000000000000000000000846157e6565b610d0e9190615894565b6000612124600c6020615865565b61212f8360016158ba565b6121399190615865565b610d0e907f00000000000000000000000000000000000000000000000000000000000000006158ba565b61216f6003602061582f565b81146121ff5760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a4016106a4565b61224482828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506003905061342a565b6122eb5760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c4016106a4565b50505050565b60008061233084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561239f5761239f614ec1565b60028111156123b0576123b0614ec1565b90525090506000816060015160028111156123cd576123cd614ec1565b146124765760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c4016106a4565b61247e6128a5565b612487906158e5565b6124c386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061346692505050565b1461254a5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a4016106a4565b600061258886868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061347b92505050565b90506125988a87878b8b8e6134a0565b603980549060006125a883615592565b90915550506001606083015264ffffffffff891682526001600160401b038b811660408401527f00000000000000000000000000000000000000000000000000000000000000008116908216111561262e576001600160401b037f000000000000000000000000000000000000000000000000000000000000000016602083015261263e565b6001600160401b03811660208301525b6000838152603660209081526040918290208451815492860151938601516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060850151859391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360028111156126dc576126dc614ec1565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516127779392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b031661279c919061582f565b9b9a5050505050505050505050565b600081516030146128345760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a4016106a4565b60405160029061284b908490600090602001615909565b60408051601f198184030181529082905261286591615938565b602060405180830381855afa158015612882573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610d0e91906154ad565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b60008061292984848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061347b92505050565b9050600061296985858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156129d8576129d8614ec1565b60028111156129e9576129e9614ec1565b8152505090508a6001600160401b031681604001516001600160401b031610612aa05760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a4016106a4565b600181606001516002811115612ab857612ab8614ec1565b14612b205760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b60648201526084016106a4565b612b298b61202c565b6001600160401b0316612b6e8787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136f792505050565b6001600160401b031611612c11576000836001600160401b031611612c115760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a4016106a4565b612c1f8987878b8b8f6134a0565b602081015160006001600160401b037f000000000000000000000000000000000000000000000000000000000000000081169086161115612c8157507f0000000000000000000000000000000000000000000000000000000000000000612c84565b50835b6001600160401b0380821660208086019182528f831660408088019182526000898152603690935290912086518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606086015186939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612d2c57612d2c614ec1565b0217905550905050816001600160401b0316816001600160401b031614612db8577f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df8c8e83604051612da39392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1612db5818361370f565b95505b5050505050979650505050505050565b611873828261372e565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261169a908490613847565b6040805180820190915260008082526020820152612e49612e44896159b9565b613919565b6033546001600160401b03600160a01b90910481169082161015612f0b5760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60448201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520617460648201527f206f72206166746572206d6f7374526563656e745769746864726177616c546960848201526606d657374616d760cc1b60a482015260c4016106a4565b6000612f19612e448b6159b9565b90506000612f5988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612f8657612f86614ec1565b141561303d5760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c4016106a4565b60008181526035602090815260408083206001600160401b038616845290915290205460ff16156130fc5760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a4016106a4565b6001603560008381526020019081526020016000206000846001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506131d98c87878e7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166344e71c806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d49190615af5565b613929565b600061321787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061434a92505050565b90506132278d8a8a8e8e866134a0565b600061326588888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061436292505050565b90506132a38a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136f792505050565b6001600160401b03166132bd6132b88f6159b9565b61437a565b6001600160401b03161061337557603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b81049093169381019390935261336a93869388938a936001600160a01b03909316928892916060830190600160c01b900460ff16600281111561335157613351614ec1565b600281111561336257613362614ec1565b90525061438c565b95505050505061338f565b60335461336a90839086906001600160a01b0316846145ca565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063c0db354c9083906044016000604051808303818588803b15801561340d57600080fd5b505af1158015613421573d6000803e3d6000fd5b50505050505050565b6000836134388685856146a8565b1495945050505050565b6000816000815181106134575761345761550c565b60200260200101519050919050565b6000816001815181106134575761345761550c565b6000610d0e826002815181106134935761349361550c565b60200260200101516147f4565b6134ac60036002615bf6565b84146135375760405162461bcd60e51b815260206004820152604e60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b600561354560286001614c9f565b61354f9190614c9f565b61355a90602061582f565b82146135da5760405162461bcd60e51b815260206004820152604360248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a4016106a4565b600064ffffffffff82166135f060286001614c9f565b600b901b179050600061363587878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061485b92505050565b905061367b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c925085915086905061342a565b6136ed5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f6600000060648201526084016106a4565b5050505050505050565b6000610d0e826007815181106134935761349361550c565b60006137276001600160401b03808416908516615c02565b9392505050565b8047101561377e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106a4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137cb576040519150601f19603f3d011682016040523d82523d6000602084013e6137d0565b606091505b505090508061169a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106a4565b600061389c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614b089092919063ffffffff16565b80519091501561169a57808060200190518101906138ba9190615397565b61169a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a4565b6000610d0e8261014001516147f4565b613934600280615bf6565b83146139a85760405162461bcd60e51b81526020600482015260496024820152600080516020615c8983398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a4016106a4565b6139b4600d6002615bf6565b6139c460c0840160a08501615c41565b6001600160401b031610613a2e5760405162461bcd60e51b815260206004820152603f6024820152600080516020615c8983398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c617267650060648201526084016106a4565b613a3a60046002615bf6565b613a4b610100840160e08501615c41565b6001600160401b031610613ab7576040805162461bcd60e51b8152602060048201526024810191909152600080516020615c8983398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c6172676560648201526084016106a4565b613ac360186002615bf6565b613ad360e0840160c08501615c41565b6001600160401b031610613b4d5760405162461bcd60e51b81526020600482015260476024820152600080516020615c8983398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a4016106a4565b60006001600160401b038216613b65612e44856159b9565b6001600160401b031610613b7a576005613b7d565b60045b9050613b8a600482614c9f565b613b95906001614c9f565b613ba090602061582f565b613baa84806154c6565b905014613c1e5760405162461bcd60e51b81526020600482015260486024820152600080516020615c8983398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a4016106a4565b613c2a60046003614c9f565b613c3590602061582f565b613c4260408501856154c6565b905014613cbc5760405162461bcd60e51b815260206004820152604e6024820152600080516020615c8983398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b613cc86003602061582f565b613cd560208501856154c6565b905014613d435760405162461bcd60e51b81526020600482015260426024820152600080516020615c8983398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a4016106a4565b613d4e81602061582f565b613d5b60608501856154c6565b905014613dce5760405162461bcd60e51b81526020600482015260476024820152600080516020615c8983398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a4016106a4565b600d613ddc60186001614c9f565b613de7906005614c9f565b613df2906001614c9f565b613dfc9190614c9f565b613e0790602061582f565b613e1460808501856154c6565b905014613e9d5760405162461bcd60e51b81526020600482015260586024820152600080516020615c8983398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a4016106a4565b6000613eaf60c0850160a08601615c41565b6001600160401b03166000613ec6600d6001614c9f565b613ed660e0880160c08901615c41565b6001600160401b0316901b600d613eef60186001614c9f565b613efa906001614c9f565b613f049190614c9f565b601b901b1717179050613f5f613f1d60808601866154c6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925050506101008701358461342a565b613fd25760405162461bcd60e51b815260206004820152604a6024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a4016106a4565b614029613fe260208601866154c6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506101008a013593506101208a01359250905061342a565b6140895760405162461bcd60e51b815260206004820152603d6024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f6600000060648201526084016106a4565b60496140e161409b60408701876154c6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101008701356101608801358461342a565b6141535760405162461bcd60e51b81526020600482015260496024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a4016106a4565b506141ab61416460608601866154c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160860135610140870135600961342a565b6142165760405162461bcd60e51b81526020600482015260426024820152600080516020615c8983398151915260448201527f616c3a20496e76616c69642074696d657374616d70206d65726b6c652070726f60648201526137b360f11b608482015260a4016106a4565b6000614229610100860160e08701615c41565b6001600160401b031661423e60046001614c9f565b600e901b179050600061428388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061485b92505050565b90506142d361429287806154c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160880135838561342a565b61433f5760405162461bcd60e51b81526020600482015260436024820152600080516020615c8983398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a4016106a4565b505050505050505050565b6000610d0e826001815181106134935761349361550c565b6000610d0e826003815181106134935761349361550c565b6000602061210c8361012001516147f4565b604080518082019091526000808252602082015260007f00000000000000000000000000000000000000000000000000000000000000006001600160401b0316846001600160401b0316111561440357507f0000000000000000000000000000000000000000000000000000000000000000614406565b50825b604080518082019091526000808252602082015261442482866157e6565b6001600160401b039081168252603480548492600091614446918591166158ba565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555061447882856020015161370f565b602082015260028460600151600281111561449557614495614ec1565b146144b757603980549060006144aa83615c5e565b9091555050600260608501525b600060208086018281528a83526036909152604091829020865181549251938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516929091169190911792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600281111561455c5761455c614ec1565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a26038805483919060009061465b9084906001600160401b03166158ba565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b600083516000141580156146c75750602084516146c591906157be565b155b6147565760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a4016106a4565b604080516020808201909252848152905b855181116147ea5761477a6002856157be565b6147ad578151600052808601516020526020826040600060026107d05a03fa6147a257600080fd5b6002840493506147d8565b8086015160005281516020526020826040600060026107d05a03fa6147d157600080fd5b6002840493505b6147e3602082614c9f565b9050614767565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6000806002835161486c91906157d2565b90506000816001600160401b03811115614888576148886150ce565b6040519080825280602002602001820160405280156148b1578160200160208202803683370190505b50905060005b828110156149b8576002856148cc838361582f565b815181106148dc576148dc61550c565b6020026020010151868360026148f2919061582f565b6148fd906001614c9f565b8151811061490d5761490d61550c565b602002602001015160405160200161492f929190918252602082015260400190565b60408051601f198184030181529082905261494991615938565b602060405180830381855afa158015614966573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061498991906154ad565b82828151811061499b5761499b61550c565b6020908102919091010152806149b081615592565b9150506148b7565b506149c46002836157d2565b91505b8115614ae45760005b82811015614ad1576002826149e5838361582f565b815181106149f5576149f561550c565b602002602001015183836002614a0b919061582f565b614a16906001614c9f565b81518110614a2657614a2661550c565b6020026020010151604051602001614a48929190918252602082015260400190565b60408051601f1981840301815290829052614a6291615938565b602060405180830381855afa158015614a7f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614aa291906154ad565b828281518110614ab457614ab461550c565b602090810291909101015280614ac981615592565b9150506149d0565b50614add6002836157d2565b91506149c7565b80600081518110614af757614af761550c565b602002602001015192505050919050565b6060614b178484600085614b1f565b949350505050565b606082471015614b805760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a4565b6001600160a01b0385163b614bd75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a4565b600080866001600160a01b03168587604051614bf39190615938565b60006040518083038185875af1925050503d8060008114614c30576040519150601f19603f3d011682016040523d82523d6000602084013e614c35565b606091505b5091509150614c45828286614c50565b979650505050505050565b60608315614c5f575081613727565b825115614c6f5782518084602001fd5b8160405162461bcd60e51b81526004016106a49190615c75565b634e487b7160e01b600052601160045260246000fd5b60008219821115614cb257614cb2614c89565b500190565b6001600160401b038116811461202957600080fd5b8035614cd781614cb7565b919050565b60008060408385031215614cef57600080fd5b823591506020830135614d0181614cb7565b809150509250929050565b600060408284031215614d1e57600080fd5b50919050565b60008083601f840112614d3657600080fd5b5081356001600160401b03811115614d4d57600080fd5b6020830191508360208260051b8501011115614d6857600080fd5b9250929050565b60008060008060008060008060a0898b031215614d8b57600080fd5b8835614d9681614cb7565b975060208901356001600160401b0380821115614db257600080fd5b614dbe8c838d01614d0c565b985060408b0135915080821115614dd457600080fd5b614de08c838d01614d24565b909850965060608b0135915080821115614df957600080fd5b614e058c838d01614d24565b909650945060808b0135915080821115614e1e57600080fd5b50614e2b8b828c01614d24565b999c989b5096995094979396929594505050565b60008083601f840112614e5157600080fd5b5081356001600160401b03811115614e6857600080fd5b602083019150836020828501011115614d6857600080fd5b60008060208385031215614e9357600080fd5b82356001600160401b03811115614ea957600080fd5b614eb585828601614e3f565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110614ef557634e487b7160e01b600052602160045260246000fd5b9052565b60208101610d0e8284614ed7565b600060208284031215614f1957600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151614f616060840182614ed7565b5092915050565b600080600080600060608688031215614f8057600080fd5b85356001600160401b0380821115614f9757600080fd5b614fa389838a01614e3f565b90975095506020880135915080821115614fbc57600080fd5b50614fc988828901614e3f565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614ff757600080fd5b883561500281614cb7565b975060208901356001600160401b038082111561501e57600080fd5b61502a8c838d01614d24565b909950975060408b013591508082111561504357600080fd5b61504f8c838d01614d0c565b965060608b0135915080821115614df957600080fd5b6001600160a01b038116811461202957600080fd5b8035614cd781615065565b6000806040838503121561509857600080fd5b82356150a381615065565b946020939093013593505050565b6000602082840312156150c357600080fd5b813561372781615065565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715615107576151076150ce565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615135576151356150ce565b604052919050565b60006001600160401b03821115615156576151566150ce565b5060051b60200190565b600082601f83011261517157600080fd5b813560206151866151818361513d565b61510d565b82815260059290921b840181019181810190868411156151a557600080fd5b8286015b848110156151c057803583529183019183016151a9565b509695505050505050565b6000806000606084860312156151e057600080fd5b83356001600160401b03808211156151f757600080fd5b818601915086601f83011261520b57600080fd5b8135602061521b6151818361513d565b82815260059290921b8401810191818101908a84111561523a57600080fd5b948201945b8386101561526157853561525281615065565b8252948201949082019061523f565b9750508701359250508082111561527757600080fd5b5061528486828701615160565b9250506152936040850161507a565b90509250925092565b60008060008060008060008060008060c08b8d0312156152bb57600080fd5b6152c48b614ccc565b995060208b01356001600160401b03808211156152e057600080fd5b6152ec8e838f01614d0c565b9a5060408d013591508082111561530257600080fd5b61530e8e838f01614d24565b909a50985060608d013591508082111561532757600080fd5b6153338e838f01614d24565b909850965060808d013591508082111561534c57600080fd5b6153588e838f01614d24565b909650945060a08d013591508082111561537157600080fd5b5061537e8d828e01614d24565b915080935050809150509295989b9194979a5092959850565b6000602082840312156153a957600080fd5b8151801515811461372757600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b6000602082840312156154bf57600080fd5b5051919050565b6000808335601e198436030181126154dd57600080fd5b8301803591506001600160401b038211156154f757600080fd5b602001915036819003821315614d6857600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561553457600080fd5b813564ffffffffff8116811461372757600080fd5b6000808335601e1984360301811261556057600080fd5b8301803591506001600160401b0382111561557a57600080fd5b6020019150600581901b3603821315614d6857600080fd5b60006000198214156155a6576155a6614c89565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561564257818101518382015260200161562a565b838111156122eb5750506000910152565b6000815180845261566b816020860160208601615627565b601f01601f19169290920160200192915050565b60808152600061569360808301888a6155fe565b82810360208401526156a58188615653565b905082810360408401526156ba8186886155fe565b915050826060830152979650505050505050565b602081526000614b176020830184866155fe565b600080821280156001600160ff1b038490038513161561570457615704614c89565b600160ff1b839003841281161561571d5761571d614c89565b50500190565b60006001600160ff1b038184138284138082168684048611161561574957615749614c89565b600160ff1b600087128281168783058912161561576857615768614c89565b6000871292508782058712848416161561578457615784614c89565b8785058712818416161561579a5761579a614c89565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b6000826157cd576157cd6157a8565b500690565b6000826157e1576157e16157a8565b500490565b60006001600160401b038381169083168181101561580657615806614c89565b039392505050565b6000823561017e1983360301811261582557600080fd5b9190910192915050565b600081600019048311821515161561584957615849614c89565b500290565b60008282101561586057615860614c89565b500390565b60006001600160401b038083168185168183048111821515161561588b5761588b614c89565b02949350505050565b60006001600160401b03808416806158ae576158ae6157a8565b92169190910492915050565b60006001600160401b038083168185168083038211156158dc576158dc614c89565b01949350505050565b80516020808301519190811015614d1e5760001960209190910360031b1b16919050565b6000835161591b818460208801615627565b6001600160801b0319939093169190920190815260100192915050565b60008251615825818460208701615627565b600082601f83011261595b57600080fd5b81356001600160401b03811115615974576159746150ce565b615987601f8201601f191660200161510d565b81815284602083860101111561599c57600080fd5b816020850160208301376000918101602001919091529392505050565b600061018082360312156159cc57600080fd5b6159d46150e4565b82356001600160401b03808211156159eb57600080fd5b6159f73683870161594a565b83526020850135915080821115615a0d57600080fd5b615a193683870161594a565b60208401526040850135915080821115615a3257600080fd5b615a3e3683870161594a565b60408401526060850135915080821115615a5757600080fd5b615a633683870161594a565b60608401526080850135915080821115615a7c57600080fd5b50615a893682860161594a565b608083015250615a9b60a08401614ccc565b60a0820152615aac60c08401614ccc565b60c0820152615abd60e08401614ccc565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b600060208284031215615b0757600080fd5b815161372781614cb7565b600181815b80851115615b4d578160001904821115615b3357615b33614c89565b80851615615b4057918102915b93841c9390800290615b17565b509250929050565b600082615b6457506001610d0e565b81615b7157506000610d0e565b8160018114615b875760028114615b9157615bad565b6001915050610d0e565b60ff841115615ba257615ba2614c89565b50506001821b610d0e565b5060208310610133831016604e8410600b8410161715615bd0575081810a610d0e565b615bda8383615b12565b8060001904821115615bee57615bee614c89565b029392505050565b60006137278383615b55565b60008083128015600160ff1b850184121615615c2057615c20614c89565b6001600160ff1b0384018313811615615c3b57615c3b614c89565b50500390565b600060208284031215615c5357600080fd5b813561372781614cb7565b600081615c6d57615c6d614c89565b506000190190565b602081526000613727602083018461565356fe426561636f6e436861696e50726f6f66732e7665726966795769746864726177a2646970667358221220e5f0580eaf920c7bb34bd03d57402971f7a2c3f15a9ab7d5abe6370698a66e8964736f6c634300080c0033", + Bin: "0x6101206040523480156200001257600080fd5b5060405162005fc038038062005fc083398101604081905262000035916200016f565b6001600160a01b0380861660805284811660a052831660c0526001600160401b0380831660e0528116610100526200006c62000077565b5050505050620001e7565b600054610100900460ff1615620000e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000137576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014f57600080fd5b50565b80516001600160401b03811681146200016a57600080fd5b919050565b600080600080600060a086880312156200018857600080fd5b8551620001958162000139565b6020870151909550620001a88162000139565b6040870151909450620001bb8162000139565b9250620001cb6060870162000152565b9150620001db6080870162000152565b90509295509295909350565b60805160a05160c05160e05161010051615cde620002e2600039600081816105b501528181612030015281816120e7015261213f015260008181610275015281816125d00152818161260401528181612c3001528181612c5d015281816143a401526143df01526000818161036d01528181610614015281816107a701528181610aef01528181610c4401528181610dcc01528181610f87015281816111680152818161129c0152818161146d015281816118ba01528181611a6201528181611ba101528181611d6e01528181611e58015261315401526000818161024101526133c60152600081816104520152610e970152615cde6000f3fe6080604052600436106101855760003560e01c806374cdd798116100d1578063c49074421161008a578063e251ef5211610064578063e251ef5214610563578063e2c8344514610583578063f2882461146105a3578063fe80b087146105d757600080fd5b8063c490744214610503578063c4d66de814610523578063dda3346c1461054357600080fd5b806374cdd7981461044057806387e0d289146104745780639b4e46341461049b578063a50600f4146104ae578063b522538a146104ce578063baa7145a146104ee57600080fd5b806334bea20a1161013e57806358eaee791161011857806358eaee791461038f5780635d3f65b6146103bc5780636fcd0e53146103dc5780637439841f1461040957600080fd5b806334bea20a146103005780633f65cf191461033b5780634665bcda1461035b57600080fd5b80630b18ff66146101db5780630cd4649e146102185780631a5057be1461022f5780631d905d5c146102635780633106ab53146102af5780633474aa16146102e057600080fd5b366101d657346037600082825461019c9190614c9f565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101e757600080fd5b506033546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561022457600080fd5b5061022d6105fb565b005b34801561023b57600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160401b03909116815260200161020f565b3480156102bb57600080fd5b506034546102d090600160401b900460ff1681565b604051901515815260200161020f565b3480156102ec57600080fd5b50603454610297906001600160401b031681565b34801561030c57600080fd5b506102d061031b366004614cdc565b603560209081526000928352604080842090915290825290205460ff1681565b34801561034757600080fd5b5061022d610356366004614d6f565b610764565b34801561036757600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561039b57600080fd5b506103af6103aa366004614e80565b610caf565b60405161020f9190614ef9565b3480156103c857600080fd5b50603854610297906001600160401b031681565b3480156103e857600080fd5b506103fc6103f7366004614f07565b610d14565b60405161020f9190614f20565b34801561041557600080fd5b506103af610424366004614f07565b600090815260366020526040902054600160c01b900460ff1690565b34801561044c57600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561048057600080fd5b5060335461029790600160a01b90046001600160401b031681565b61022d6104a9366004614f68565b610dc1565b3480156104ba57600080fd5b5061022d6104c9366004614fdb565b610f6e565b3480156104da57600080fd5b506103fc6104e9366004614e80565b611304565b3480156104fa57600080fd5b5061022d6113f7565b34801561050f57600080fd5b5061022d61051e366004615085565b611462565b34801561052f57600080fd5b5061022d61053e3660046150b1565b61169f565b34801561054f57600080fd5b5061022d61055e3660046151cb565b611877565b34801561056f57600080fd5b5061022d61057e36600461529c565b611a4a565b34801561058f57600080fd5b5061022d61059e366004615085565b611e15565b3480156105af57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e357600080fd5b506105ed60375481565b60405190815260200161020f565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106879190615397565b156106ad5760405162461bcd60e51b81526004016106a4906153b9565b60405180910390fd5b6033546001600160a01b031633146106d75760405162461bcd60e51b81526004016106a490615416565b603454600160401b900460ff16156107015760405162461bcd60e51b81526004016106a49061545e565b6034805460ff60401b1916600160401b179055603354610729906001600160a01b0316611ff8565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b0316331461078e5760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190615397565b156108375760405162461bcd60e51b81526004016106a4906153b9565b603454600160401b900460ff166108af5760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60648201526084016106a4565b85841480156108bd57508382145b61094d5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a4016106a4565b603354600160a01b90046001600160401b031615806109a2575060335461098c9061098790600160a01b90046001600160401b031661202c565b612116565b6001600160401b0316896001600160401b031610155b610a2e5760405162461bcd60e51b815260206004820152605160248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2070726f6f66206d75737420626520696e207468652065706f63686064820152701030b33a32b91030b1ba34bb30ba34b7b760791b608482015260a4016106a4565b42610a44613f486001600160401b038c16614c9f565b1015610acd5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a166004820152610b76907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6291906154ad565b8935610b7160208c018c6154c6565b612163565b6000805b87811015610c1a57610bfc8b8b358b8b85818110610b9a57610b9a61550c565b9050602002016020810190610baf9190615522565b8a8a86818110610bc157610bc161550c565b9050602002810190610bd391906154c6565b8a8a88818110610be557610be561550c565b9050602002810190610bf79190615549565b6122f1565b610c069083614c9f565b915080610c1281615592565b915050610b7a565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c40906044015b600060405180830381600087803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b5050505050505050505050505050565b600080610cf184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127ab92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610d3c6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610da757610da7614ec1565b6002811115610db857610db8614ec1565b90525092915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e095760405162461bcd60e51b81526004016106a4906155ad565b346801bc16d674ec80000014610e955760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a4016106a4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610ed86128a5565b8888886040518863ffffffff1660e01b8152600401610efc9695949392919061567f565b6000604051808303818588803b158015610f1557600080fd5b505af1158015610f29573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610f5f9291906156ce565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190615397565b156110175760405162461bcd60e51b81526004016106a4906153b9565b868414801561102557508382145b6110ae5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207660448201527f616c696461746f72496e646963657320616e642070726f6f6673206d7573742060648201526d0c4ca40e6c2daca40d8cadccee8d60931b608482015260a4016106a4565b426110c4613f486001600160401b038c16614c9f565b10156111465760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207360448201527f70656369666965642074696d657374616d7020697320746f6f2066617220696e606482015264081c185cdd60da1b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a1660048201526111ea907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa1580156111b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111db91906154ad565b8735610b7160208a018a6154c6565b6000805b8881101561128e576112708b8b8b8481811061120c5761120c61550c565b90506020020160208101906112219190615522565b8a358a8a868181106112355761123561550c565b905060200281019061124791906154c6565b8a8a888181106112595761125961550c565b905060200281019061126b9190615549565b6128ea565b61127a90836156e2565b91508061128681615592565b9150506111ee565b506033546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163c2c51c4091166112d3633b9aca0085615723565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610c71565b61132c6040805160808101825260008082526020820181905291810182905290606082015290565b6036600061136f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127ab92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156113dc576113dc614ec1565b60028111156113ed576113ed614ec1565b9052509392505050565b6033546001600160a01b031633146114215760405162461bcd60e51b81526004016106a490615416565b603454600160401b900460ff161561144b5760405162461bcd60e51b81526004016106a49061545e565b603354611460906001600160a01b0316611ff8565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114aa5760405162461bcd60e51b81526004016106a4906155ad565b6114b8633b9aca00826157be565b156115425760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a4016106a4565b6000611552633b9aca00836157d2565b6034549091506001600160401b03908116908216111561160b5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c4016106a4565b603480548291906000906116299084906001600160401b03166157e6565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161168891815260200190565b60405180910390a261169a8383612dc8565b505050565b600054610100900460ff16158080156116bf5750600054600160ff909116105b806116d95750303b1580156116d9575060005460ff166001145b61173c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106a4565b6000805460ff19166001179055801561175f576000805461ff0019166101001790555b6001600160a01b0382166117d25760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b60648201526084016106a4565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611873576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118a15760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192d9190615397565b1561194a5760405162461bcd60e51b81526004016106a4906153b9565b82518451146119d55760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a4016106a4565b60005b8451811015611a4357611a31838583815181106119f7576119f761550c565b6020026020010151878481518110611a1157611a1161550c565b60200260200101516001600160a01b0316612dd29092919063ffffffff16565b80611a3b81615592565b9150506119d8565b5050505050565b604051635ac86ab760e01b81526004808201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad59190615397565b15611af25760405162461bcd60e51b81526004016106a4906153b9565b8386148015611b0057508588145b8015611b0b57508782145b611b7f576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e67746860648201526084016106a4565b60405163d1c64cc960e01b81526001600160401b038c166004820152611c23907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1491906154ad565b8b35610b7160208e018e6154c6565b604080518082019091526000808252602082015260005b83811015611d23576000611cde8d358d8d85818110611c5b57611c5b61550c565b9050602002810190611c6d919061580e565b8c8c86818110611c7f57611c7f61550c565b9050602002810190611c9191906154c6565b8c8c88818110611ca357611ca361550c565b9050602002810190611cb59190615549565b8c8c8a818110611cc757611cc761550c565b9050602002810190611cd99190615549565b612e24565b80518451919250908490611cf3908390614c9f565b9052506020808201519084018051611d0c9083906156e2565b905250819050611d1b81615592565b915050611c3a565b50805115611d52576033548151611d52916001600160a01b031690611d4d90633b9aca009061582f565b61339c565b602081015115611e075760335460208201516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263c2c51c4092911690611da890633b9aca0090615723565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611dee57600080fd5b505af1158015611e02573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611e3f5760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecb9190615397565b15611ee85760405162461bcd60e51b81526004016106a4906153b9565b603754821115611f995760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c4016106a4565b8160376000828254611fab919061584e565b90915550506040518281526001600160a01b038416907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a261169a838361339c565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755612029814761339c565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160401b0316826001600160401b031610156120d65760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e6573697300000000000000000060648201526084016106a4565b6120e2600c6020615865565b61210c7f0000000000000000000000000000000000000000000000000000000000000000846157e6565b610d0e9190615894565b6000612124600c6020615865565b61212f8360016158ba565b6121399190615865565b610d0e907f00000000000000000000000000000000000000000000000000000000000000006158ba565b61216f6003602061582f565b81146121ff5760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a4016106a4565b61224482828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506003905061342a565b6122eb5760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c4016106a4565b50505050565b60008061233084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561239f5761239f614ec1565b60028111156123b0576123b0614ec1565b90525090506000816060015160028111156123cd576123cd614ec1565b146124765760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c4016106a4565b61247e6128a5565b612487906158e5565b6124c386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061346692505050565b1461254a5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a4016106a4565b600061258886868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061347b92505050565b90506125988a87878b8b8e6134a0565b603980549060006125a883615592565b90915550506001606083015264ffffffffff891682526001600160401b038b811660408401527f00000000000000000000000000000000000000000000000000000000000000008116908216111561262e576001600160401b037f000000000000000000000000000000000000000000000000000000000000000016602083015261263e565b6001600160401b03811660208301525b6000838152603660209081526040918290208451815492860151938601516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060850151859391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360028111156126dc576126dc614ec1565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516127779392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b031661279c919061582f565b9b9a5050505050505050505050565b600081516030146128345760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a4016106a4565b60405160029061284b908490600090602001615909565b60408051601f198184030181529082905261286591615938565b602060405180830381855afa158015612882573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610d0e91906154ad565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b60008061292984848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061347b92505050565b9050600061296985858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156129d8576129d8614ec1565b60028111156129e9576129e9614ec1565b8152505090508a6001600160401b031681604001516001600160401b031610612aa05760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a4016106a4565b600181606001516002811115612ab857612ab8614ec1565b14612b205760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b60648201526084016106a4565b612b298b61202c565b6001600160401b0316612b6e8787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136f792505050565b6001600160401b031611612c11576000836001600160401b031611612c115760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a4016106a4565b612c1f8987878b8b8f6134a0565b602081015160006001600160401b037f000000000000000000000000000000000000000000000000000000000000000081169086161115612c8157507f0000000000000000000000000000000000000000000000000000000000000000612c84565b50835b6001600160401b0380821660208086019182528f831660408088019182526000898152603690935290912086518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606086015186939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612d2c57612d2c614ec1565b0217905550905050816001600160401b0316816001600160401b031614612db8577f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df8c8e83604051612da39392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1612db5818361370f565b95505b5050505050979650505050505050565b611873828261372e565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261169a908490613847565b6040805180820190915260008082526020820152612e49612e44896159b9565b613919565b6033546001600160401b03600160a01b90910481169082161015612f0b5760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60448201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520617460648201527f206f72206166746572206d6f7374526563656e745769746864726177616c546960848201526606d657374616d760cc1b60a482015260c4016106a4565b6000612f19612e448b6159b9565b90506000612f5988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612f8657612f86614ec1565b141561303d5760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c4016106a4565b60008181526035602090815260408083206001600160401b038616845290915290205460ff16156130fc5760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a4016106a4565b6001603560008381526020019081526020016000206000846001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506131d98c87878e7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166344e71c806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d49190615af5565b613929565b600061321787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061434a92505050565b90506132278d8a8a8e8e866134a0565b600061326588888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061436292505050565b90506132a38a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136f792505050565b6001600160401b03166132bd6132b88f6159b9565b61437a565b6001600160401b03161061337557603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b81049093169381019390935261336a93869388938a936001600160a01b03909316928892916060830190600160c01b900460ff16600281111561335157613351614ec1565b600281111561336257613362614ec1565b90525061438c565b95505050505061338f565b60335461336a90839086906001600160a01b0316846145ca565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063c0db354c9083906044016000604051808303818588803b15801561340d57600080fd5b505af1158015613421573d6000803e3d6000fd5b50505050505050565b6000836134388685856146a8565b1495945050505050565b6000816000815181106134575761345761550c565b60200260200101519050919050565b6000816001815181106134575761345761550c565b6000610d0e826002815181106134935761349361550c565b60200260200101516147f4565b6134ac60036002615bf6565b84146135375760405162461bcd60e51b815260206004820152604e60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b600561354560286001614c9f565b61354f9190614c9f565b61355a90602061582f565b82146135da5760405162461bcd60e51b815260206004820152604360248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a4016106a4565b600064ffffffffff82166135f060286001614c9f565b600b901b179050600061363587878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061485b92505050565b905061367b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c925085915086905061342a565b6136ed5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f6600000060648201526084016106a4565b5050505050505050565b6000610d0e826007815181106134935761349361550c565b60006137276001600160401b03808416908516615c02565b9392505050565b8047101561377e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106a4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137cb576040519150601f19603f3d011682016040523d82523d6000602084013e6137d0565b606091505b505090508061169a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106a4565b600061389c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614b089092919063ffffffff16565b80519091501561169a57808060200190518101906138ba9190615397565b61169a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a4565b6000610d0e8261014001516147f4565b613934600280615bf6565b83146139a85760405162461bcd60e51b81526020600482015260496024820152600080516020615c8983398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a4016106a4565b6139b4600d6002615bf6565b6139c460c0840160a08501615c41565b6001600160401b031610613a2e5760405162461bcd60e51b815260206004820152603f6024820152600080516020615c8983398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c617267650060648201526084016106a4565b613a3a60046002615bf6565b613a4b610100840160e08501615c41565b6001600160401b031610613ab7576040805162461bcd60e51b8152602060048201526024810191909152600080516020615c8983398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c6172676560648201526084016106a4565b613ac360186002615bf6565b613ad360e0840160c08501615c41565b6001600160401b031610613b4d5760405162461bcd60e51b81526020600482015260476024820152600080516020615c8983398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a4016106a4565b60006001600160401b038216613b65612e44856159b9565b6001600160401b031610613b7a576005613b7d565b60045b9050613b8a600482614c9f565b613b95906001614c9f565b613ba090602061582f565b613baa84806154c6565b905014613c1e5760405162461bcd60e51b81526020600482015260486024820152600080516020615c8983398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a4016106a4565b613c2a60046003614c9f565b613c3590602061582f565b613c4260408501856154c6565b905014613cbc5760405162461bcd60e51b815260206004820152604e6024820152600080516020615c8983398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b613cc86003602061582f565b613cd560208501856154c6565b905014613d435760405162461bcd60e51b81526020600482015260426024820152600080516020615c8983398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a4016106a4565b613d4e81602061582f565b613d5b60608501856154c6565b905014613dce5760405162461bcd60e51b81526020600482015260476024820152600080516020615c8983398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a4016106a4565b600d613ddc60186001614c9f565b613de7906005614c9f565b613df2906001614c9f565b613dfc9190614c9f565b613e0790602061582f565b613e1460808501856154c6565b905014613e9d5760405162461bcd60e51b81526020600482015260586024820152600080516020615c8983398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a4016106a4565b6000613eaf60c0850160a08601615c41565b6001600160401b03166000613ec6600d6001614c9f565b613ed660e0880160c08901615c41565b6001600160401b0316901b600d613eef60186001614c9f565b613efa906001614c9f565b613f049190614c9f565b601b901b1717179050613f5f613f1d60808601866154c6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925050506101008701358461342a565b613fd25760405162461bcd60e51b815260206004820152604a6024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a4016106a4565b614029613fe260208601866154c6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506101008a013593506101208a01359250905061342a565b6140895760405162461bcd60e51b815260206004820152603d6024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f6600000060648201526084016106a4565b60496140e161409b60408701876154c6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101008701356101608801358461342a565b6141535760405162461bcd60e51b81526020600482015260496024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a4016106a4565b506141ab61416460608601866154c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160860135610140870135600961342a565b6142165760405162461bcd60e51b81526020600482015260426024820152600080516020615c8983398151915260448201527f616c3a20496e76616c69642074696d657374616d70206d65726b6c652070726f60648201526137b360f11b608482015260a4016106a4565b6000614229610100860160e08701615c41565b6001600160401b031661423e60046001614c9f565b600e901b179050600061428388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061485b92505050565b90506142d361429287806154c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160880135838561342a565b61433f5760405162461bcd60e51b81526020600482015260436024820152600080516020615c8983398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a4016106a4565b505050505050505050565b6000610d0e826001815181106134935761349361550c565b6000610d0e826003815181106134935761349361550c565b6000602061210c8361012001516147f4565b604080518082019091526000808252602082015260007f00000000000000000000000000000000000000000000000000000000000000006001600160401b0316846001600160401b0316111561440357507f0000000000000000000000000000000000000000000000000000000000000000614406565b50825b604080518082019091526000808252602082015261442482866157e6565b6001600160401b039081168252603480548492600091614446918591166158ba565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555061447882856020015161370f565b602082015260028460600151600281111561449557614495614ec1565b146144b757603980549060006144aa83615c5e565b9091555050600260608501525b600060208086018281528a83526036909152604091829020865181549251938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516929091169190911792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600281111561455c5761455c614ec1565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a26038805483919060009061465b9084906001600160401b03166158ba565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b600083516000141580156146c75750602084516146c591906157be565b155b6147565760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a4016106a4565b604080516020808201909252848152905b855181116147ea5761477a6002856157be565b6147ad578151600052808601516020526020826040600060026107d05a03fa6147a257600080fd5b6002840493506147d8565b8086015160005281516020526020826040600060026107d05a03fa6147d157600080fd5b6002840493505b6147e3602082614c9f565b9050614767565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6000806002835161486c91906157d2565b90506000816001600160401b03811115614888576148886150ce565b6040519080825280602002602001820160405280156148b1578160200160208202803683370190505b50905060005b828110156149b8576002856148cc838361582f565b815181106148dc576148dc61550c565b6020026020010151868360026148f2919061582f565b6148fd906001614c9f565b8151811061490d5761490d61550c565b602002602001015160405160200161492f929190918252602082015260400190565b60408051601f198184030181529082905261494991615938565b602060405180830381855afa158015614966573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061498991906154ad565b82828151811061499b5761499b61550c565b6020908102919091010152806149b081615592565b9150506148b7565b506149c46002836157d2565b91505b8115614ae45760005b82811015614ad1576002826149e5838361582f565b815181106149f5576149f561550c565b602002602001015183836002614a0b919061582f565b614a16906001614c9f565b81518110614a2657614a2661550c565b6020026020010151604051602001614a48929190918252602082015260400190565b60408051601f1981840301815290829052614a6291615938565b602060405180830381855afa158015614a7f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614aa291906154ad565b828281518110614ab457614ab461550c565b602090810291909101015280614ac981615592565b9150506149d0565b50614add6002836157d2565b91506149c7565b80600081518110614af757614af761550c565b602002602001015192505050919050565b6060614b178484600085614b1f565b949350505050565b606082471015614b805760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a4565b6001600160a01b0385163b614bd75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a4565b600080866001600160a01b03168587604051614bf39190615938565b60006040518083038185875af1925050503d8060008114614c30576040519150601f19603f3d011682016040523d82523d6000602084013e614c35565b606091505b5091509150614c45828286614c50565b979650505050505050565b60608315614c5f575081613727565b825115614c6f5782518084602001fd5b8160405162461bcd60e51b81526004016106a49190615c75565b634e487b7160e01b600052601160045260246000fd5b60008219821115614cb257614cb2614c89565b500190565b6001600160401b038116811461202957600080fd5b8035614cd781614cb7565b919050565b60008060408385031215614cef57600080fd5b823591506020830135614d0181614cb7565b809150509250929050565b600060408284031215614d1e57600080fd5b50919050565b60008083601f840112614d3657600080fd5b5081356001600160401b03811115614d4d57600080fd5b6020830191508360208260051b8501011115614d6857600080fd5b9250929050565b60008060008060008060008060a0898b031215614d8b57600080fd5b8835614d9681614cb7565b975060208901356001600160401b0380821115614db257600080fd5b614dbe8c838d01614d0c565b985060408b0135915080821115614dd457600080fd5b614de08c838d01614d24565b909850965060608b0135915080821115614df957600080fd5b614e058c838d01614d24565b909650945060808b0135915080821115614e1e57600080fd5b50614e2b8b828c01614d24565b999c989b5096995094979396929594505050565b60008083601f840112614e5157600080fd5b5081356001600160401b03811115614e6857600080fd5b602083019150836020828501011115614d6857600080fd5b60008060208385031215614e9357600080fd5b82356001600160401b03811115614ea957600080fd5b614eb585828601614e3f565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110614ef557634e487b7160e01b600052602160045260246000fd5b9052565b60208101610d0e8284614ed7565b600060208284031215614f1957600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151614f616060840182614ed7565b5092915050565b600080600080600060608688031215614f8057600080fd5b85356001600160401b0380821115614f9757600080fd5b614fa389838a01614e3f565b90975095506020880135915080821115614fbc57600080fd5b50614fc988828901614e3f565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614ff757600080fd5b883561500281614cb7565b975060208901356001600160401b038082111561501e57600080fd5b61502a8c838d01614d24565b909950975060408b013591508082111561504357600080fd5b61504f8c838d01614d0c565b965060608b0135915080821115614df957600080fd5b6001600160a01b038116811461202957600080fd5b8035614cd781615065565b6000806040838503121561509857600080fd5b82356150a381615065565b946020939093013593505050565b6000602082840312156150c357600080fd5b813561372781615065565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715615107576151076150ce565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615135576151356150ce565b604052919050565b60006001600160401b03821115615156576151566150ce565b5060051b60200190565b600082601f83011261517157600080fd5b813560206151866151818361513d565b61510d565b82815260059290921b840181019181810190868411156151a557600080fd5b8286015b848110156151c057803583529183019183016151a9565b509695505050505050565b6000806000606084860312156151e057600080fd5b83356001600160401b03808211156151f757600080fd5b818601915086601f83011261520b57600080fd5b8135602061521b6151818361513d565b82815260059290921b8401810191818101908a84111561523a57600080fd5b948201945b8386101561526157853561525281615065565b8252948201949082019061523f565b9750508701359250508082111561527757600080fd5b5061528486828701615160565b9250506152936040850161507a565b90509250925092565b60008060008060008060008060008060c08b8d0312156152bb57600080fd5b6152c48b614ccc565b995060208b01356001600160401b03808211156152e057600080fd5b6152ec8e838f01614d0c565b9a5060408d013591508082111561530257600080fd5b61530e8e838f01614d24565b909a50985060608d013591508082111561532757600080fd5b6153338e838f01614d24565b909850965060808d013591508082111561534c57600080fd5b6153588e838f01614d24565b909650945060a08d013591508082111561537157600080fd5b5061537e8d828e01614d24565b915080935050809150509295989b9194979a5092959850565b6000602082840312156153a957600080fd5b8151801515811461372757600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b6000602082840312156154bf57600080fd5b5051919050565b6000808335601e198436030181126154dd57600080fd5b8301803591506001600160401b038211156154f757600080fd5b602001915036819003821315614d6857600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561553457600080fd5b813564ffffffffff8116811461372757600080fd5b6000808335601e1984360301811261556057600080fd5b8301803591506001600160401b0382111561557a57600080fd5b6020019150600581901b3603821315614d6857600080fd5b60006000198214156155a6576155a6614c89565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561564257818101518382015260200161562a565b838111156122eb5750506000910152565b6000815180845261566b816020860160208601615627565b601f01601f19169290920160200192915050565b60808152600061569360808301888a6155fe565b82810360208401526156a58188615653565b905082810360408401526156ba8186886155fe565b915050826060830152979650505050505050565b602081526000614b176020830184866155fe565b600080821280156001600160ff1b038490038513161561570457615704614c89565b600160ff1b839003841281161561571d5761571d614c89565b50500190565b60006001600160ff1b038184138284138082168684048611161561574957615749614c89565b600160ff1b600087128281168783058912161561576857615768614c89565b6000871292508782058712848416161561578457615784614c89565b8785058712818416161561579a5761579a614c89565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b6000826157cd576157cd6157a8565b500690565b6000826157e1576157e16157a8565b500490565b60006001600160401b038381169083168181101561580657615806614c89565b039392505050565b6000823561017e1983360301811261582557600080fd5b9190910192915050565b600081600019048311821515161561584957615849614c89565b500290565b60008282101561586057615860614c89565b500390565b60006001600160401b038083168185168183048111821515161561588b5761588b614c89565b02949350505050565b60006001600160401b03808416806158ae576158ae6157a8565b92169190910492915050565b60006001600160401b038083168185168083038211156158dc576158dc614c89565b01949350505050565b80516020808301519190811015614d1e5760001960209190910360031b1b16919050565b6000835161591b818460208801615627565b6001600160801b0319939093169190920190815260100192915050565b60008251615825818460208701615627565b600082601f83011261595b57600080fd5b81356001600160401b03811115615974576159746150ce565b615987601f8201601f191660200161510d565b81815284602083860101111561599c57600080fd5b816020850160208301376000918101602001919091529392505050565b600061018082360312156159cc57600080fd5b6159d46150e4565b82356001600160401b03808211156159eb57600080fd5b6159f73683870161594a565b83526020850135915080821115615a0d57600080fd5b615a193683870161594a565b60208401526040850135915080821115615a3257600080fd5b615a3e3683870161594a565b60408401526060850135915080821115615a5757600080fd5b615a633683870161594a565b60608401526080850135915080821115615a7c57600080fd5b50615a893682860161594a565b608083015250615a9b60a08401614ccc565b60a0820152615aac60c08401614ccc565b60c0820152615abd60e08401614ccc565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b600060208284031215615b0757600080fd5b815161372781614cb7565b600181815b80851115615b4d578160001904821115615b3357615b33614c89565b80851615615b4057918102915b93841c9390800290615b17565b509250929050565b600082615b6457506001610d0e565b81615b7157506000610d0e565b8160018114615b875760028114615b9157615bad565b6001915050610d0e565b60ff841115615ba257615ba2614c89565b50506001821b610d0e565b5060208310610133831016604e8410600b8410161715615bd0575081810a610d0e565b615bda8383615b12565b8060001904821115615bee57615bee614c89565b029392505050565b60006137278383615b55565b60008083128015600160ff1b850184121615615c2057615c20614c89565b6001600160ff1b0384018313811615615c3b57615c3b614c89565b50500390565b600060208284031215615c5357600080fd5b813561372781614cb7565b600081615c6d57615c6d614c89565b506000190190565b602081526000613727602083018461565356fe426561636f6e436861696e50726f6f66732e7665726966795769746864726177a26469706673582212202cf491430d836cae9ba97e269c22bdbaca25b43574c5f33c7abb74cb222c0c1b64736f6c634300080c0033", } // EigenPodABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenPodManager/binding.go b/pkg/bindings/EigenPodManager/binding.go index 28304bf6e..ffa57eda7 100644 --- a/pkg/bindings/EigenPodManager/binding.go +++ b/pkg/bindings/EigenPodManager/binding.go @@ -32,7 +32,11 @@ var ( // EigenPodManagerMetaData contains all meta data concerning the EigenPodManager contract. var EigenPodManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainOracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"denebForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockRootAtTimestamp\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_beaconChainOracle\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDenebForkTimestamp\",\"inputs\":[{\"name\":\"newDenebForkTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateBeaconChainOracle\",\"inputs\":[{\"name\":\"newBeaconChainOracle\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconOracleUpdated\",\"inputs\":[{\"name\":\"newOracleAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DenebForkTimestampUpdated\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", +<<<<<<< HEAD Bin: "0x6101206040523480156200001257600080fd5b50604051620034e7380380620034e783398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e051610100516132a66200024160003960008181610636015281816106e001528181610b0e015281816113e70152818161187c015261196c01526000610542015260006102e601526000818161027a01528181611366015261203a0152600061041401526132a66000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063c052bd61116100a0578063d1c64cc91161006f578063d1c64cc914610604578063ea4d3c9b14610624578063f2fde38b14610658578063f6848d2414610678578063fabc1cbc146106b357600080fd5b8063c052bd6114610584578063c1de3aef146105a4578063c2c51c40146105c4578063cf756fdf146105e457600080fd5b8063a38406a3116100dc578063a38406a3146104fa578063a6a509be1461051a578063b134427114610530578063beffbb891461056457600080fd5b80638da5cb5b1461046b5780639104c319146104895780639b4e4634146104b15780639ba06275146104c457600080fd5b8063595c6a6711610185578063715018a611610154578063715018a6146103ed57806374cdd7981461040257806384d8106214610436578063886f11951461044b57600080fd5b8063595c6a67146103565780635ac86ab71461036b5780635c975abb146103ab57806360f4062b146103c057600080fd5b8063387b1300116101c1578063387b1300146102b457806339b70e38146102d457806344e71c8014610308578063463db0381461033657600080fd5b80630e81073c146101f357806310d67a2f14610226578063136439dd14610248578063292b7b2b14610268575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612406565b6106d3565b6040519081526020015b60405180910390f35b34801561023257600080fd5b50610246610241366004612432565b610911565b005b34801561025457600080fd5b5061024661026336600461244f565b6109c4565b34801561027457600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161021d565b3480156102c057600080fd5b506102466102cf366004612468565b610b03565b3480156102e057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031457600080fd5b5061031d610ea1565b60405167ffffffffffffffff909116815260200161021d565b34801561034257600080fd5b506102466103513660046124a9565b610eca565b34801561036257600080fd5b50610246611056565b34801561037757600080fd5b5061039b6103863660046124d3565b606654600160ff9092169190911b9081161490565b604051901515815260200161021d565b3480156103b757600080fd5b50606654610213565b3480156103cc57600080fd5b506102136103db366004612432565b609b6020526000908152604090205481565b3480156103f957600080fd5b5061024661111d565b34801561040e57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561044257600080fd5b5061029c611131565b34801561045757600080fd5b5060655461029c906001600160a01b031681565b34801561047757600080fd5b506033546001600160a01b031661029c565b34801561049557600080fd5b5061029c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102466104bf36600461253f565b61121b565b3480156104d057600080fd5b5061029c6104df366004612432565b6098602052600090815260409020546001600160a01b031681565b34801561050657600080fd5b5061029c610515366004612432565b61130a565b34801561052657600080fd5b5061021360995481565b34801561053c57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561057057600080fd5b5061024661057f366004612406565b6113dc565b34801561059057600080fd5b5060975461029c906001600160a01b031681565b3480156105b057600080fd5b506102466105bf366004612432565b6115f3565b3480156105d057600080fd5b506102466105df366004612406565b611604565b3480156105f057600080fd5b506102466105ff3660046125b3565b611a07565b34801561061057600080fd5b5061021361061f3660046124a9565b611b30565b34801561063057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066457600080fd5b50610246610673366004612432565b611c3b565b34801561068457600080fd5b5061039b610693366004612432565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156106bf57600080fd5b506102466106ce36600461244f565b611cb1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107265760405162461bcd60e51b815260040161071d90612604565b60405180910390fd5b6001600160a01b0383166107a25760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f2061646472657373000000000000606482015260840161071d565b60008212156108105760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b606482015260840161071d565b61081e633b9aca0083612678565b156108915760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e74000000606482015260840161071d565b6001600160a01b0383166000908152609b6020526040812054906108b584836126a2565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020613231833981519152906108f49087815260200190565b60405180910390a26109068282611e0d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610964573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098891906126e3565b6001600160a01b0316336001600160a01b0316146109b85760405162461bcd60e51b815260040161071d90612700565b6109c181611e4f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a30919061274a565b610a4c5760405162461bcd60e51b815260040161071d9061276c565b60665481811614610ac55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b4b5760405162461bcd60e51b815260040161071d90612604565b6001600160a01b038316610bc55760405162461bcd60e51b8152602060048201526047602482015260008051602061325183398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a40161071d565b6001600160a01b038216610c425760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a40161071d565b6000811215610cb15760405162461bcd60e51b8152602060048201526041602482015260008051602061325183398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a40161071d565b610cbf633b9aca0082612678565b15610d335760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a40161071d565b6001600160a01b0383166000908152609b602052604081205490811215610e26576000610d5f826127b4565b905080831115610dc4576001600160a01b0385166000908152609b6020526040812055610d8c81846127d1565b9250846001600160a01b031660008051602061323183398151915282604051610db791815260200190565b60405180910390a2610e24565b6001600160a01b0385166000908152609b602052604081208054859290610dec9084906126a2565b90915550506040518381526001600160a01b038616906000805160206132318339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b5050505050505050565b609c5460009067ffffffffffffffff1680610ec55767ffffffffffffffff91505090565b919050565b610ed2611f46565b67ffffffffffffffff8116610f645760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f7420736574206e657744656e6562466f726b546960648201526b06d657374616d7020746f20360a41b608482015260a40161071d565b609c5467ffffffffffffffff16156110005760405162461bcd60e51b815260206004820152605360248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f74207365742064656e6562466f726b54696d657360648201527274616d70206d6f7265207468616e206f6e636560681b608482015260a40161071d565b609c805467ffffffffffffffff191667ffffffffffffffff83169081179091556040519081527f19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db9060200160405180910390a150565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561109e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c2919061274a565b6110de5760405162461bcd60e51b815260040161071d9061276c565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b611125611f46565b61112f6000611fa0565b565b6066546000908190600190811614156111885760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03161561120a5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b606482015260840161071d565b6000611214611ff2565b9250505090565b606654600090600190811614156112705760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03168061129957611296611ff2565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906112cf908b908b908b908b908b90600401612811565b6000604051808303818588803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061090b576113d5836001600160a01b031660001b60405180610940016040528061090e815260200161292361090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f19818403018152908290526113ba9291602001612886565b60405160208183030381529060405280519060200120612157565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114245760405162461bcd60e51b815260040161071d90612604565b600081121561149b5760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e65676174697665000000000000000000606482015260840161071d565b6114a9633b9aca0082612678565b1561151e576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e74606482015260840161071d565b6001600160a01b0382166000908152609b602052604081205461154290839061289b565b905060008112156115d35760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a40161071d565b6001600160a01b039092166000908152609b602052604090209190915550565b6115fb611f46565b6109c1816121b3565b6001600160a01b03808316600090815260986020526040902054839116331461167f5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b606482015260840161071d565b600260c95414156116d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b600260c9556001600160a01b03831661176e5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a40161071d565b61177c633b9aca00836128da565b156118155760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a40161071d565b6001600160a01b0383166000908152609b60205260408120549061183984836126a2565b6001600160a01b0386166000908152609b602052604081208290559091506118618383611e0d565b905080156119c957600081121561192c576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06118c0856127b4565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506119c9565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020613231833981519152866040516119f291815260200190565b60405180910390a25050600160c95550505050565b600054610100900460ff1615808015611a275750600054600160ff909116105b80611a415750303b158015611a41575060005460ff166001145b611aa45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071d565b6000805460ff191660011790558015611ac7576000805461ff0019166101001790555b611ad0856121b3565b611ad984611fa0565b611ae383836121fd565b8015611b29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa158015611b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bab91906128ee565b90508061090b5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a40161071d565b611c43611f46565b6001600160a01b038116611ca85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161071d565b6109c181611fa0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2891906126e3565b6001600160a01b0316336001600160a01b031614611d585760405162461bcd60e51b815260040161071d90612700565b606654198119606654191614611dd65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610af8565b6000808313611e2d5760008213611e265750600061090b565b508061090b565b60008213611e4557611e3e836127b4565b905061090b565b611e3e838361289b565b6001600160a01b038116611edd5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161071d565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461112f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060996000815461200390612907565b9091555060408051610940810190915261090e8082526000916120a291839133916129236020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261208e9291602001612886565b6040516020818303038152906040526122e7565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b1580156120e657600080fd5b505af11580156120fa573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b16602183015260358201859052605580830185905283518084039091018152607590920190925280519101206000906113d5565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561221e57506001600160a01b03821615155b6122a05760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26122e382611e4f565b5050565b6000808447101561233a5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161071d565b82516123885760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161071d565b8383516020850187f590506001600160a01b0381166123e95760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161071d565b949350505050565b6001600160a01b03811681146109c157600080fd5b6000806040838503121561241957600080fd5b8235612424816123f1565b946020939093013593505050565b60006020828403121561244457600080fd5b81356113d5816123f1565b60006020828403121561246157600080fd5b5035919050565b60008060006060848603121561247d57600080fd5b8335612488816123f1565b92506020840135612498816123f1565b929592945050506040919091013590565b6000602082840312156124bb57600080fd5b813567ffffffffffffffff811681146113d557600080fd5b6000602082840312156124e557600080fd5b813560ff811681146113d557600080fd5b60008083601f84011261250857600080fd5b50813567ffffffffffffffff81111561252057600080fd5b60208301915083602082850101111561253857600080fd5b9250929050565b60008060008060006060868803121561255757600080fd5b853567ffffffffffffffff8082111561256f57600080fd5b61257b89838a016124f6565b9097509550602088013591508082111561259457600080fd5b506125a1888289016124f6565b96999598509660400135949350505050565b600080600080608085870312156125c957600080fd5b84356125d4816123f1565b935060208501356125e4816123f1565b925060408501356125f4816123f1565b9396929550929360600135925050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261268757612687612662565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156126c4576126c461268c565b600160ff1b83900384128116156126dd576126dd61268c565b50500190565b6000602082840312156126f557600080fd5b81516113d5816123f1565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561275c57600080fd5b815180151581146113d557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156127ca576127ca61268c565b5060000390565b6000828210156127e3576127e361268c565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006128256060830187896127e8565b82810360208401526128388186886127e8565b9150508260408301529695505050505050565b6000815160005b8181101561286c5760208185018101518683015201612852565b8181111561287b576000828601525b509290920192915050565b60006123e9612895838661284b565b8461284b565b60008083128015600160ff1b8501841216156128b9576128b961268c565b6001600160ff1b03840183138116156128d4576128d461268c565b50500390565b6000826128e9576128e9612662565b500790565b60006020828403121561290057600080fd5b5051919050565b600060001982141561291b5761291b61268c565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a264697066735822122004788f8dd07899132ea5c1e14eaf911cee4bc9c2c0086e0b752d9b98d2a1d56864736f6c634300080c0033", +======= + Bin: "0x6101206040523480156200001257600080fd5b50604051620034e7380380620034e783398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e051610100516132a66200024160003960008181610636015281816106e001528181610b0e015281816113e70152818161187c015261196c01526000610542015260006102e601526000818161027a01528181611366015261203a0152600061041401526132a66000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063c052bd61116100a0578063d1c64cc91161006f578063d1c64cc914610604578063ea4d3c9b14610624578063f2fde38b14610658578063f6848d2414610678578063fabc1cbc146106b357600080fd5b8063c052bd6114610584578063c1de3aef146105a4578063c2c51c40146105c4578063cf756fdf146105e457600080fd5b8063a38406a3116100dc578063a38406a3146104fa578063a6a509be1461051a578063b134427114610530578063beffbb891461056457600080fd5b80638da5cb5b1461046b5780639104c319146104895780639b4e4634146104b15780639ba06275146104c457600080fd5b8063595c6a6711610185578063715018a611610154578063715018a6146103ed57806374cdd7981461040257806384d8106214610436578063886f11951461044b57600080fd5b8063595c6a67146103565780635ac86ab71461036b5780635c975abb146103ab57806360f4062b146103c057600080fd5b8063387b1300116101c1578063387b1300146102b457806339b70e38146102d457806344e71c8014610308578063463db0381461033657600080fd5b80630e81073c146101f357806310d67a2f14610226578063136439dd14610248578063292b7b2b14610268575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612406565b6106d3565b6040519081526020015b60405180910390f35b34801561023257600080fd5b50610246610241366004612432565b610911565b005b34801561025457600080fd5b5061024661026336600461244f565b6109c4565b34801561027457600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161021d565b3480156102c057600080fd5b506102466102cf366004612468565b610b03565b3480156102e057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031457600080fd5b5061031d610ea1565b60405167ffffffffffffffff909116815260200161021d565b34801561034257600080fd5b506102466103513660046124a9565b610eca565b34801561036257600080fd5b50610246611056565b34801561037757600080fd5b5061039b6103863660046124d3565b606654600160ff9092169190911b9081161490565b604051901515815260200161021d565b3480156103b757600080fd5b50606654610213565b3480156103cc57600080fd5b506102136103db366004612432565b609b6020526000908152604090205481565b3480156103f957600080fd5b5061024661111d565b34801561040e57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561044257600080fd5b5061029c611131565b34801561045757600080fd5b5060655461029c906001600160a01b031681565b34801561047757600080fd5b506033546001600160a01b031661029c565b34801561049557600080fd5b5061029c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102466104bf36600461253f565b61121b565b3480156104d057600080fd5b5061029c6104df366004612432565b6098602052600090815260409020546001600160a01b031681565b34801561050657600080fd5b5061029c610515366004612432565b61130a565b34801561052657600080fd5b5061021360995481565b34801561053c57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561057057600080fd5b5061024661057f366004612406565b6113dc565b34801561059057600080fd5b5060975461029c906001600160a01b031681565b3480156105b057600080fd5b506102466105bf366004612432565b6115f3565b3480156105d057600080fd5b506102466105df366004612406565b611604565b3480156105f057600080fd5b506102466105ff3660046125b3565b611a07565b34801561061057600080fd5b5061021361061f3660046124a9565b611b30565b34801561063057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066457600080fd5b50610246610673366004612432565b611c3b565b34801561068457600080fd5b5061039b610693366004612432565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156106bf57600080fd5b506102466106ce36600461244f565b611cb1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107265760405162461bcd60e51b815260040161071d90612604565b60405180910390fd5b6001600160a01b0383166107a25760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f2061646472657373000000000000606482015260840161071d565b60008212156108105760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b606482015260840161071d565b61081e633b9aca0083612678565b156108915760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e74000000606482015260840161071d565b6001600160a01b0383166000908152609b6020526040812054906108b584836126a2565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020613231833981519152906108f49087815260200190565b60405180910390a26109068282611e0d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610964573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098891906126e3565b6001600160a01b0316336001600160a01b0316146109b85760405162461bcd60e51b815260040161071d90612700565b6109c181611e4f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a30919061274a565b610a4c5760405162461bcd60e51b815260040161071d9061276c565b60665481811614610ac55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b4b5760405162461bcd60e51b815260040161071d90612604565b6001600160a01b038316610bc55760405162461bcd60e51b8152602060048201526047602482015260008051602061325183398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a40161071d565b6001600160a01b038216610c425760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a40161071d565b6000811215610cb15760405162461bcd60e51b8152602060048201526041602482015260008051602061325183398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a40161071d565b610cbf633b9aca0082612678565b15610d335760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a40161071d565b6001600160a01b0383166000908152609b602052604081205490811215610e26576000610d5f826127b4565b905080831115610dc4576001600160a01b0385166000908152609b6020526040812055610d8c81846127d1565b9250846001600160a01b031660008051602061323183398151915282604051610db791815260200190565b60405180910390a2610e24565b6001600160a01b0385166000908152609b602052604081208054859290610dec9084906126a2565b90915550506040518381526001600160a01b038616906000805160206132318339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b5050505050505050565b609c5460009067ffffffffffffffff1680610ec55767ffffffffffffffff91505090565b919050565b610ed2611f46565b67ffffffffffffffff8116610f645760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f7420736574206e657744656e6562466f726b546960648201526b06d657374616d7020746f20360a41b608482015260a40161071d565b609c5467ffffffffffffffff16156110005760405162461bcd60e51b815260206004820152605360248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f74207365742064656e6562466f726b54696d657360648201527274616d70206d6f7265207468616e206f6e636560681b608482015260a40161071d565b609c805467ffffffffffffffff191667ffffffffffffffff83169081179091556040519081527f19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db9060200160405180910390a150565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561109e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c2919061274a565b6110de5760405162461bcd60e51b815260040161071d9061276c565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b611125611f46565b61112f6000611fa0565b565b6066546000908190600190811614156111885760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03161561120a5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b606482015260840161071d565b6000611214611ff2565b9250505090565b606654600090600190811614156112705760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03168061129957611296611ff2565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906112cf908b908b908b908b908b90600401612811565b6000604051808303818588803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061090b576113d5836001600160a01b031660001b60405180610940016040528061090e815260200161292361090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f19818403018152908290526113ba9291602001612886565b60405160208183030381529060405280519060200120612157565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114245760405162461bcd60e51b815260040161071d90612604565b600081121561149b5760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e65676174697665000000000000000000606482015260840161071d565b6114a9633b9aca0082612678565b1561151e576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e74606482015260840161071d565b6001600160a01b0382166000908152609b602052604081205461154290839061289b565b905060008112156115d35760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a40161071d565b6001600160a01b039092166000908152609b602052604090209190915550565b6115fb611f46565b6109c1816121b3565b6001600160a01b03808316600090815260986020526040902054839116331461167f5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b606482015260840161071d565b600260c95414156116d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b600260c9556001600160a01b03831661176e5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a40161071d565b61177c633b9aca00836128da565b156118155760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a40161071d565b6001600160a01b0383166000908152609b60205260408120549061183984836126a2565b6001600160a01b0386166000908152609b602052604081208290559091506118618383611e0d565b905080156119c957600081121561192c576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06118c0856127b4565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506119c9565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020613231833981519152866040516119f291815260200190565b60405180910390a25050600160c95550505050565b600054610100900460ff1615808015611a275750600054600160ff909116105b80611a415750303b158015611a41575060005460ff166001145b611aa45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071d565b6000805460ff191660011790558015611ac7576000805461ff0019166101001790555b611ad0856121b3565b611ad984611fa0565b611ae383836121fd565b8015611b29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa158015611b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bab91906128ee565b90508061090b5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a40161071d565b611c43611f46565b6001600160a01b038116611ca85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161071d565b6109c181611fa0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2891906126e3565b6001600160a01b0316336001600160a01b031614611d585760405162461bcd60e51b815260040161071d90612700565b606654198119606654191614611dd65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610af8565b6000808313611e2d5760008213611e265750600061090b565b508061090b565b60008213611e4557611e3e836127b4565b905061090b565b611e3e838361289b565b6001600160a01b038116611edd5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161071d565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461112f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060996000815461200390612907565b9091555060408051610940810190915261090e8082526000916120a291839133916129236020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261208e9291602001612886565b6040516020818303038152906040526122e7565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b1580156120e657600080fd5b505af11580156120fa573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b16602183015260358201859052605580830185905283518084039091018152607590920190925280519101206000906113d5565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561221e57506001600160a01b03821615155b6122a05760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26122e382611e4f565b5050565b6000808447101561233a5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161071d565b82516123885760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161071d565b8383516020850187f590506001600160a01b0381166123e95760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161071d565b949350505050565b6001600160a01b03811681146109c157600080fd5b6000806040838503121561241957600080fd5b8235612424816123f1565b946020939093013593505050565b60006020828403121561244457600080fd5b81356113d5816123f1565b60006020828403121561246157600080fd5b5035919050565b60008060006060848603121561247d57600080fd5b8335612488816123f1565b92506020840135612498816123f1565b929592945050506040919091013590565b6000602082840312156124bb57600080fd5b813567ffffffffffffffff811681146113d557600080fd5b6000602082840312156124e557600080fd5b813560ff811681146113d557600080fd5b60008083601f84011261250857600080fd5b50813567ffffffffffffffff81111561252057600080fd5b60208301915083602082850101111561253857600080fd5b9250929050565b60008060008060006060868803121561255757600080fd5b853567ffffffffffffffff8082111561256f57600080fd5b61257b89838a016124f6565b9097509550602088013591508082111561259457600080fd5b506125a1888289016124f6565b96999598509660400135949350505050565b600080600080608085870312156125c957600080fd5b84356125d4816123f1565b935060208501356125e4816123f1565b925060408501356125f4816123f1565b9396929550929360600135925050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261268757612687612662565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156126c4576126c461268c565b600160ff1b83900384128116156126dd576126dd61268c565b50500190565b6000602082840312156126f557600080fd5b81516113d5816123f1565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561275c57600080fd5b815180151581146113d557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156127ca576127ca61268c565b5060000390565b6000828210156127e3576127e361268c565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006128256060830187896127e8565b82810360208401526128388186886127e8565b9150508260408301529695505050505050565b6000815160005b8181101561286c5760208185018101518683015201612852565b8181111561287b576000828601525b509290920192915050565b60006123e9612895838661284b565b8461284b565b60008083128015600160ff1b8501841216156128b9576128b961268c565b6001600160ff1b03840183138116156128d4576128d461268c565b50500390565b6000826128e9576128e9612662565b500790565b60006020828403121561290057600080fd5b5051919050565b600060001982141561291b5761291b61268c565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a264697066735822122004d8740e0cf9e5496208917d8d4cc564f420a5881e787d21f37ecebe90895cee64736f6c634300080c0033", +>>>>>>> 500e0254 (feat: operator commission bips (#627)) } // EigenPodManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go index f3cd14664..9eed05ef5 100644 --- a/pkg/bindings/EigenStrategy/binding.go +++ b/pkg/bindings/EigenStrategy/binding.go @@ -31,8 +31,8 @@ var ( // EigenStrategyMetaData contains all meta data concerning the EigenStrategy contract. var EigenStrategyMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001dc338038062001dc3833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611c4a62000179600039600081816101af015281816105ac01528181610ad40152610b9f0152611c4a6000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b61016561016036600461181e565b61034c565b005b61016561017536600461183b565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611854565b61054c565b610165610209366004611880565b610790565b6101da61021c36600461181e565b61085e565b610165610872565b6102486102373660046118c8565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e36600461183b565b61093e565b60005461018d906201000090046001600160a01b031681565b6101da61029a36600461183b565b610989565b6101da6102ad36600461181e565b610994565b6102ba6109a2565b6040516101a19190611911565b6101656102d5366004611944565b6109c2565b6101da6102e836600461181e565b610aac565b6101656102fb36600461198f565b610b41565b6101da61030e36600461183b565b610d27565b6101da61032136600461183b565b610d60565b61016561033436600461183b565b610d6b565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906119d0565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f3906119ed565b60405180910390fd5b61040581610ec7565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611a37565b6104955760405162461bcd60e51b81526004016103f390611a59565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610fcc565b60335460006106346103e883611ab7565b905060006103e86106436110e0565b61064d9190611ab7565b9050600061065b8783611acf565b9050806106688489611ae6565b6106729190611b05565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e28685611ab7565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561076c5760405162461bcd60e51b815260206004820152603c60248201527f5374726174656779426173652e6465706f7369743a20746f74616c536861726560448201527f73206578636565647320604d41585f544f54414c5f534841524553600000000060648201526084016103f3565b610785826103e86033546107809190611ab7565b611152565b505050505092915050565b600054610100900460ff16158080156107b05750600054600160ff909116105b806107ca5750303b1580156107ca575060005460ff166001145b6107e65760405162461bcd60e51b81526004016103f390611b27565b6000805460ff191660011790558015610809576000805461ff0019166101001790555b61081383836111a6565b8015610859576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b600061086c61026e83610aac565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156108bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e39190611a37565b6108ff5760405162461bcd60e51b81526004016103f390611a59565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546109519190611ab7565b905060006103e86109606110e0565b61096a9190611ab7565b9050816109778583611ae6565b6109819190611b05565b949350505050565b600061086c82610d27565b600061086c61032183610aac565b60606040518060800160405280604d8152602001611bc8604d9139905090565b600054610100900460ff16158080156109e25750600054600160ff909116105b806109fc5750303b1580156109fc575060005460ff166001145b610a185760405162461bcd60e51b81526004016103f390611b27565b6000805460ff191660011790558015610a3b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b038616179055610a6083836111a6565b8015610aa6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b1d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c9190611b75565b6001805460029081161415610b945760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c0c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610c178484846112f1565b60335480831115610ca65760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610cb46103e883611ab7565b905060006103e8610cc36110e0565b610ccd9190611ab7565b9050600082610cdc8784611ae6565b610ce69190611b05565b9050610cf28685611acf565b603355610d12610d028284611acf565b6103e86033546107809190611ab7565b610d1d88888361138c565b5050505050505050565b6000806103e8603354610d3a9190611ab7565b905060006103e8610d496110e0565b610d539190611ab7565b9050806109778386611ae6565b600061086c8261093e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de291906119d0565b6001600160a01b0316336001600160a01b031614610e125760405162461bcd60e51b81526004016103f3906119ed565b600154198119600154191614610e905760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610f555760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610ff557506064546001600160a01b038381169116145b6110675760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156110dc57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b1580156110c357600080fd5b505af11580156110d7573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114d9190611b75565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be88161118684670de0b6b3a7640000611ae6565b6111909190611b05565b6040519081526020015b60405180910390a15050565b600054610100900460ff166112115760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561123781600061148d565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d09190611b8e565b604080516001600160a01b03909316835260ff90911660208301520161119a565b6032546001600160a01b038381169116148061131a57506064546001600160a01b038381169116145b6108595760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156114795760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af11580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114199190611a37565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561146057600080fd5b505af1158015611474573d6000803e3d6000fd5b505050505b6108596001600160a01b0383168483611579565b6000546201000090046001600160a01b03161580156114b457506001600160a01b03821615155b6115365760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26110dc82610ec7565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261085992869291600091611609918516908490611686565b80519091501561085957808060200190518101906116279190611a37565b6108595760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b6060611695848460008561169f565b90505b9392505050565b6060824710156117005760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b6117575760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516117739190611bab565b60006040518083038185875af1925050503d80600081146117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b50915091506117c58282866117d0565b979650505050505050565b606083156117df575081611698565b8251156117ef5782518084602001fd5b8160405162461bcd60e51b81526004016103f39190611911565b6001600160a01b038116811461040557600080fd5b60006020828403121561183057600080fd5b813561169881611809565b60006020828403121561184d57600080fd5b5035919050565b6000806040838503121561186757600080fd5b823561187281611809565b946020939093013593505050565b6000806040838503121561189357600080fd5b823561189e81611809565b915060208301356118ae81611809565b809150509250929050565b60ff8116811461040557600080fd5b6000602082840312156118da57600080fd5b8135611698816118b9565b60005b838110156119005781810151838201526020016118e8565b83811115610aa65750506000910152565b60208152600082518060208401526119308160408501602087016118e5565b601f01601f19169190910160400192915050565b60008060006060848603121561195957600080fd5b833561196481611809565b9250602084013561197481611809565b9150604084013561198481611809565b809150509250925092565b6000806000606084860312156119a457600080fd5b83356119af81611809565b925060208401356119bf81611809565b929592945050506040919091013590565b6000602082840312156119e257600080fd5b815161169881611809565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4957600080fd5b8151801515811461169857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611aca57611aca611aa1565b500190565b600082821015611ae157611ae1611aa1565b500390565b6000816000190483118215151615611b0057611b00611aa1565b500290565b600082611b2257634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215611b8757600080fd5b5051919050565b600060208284031215611ba057600080fd5b8151611698816118b9565b60008251611bbd8184602087016118e5565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212202074643e1c48de2f1cf7fdbbfb7ef480d5862d718f96ac97960980c6ddc2381864736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220ff37e0acae61bc99fd745598626c9383648cff6624ee2ccbf39a7eae5679483e64736f6c634300080c0033", } // EigenStrategyABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IAVSDirectory/binding.go b/pkg/bindings/IAVSDirectory/binding.go index 6ee8f3ce0..2102d9ed3 100644 --- a/pkg/bindings/IAVSDirectory/binding.go +++ b/pkg/bindings/IAVSDirectory/binding.go @@ -38,7 +38,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // IAVSDirectoryMetaData contains all meta data concerning the IAVSDirectory contract. var IAVSDirectoryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isLegacyOperator\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false}]", } // IAVSDirectoryABI is the input ABI used to generate the binding from. @@ -218,6 +218,37 @@ func (_IAVSDirectory *IAVSDirectoryCallerSession) OPERATORAVSREGISTRATIONTYPEHAS return _IAVSDirectory.Contract.OPERATORAVSREGISTRATIONTYPEHASH(&_IAVSDirectory.CallOpts) } +// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68. +// +// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32) +func (_IAVSDirectory *IAVSDirectoryCaller) OPERATORSETREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _IAVSDirectory.contract.Call(opts, &out, "OPERATOR_SET_REGISTRATION_TYPEHASH") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68. +// +// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32) +func (_IAVSDirectory *IAVSDirectorySession) OPERATORSETREGISTRATIONTYPEHASH() ([32]byte, error) { + return _IAVSDirectory.Contract.OPERATORSETREGISTRATIONTYPEHASH(&_IAVSDirectory.CallOpts) +} + +// OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68. +// +// Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32) +func (_IAVSDirectory *IAVSDirectoryCallerSession) OPERATORSETREGISTRATIONTYPEHASH() ([32]byte, error) { + return _IAVSDirectory.Contract.OPERATORSETREGISTRATIONTYPEHASH(&_IAVSDirectory.CallOpts) +} + // CalculateOperatorAVSRegistrationDigestHash is a free data retrieval call binding the contract method 0xa1060c88. // // Solidity: function calculateOperatorAVSRegistrationDigestHash(address operator, address avs, bytes32 salt, uint256 expiry) view returns(bytes32) @@ -249,6 +280,37 @@ func (_IAVSDirectory *IAVSDirectoryCallerSession) CalculateOperatorAVSRegistrati return _IAVSDirectory.Contract.CalculateOperatorAVSRegistrationDigestHash(&_IAVSDirectory.CallOpts, operator, avs, salt, expiry) } +// CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. +// +// Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_IAVSDirectory *IAVSDirectoryCaller) CalculateOperatorSetRegistrationDigestHash(opts *bind.CallOpts, avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + var out []interface{} + err := _IAVSDirectory.contract.Call(opts, &out, "calculateOperatorSetRegistrationDigestHash", avs, operatorSetIds, salt, expiry) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. +// +// Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_IAVSDirectory *IAVSDirectorySession) CalculateOperatorSetRegistrationDigestHash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _IAVSDirectory.Contract.CalculateOperatorSetRegistrationDigestHash(&_IAVSDirectory.CallOpts, avs, operatorSetIds, salt, expiry) +} + +// CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. +// +// Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_IAVSDirectory *IAVSDirectoryCallerSession) CalculateOperatorSetRegistrationDigestHash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _IAVSDirectory.Contract.CalculateOperatorSetRegistrationDigestHash(&_IAVSDirectory.CallOpts, avs, operatorSetIds, salt, expiry) +} + // OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5. // // Solidity: function operatorSaltIsSpent(address operator, bytes32 salt) view returns(bool) @@ -301,6 +363,27 @@ func (_IAVSDirectory *IAVSDirectoryTransactorSession) DeregisterOperatorFromAVS( return _IAVSDirectory.Contract.DeregisterOperatorFromAVS(&_IAVSDirectory.TransactOpts, operator) } +// DeregisterOperatorFromOperatorSets is a paid mutator transaction binding the contract method 0xc1a8e2c5. +// +// Solidity: function deregisterOperatorFromOperatorSets(address operator, uint32[] operatorSetIds) returns() +func (_IAVSDirectory *IAVSDirectoryTransactor) DeregisterOperatorFromOperatorSets(opts *bind.TransactOpts, operator common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _IAVSDirectory.contract.Transact(opts, "deregisterOperatorFromOperatorSets", operator, operatorSetIds) +} + +// DeregisterOperatorFromOperatorSets is a paid mutator transaction binding the contract method 0xc1a8e2c5. +// +// Solidity: function deregisterOperatorFromOperatorSets(address operator, uint32[] operatorSetIds) returns() +func (_IAVSDirectory *IAVSDirectorySession) DeregisterOperatorFromOperatorSets(operator common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _IAVSDirectory.Contract.DeregisterOperatorFromOperatorSets(&_IAVSDirectory.TransactOpts, operator, operatorSetIds) +} + +// DeregisterOperatorFromOperatorSets is a paid mutator transaction binding the contract method 0xc1a8e2c5. +// +// Solidity: function deregisterOperatorFromOperatorSets(address operator, uint32[] operatorSetIds) returns() +func (_IAVSDirectory *IAVSDirectoryTransactorSession) DeregisterOperatorFromOperatorSets(operator common.Address, operatorSetIds []uint32) (*types.Transaction, error) { + return _IAVSDirectory.Contract.DeregisterOperatorFromOperatorSets(&_IAVSDirectory.TransactOpts, operator, operatorSetIds) +} + // RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d. // // Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns() @@ -322,6 +405,27 @@ func (_IAVSDirectory *IAVSDirectoryTransactorSession) RegisterOperatorToAVS(oper return _IAVSDirectory.Contract.RegisterOperatorToAVS(&_IAVSDirectory.TransactOpts, operator, operatorSignature) } +// RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. +// +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() +func (_IAVSDirectory *IAVSDirectoryTransactor) RegisterOperatorToOperatorSets(opts *bind.TransactOpts, operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _IAVSDirectory.contract.Transact(opts, "registerOperatorToOperatorSets", operator, operatorSetIds, signature) +} + +// RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. +// +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() +func (_IAVSDirectory *IAVSDirectorySession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _IAVSDirectory.Contract.RegisterOperatorToOperatorSets(&_IAVSDirectory.TransactOpts, operator, operatorSetIds, signature) +} + +// RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. +// +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() +func (_IAVSDirectory *IAVSDirectoryTransactorSession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _IAVSDirectory.Contract.RegisterOperatorToOperatorSets(&_IAVSDirectory.TransactOpts, operator, operatorSetIds, signature) +} + // UpdateAVSMetadataURI is a paid mutator transaction binding the contract method 0xa98fb355. // // Solidity: function updateAVSMetadataURI(string metadataURI) returns() @@ -557,15 +661,15 @@ func (it *IAVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator) Close() err // IAVSDirectoryOperatorAVSRegistrationStatusUpdated represents a OperatorAVSRegistrationStatusUpdated event raised by the IAVSDirectory contract. type IAVSDirectoryOperatorAVSRegistrationStatusUpdated struct { - Operator common.Address - Avs common.Address - Status uint8 - Raw types.Log // Blockchain specific contextual infos + Operator common.Address + Avs common.Address + IsLegacyOperator bool + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. +// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorAVSRegistrationStatusUpdated(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*IAVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator, error) { var operatorRule []interface{} @@ -584,9 +688,9 @@ func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorAVSRegistrationStatus return &IAVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator{contract: _IAVSDirectory.contract, event: "OperatorAVSRegistrationStatusUpdated", logs: logs, sub: sub}, nil } -// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. +// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorAVSRegistrationStatusUpdated(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryOperatorAVSRegistrationStatusUpdated, operator []common.Address, avs []common.Address) (event.Subscription, error) { var operatorRule []interface{} @@ -630,9 +734,9 @@ func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorAVSRegistrationStatusU }), nil } -// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. +// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorAVSRegistrationStatusUpdated(log types.Log) (*IAVSDirectoryOperatorAVSRegistrationStatusUpdated, error) { event := new(IAVSDirectoryOperatorAVSRegistrationStatusUpdated) if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorAVSRegistrationStatusUpdated", log); err != nil { @@ -641,3 +745,275 @@ func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorAVSRegistrationStatusU event.Raw = log return event, nil } + +// IAVSDirectoryOperatorAddedToOperatorSetIterator is returned from FilterOperatorAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorAddedToOperatorSet events raised by the IAVSDirectory contract. +type IAVSDirectoryOperatorAddedToOperatorSetIterator struct { + Event *IAVSDirectoryOperatorAddedToOperatorSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IAVSDirectoryOperatorAddedToOperatorSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IAVSDirectoryOperatorAddedToOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IAVSDirectoryOperatorAddedToOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IAVSDirectoryOperatorAddedToOperatorSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IAVSDirectoryOperatorAddedToOperatorSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IAVSDirectoryOperatorAddedToOperatorSet represents a OperatorAddedToOperatorSet event raised by the IAVSDirectory contract. +type IAVSDirectoryOperatorAddedToOperatorSet struct { + Operator common.Address + Avs common.Address + OperatorSetId uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// +// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts) (*IAVSDirectoryOperatorAddedToOperatorSetIterator, error) { + + logs, sub, err := _IAVSDirectory.contract.FilterLogs(opts, "OperatorAddedToOperatorSet") + if err != nil { + return nil, err + } + return &IAVSDirectoryOperatorAddedToOperatorSetIterator{contract: _IAVSDirectory.contract, event: "OperatorAddedToOperatorSet", logs: logs, sub: sub}, nil +} + +// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// +// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryOperatorAddedToOperatorSet) (event.Subscription, error) { + + logs, sub, err := _IAVSDirectory.contract.WatchLogs(opts, "OperatorAddedToOperatorSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IAVSDirectoryOperatorAddedToOperatorSet) + if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// +// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorAddedToOperatorSet(log types.Log) (*IAVSDirectoryOperatorAddedToOperatorSet, error) { + event := new(IAVSDirectoryOperatorAddedToOperatorSet) + if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// IAVSDirectoryOperatorRemovedFromOperatorSetIterator is returned from FilterOperatorRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorRemovedFromOperatorSet events raised by the IAVSDirectory contract. +type IAVSDirectoryOperatorRemovedFromOperatorSetIterator struct { + Event *IAVSDirectoryOperatorRemovedFromOperatorSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IAVSDirectoryOperatorRemovedFromOperatorSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IAVSDirectoryOperatorRemovedFromOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IAVSDirectoryOperatorRemovedFromOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IAVSDirectoryOperatorRemovedFromOperatorSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IAVSDirectoryOperatorRemovedFromOperatorSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IAVSDirectoryOperatorRemovedFromOperatorSet represents a OperatorRemovedFromOperatorSet event raised by the IAVSDirectory contract. +type IAVSDirectoryOperatorRemovedFromOperatorSet struct { + Operator common.Address + Avs common.Address + OperatorSetId uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// +// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts) (*IAVSDirectoryOperatorRemovedFromOperatorSetIterator, error) { + + logs, sub, err := _IAVSDirectory.contract.FilterLogs(opts, "OperatorRemovedFromOperatorSet") + if err != nil { + return nil, err + } + return &IAVSDirectoryOperatorRemovedFromOperatorSetIterator{contract: _IAVSDirectory.contract, event: "OperatorRemovedFromOperatorSet", logs: logs, sub: sub}, nil +} + +// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// +// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryOperatorRemovedFromOperatorSet) (event.Subscription, error) { + + logs, sub, err := _IAVSDirectory.contract.WatchLogs(opts, "OperatorRemovedFromOperatorSet") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IAVSDirectoryOperatorRemovedFromOperatorSet) + if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorRemovedFromOperatorSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// +// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorRemovedFromOperatorSet(log types.Log) (*IAVSDirectoryOperatorRemovedFromOperatorSet, error) { + event := new(IAVSDirectoryOperatorRemovedFromOperatorSet) + if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorRemovedFromOperatorSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/bindings/IRewardsCoordinator/binding.go b/pkg/bindings/IRewardsCoordinator/binding.go index f1f26e146..87ae5a84e 100644 --- a/pkg/bindings/IRewardsCoordinator/binding.go +++ b/pkg/bindings/IRewardsCoordinator/binding.go @@ -29,6 +29,12 @@ var ( _ = abi.ConvertType ) +// IAVSDirectoryOperatorSet is an auto generated low-level Go binding around an user-defined struct. +type IAVSDirectoryOperatorSet struct { + Avs common.Address + Id uint32 +} + // IRewardsCoordinatorDistributionRoot is an auto generated low-level Go binding around an user-defined struct. type IRewardsCoordinatorDistributionRoot struct { Root [32]byte @@ -77,7 +83,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // IRewardsCoordinatorMetaData contains all meta data concerning the IRewardsCoordinator contract. var IRewardsCoordinatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", } // IRewardsCoordinatorABI is the input ABI used to generate the binding from. @@ -691,6 +697,68 @@ func (_IRewardsCoordinator *IRewardsCoordinatorCallerSession) GetDistributionRoo return _IRewardsCoordinator.Contract.GetDistributionRootsLength(&_IRewardsCoordinator.CallOpts) } +// GetOperatorCommissionBips is a free data retrieval call binding the contract method 0x4d7a80d4. +// +// Solidity: function getOperatorCommissionBips(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint16) +func (_IRewardsCoordinator *IRewardsCoordinatorCaller) GetOperatorCommissionBips(opts *bind.CallOpts, operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (uint16, error) { + var out []interface{} + err := _IRewardsCoordinator.contract.Call(opts, &out, "getOperatorCommissionBips", operator, operatorSet, rewardType) + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// GetOperatorCommissionBips is a free data retrieval call binding the contract method 0x4d7a80d4. +// +// Solidity: function getOperatorCommissionBips(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint16) +func (_IRewardsCoordinator *IRewardsCoordinatorSession) GetOperatorCommissionBips(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (uint16, error) { + return _IRewardsCoordinator.Contract.GetOperatorCommissionBips(&_IRewardsCoordinator.CallOpts, operator, operatorSet, rewardType) +} + +// GetOperatorCommissionBips is a free data retrieval call binding the contract method 0x4d7a80d4. +// +// Solidity: function getOperatorCommissionBips(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint16) +func (_IRewardsCoordinator *IRewardsCoordinatorCallerSession) GetOperatorCommissionBips(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (uint16, error) { + return _IRewardsCoordinator.Contract.GetOperatorCommissionBips(&_IRewardsCoordinator.CallOpts, operator, operatorSet, rewardType) +} + +// GetOperatorCommissionUpdateHistoryLength is a free data retrieval call binding the contract method 0xc336f19d. +// +// Solidity: function getOperatorCommissionUpdateHistoryLength(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint256) +func (_IRewardsCoordinator *IRewardsCoordinatorCaller) GetOperatorCommissionUpdateHistoryLength(opts *bind.CallOpts, operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (*big.Int, error) { + var out []interface{} + err := _IRewardsCoordinator.contract.Call(opts, &out, "getOperatorCommissionUpdateHistoryLength", operator, operatorSet, rewardType) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetOperatorCommissionUpdateHistoryLength is a free data retrieval call binding the contract method 0xc336f19d. +// +// Solidity: function getOperatorCommissionUpdateHistoryLength(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint256) +func (_IRewardsCoordinator *IRewardsCoordinatorSession) GetOperatorCommissionUpdateHistoryLength(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (*big.Int, error) { + return _IRewardsCoordinator.Contract.GetOperatorCommissionUpdateHistoryLength(&_IRewardsCoordinator.CallOpts, operator, operatorSet, rewardType) +} + +// GetOperatorCommissionUpdateHistoryLength is a free data retrieval call binding the contract method 0xc336f19d. +// +// Solidity: function getOperatorCommissionUpdateHistoryLength(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint256) +func (_IRewardsCoordinator *IRewardsCoordinatorCallerSession) GetOperatorCommissionUpdateHistoryLength(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (*big.Int, error) { + return _IRewardsCoordinator.Contract.GetOperatorCommissionUpdateHistoryLength(&_IRewardsCoordinator.CallOpts, operator, operatorSet, rewardType) +} + // GetRootIndexFromHash is a free data retrieval call binding the contract method 0xe810ce21. // // Solidity: function getRootIndexFromHash(bytes32 rootHash) view returns(uint32) @@ -753,37 +821,6 @@ func (_IRewardsCoordinator *IRewardsCoordinatorCallerSession) GlobalOperatorComm return _IRewardsCoordinator.Contract.GlobalOperatorCommissionBips(&_IRewardsCoordinator.CallOpts) } -// OperatorCommissionBips is a free data retrieval call binding the contract method 0x22f19a64. -// -// Solidity: function operatorCommissionBips(address operator, address avs) view returns(uint16) -func (_IRewardsCoordinator *IRewardsCoordinatorCaller) OperatorCommissionBips(opts *bind.CallOpts, operator common.Address, avs common.Address) (uint16, error) { - var out []interface{} - err := _IRewardsCoordinator.contract.Call(opts, &out, "operatorCommissionBips", operator, avs) - - if err != nil { - return *new(uint16), err - } - - out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) - - return out0, err - -} - -// OperatorCommissionBips is a free data retrieval call binding the contract method 0x22f19a64. -// -// Solidity: function operatorCommissionBips(address operator, address avs) view returns(uint16) -func (_IRewardsCoordinator *IRewardsCoordinatorSession) OperatorCommissionBips(operator common.Address, avs common.Address) (uint16, error) { - return _IRewardsCoordinator.Contract.OperatorCommissionBips(&_IRewardsCoordinator.CallOpts, operator, avs) -} - -// OperatorCommissionBips is a free data retrieval call binding the contract method 0x22f19a64. -// -// Solidity: function operatorCommissionBips(address operator, address avs) view returns(uint16) -func (_IRewardsCoordinator *IRewardsCoordinatorCallerSession) OperatorCommissionBips(operator common.Address, avs common.Address) (uint16, error) { - return _IRewardsCoordinator.Contract.OperatorCommissionBips(&_IRewardsCoordinator.CallOpts, operator, avs) -} - // RewardsUpdater is a free data retrieval call binding the contract method 0xfbf1e2c1. // // Solidity: function rewardsUpdater() view returns(address) @@ -962,6 +999,27 @@ func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) SetGlobalOpera return _IRewardsCoordinator.Contract.SetGlobalOperatorCommission(&_IRewardsCoordinator.TransactOpts, _globalCommissionBips) } +// SetOperatorCommissionBips is a paid mutator transaction binding the contract method 0x3c8fcf7c. +// +// Solidity: function setOperatorCommissionBips((address,uint32) operatorSet, uint8 rewardType, uint16 commissionBips) returns(uint32) +func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) SetOperatorCommissionBips(opts *bind.TransactOpts, operatorSet IAVSDirectoryOperatorSet, rewardType uint8, commissionBips uint16) (*types.Transaction, error) { + return _IRewardsCoordinator.contract.Transact(opts, "setOperatorCommissionBips", operatorSet, rewardType, commissionBips) +} + +// SetOperatorCommissionBips is a paid mutator transaction binding the contract method 0x3c8fcf7c. +// +// Solidity: function setOperatorCommissionBips((address,uint32) operatorSet, uint8 rewardType, uint16 commissionBips) returns(uint32) +func (_IRewardsCoordinator *IRewardsCoordinatorSession) SetOperatorCommissionBips(operatorSet IAVSDirectoryOperatorSet, rewardType uint8, commissionBips uint16) (*types.Transaction, error) { + return _IRewardsCoordinator.Contract.SetOperatorCommissionBips(&_IRewardsCoordinator.TransactOpts, operatorSet, rewardType, commissionBips) +} + +// SetOperatorCommissionBips is a paid mutator transaction binding the contract method 0x3c8fcf7c. +// +// Solidity: function setOperatorCommissionBips((address,uint32) operatorSet, uint8 rewardType, uint16 commissionBips) returns(uint32) +func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) SetOperatorCommissionBips(operatorSet IAVSDirectoryOperatorSet, rewardType uint8, commissionBips uint16) (*types.Transaction, error) { + return _IRewardsCoordinator.Contract.SetOperatorCommissionBips(&_IRewardsCoordinator.TransactOpts, operatorSet, rewardType, commissionBips) +} + // SetRewardsForAllSubmitter is a paid mutator transaction binding the contract method 0x0eb38345. // // Solidity: function setRewardsForAllSubmitter(address _submitter, bool _newValue) returns() @@ -1927,6 +1985,162 @@ func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseGlobalCommissionBi return event, nil } +// IRewardsCoordinatorOperatorCommissionUpdatedIterator is returned from FilterOperatorCommissionUpdated and is used to iterate over the raw logs and unpacked data for OperatorCommissionUpdated events raised by the IRewardsCoordinator contract. +type IRewardsCoordinatorOperatorCommissionUpdatedIterator struct { + Event *IRewardsCoordinatorOperatorCommissionUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IRewardsCoordinatorOperatorCommissionUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IRewardsCoordinatorOperatorCommissionUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IRewardsCoordinatorOperatorCommissionUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IRewardsCoordinatorOperatorCommissionUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IRewardsCoordinatorOperatorCommissionUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IRewardsCoordinatorOperatorCommissionUpdated represents a OperatorCommissionUpdated event raised by the IRewardsCoordinator contract. +type IRewardsCoordinatorOperatorCommissionUpdated struct { + Operator common.Address + OperatorSet IAVSDirectoryOperatorSet + RewardType uint8 + NewCommissionBips uint16 + EffectTimestamp uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorCommissionUpdated is a free log retrieval operation binding the contract event 0x811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba. +// +// Solidity: event OperatorCommissionUpdated(address indexed operator, (address,uint32) indexed operatorSet, uint8 rewardType, uint16 newCommissionBips, uint32 effectTimestamp) +func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterOperatorCommissionUpdated(opts *bind.FilterOpts, operator []common.Address, operatorSet []IAVSDirectoryOperatorSet) (*IRewardsCoordinatorOperatorCommissionUpdatedIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var operatorSetRule []interface{} + for _, operatorSetItem := range operatorSet { + operatorSetRule = append(operatorSetRule, operatorSetItem) + } + + logs, sub, err := _IRewardsCoordinator.contract.FilterLogs(opts, "OperatorCommissionUpdated", operatorRule, operatorSetRule) + if err != nil { + return nil, err + } + return &IRewardsCoordinatorOperatorCommissionUpdatedIterator{contract: _IRewardsCoordinator.contract, event: "OperatorCommissionUpdated", logs: logs, sub: sub}, nil +} + +// WatchOperatorCommissionUpdated is a free log subscription operation binding the contract event 0x811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba. +// +// Solidity: event OperatorCommissionUpdated(address indexed operator, (address,uint32) indexed operatorSet, uint8 rewardType, uint16 newCommissionBips, uint32 effectTimestamp) +func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchOperatorCommissionUpdated(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorOperatorCommissionUpdated, operator []common.Address, operatorSet []IAVSDirectoryOperatorSet) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var operatorSetRule []interface{} + for _, operatorSetItem := range operatorSet { + operatorSetRule = append(operatorSetRule, operatorSetItem) + } + + logs, sub, err := _IRewardsCoordinator.contract.WatchLogs(opts, "OperatorCommissionUpdated", operatorRule, operatorSetRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IRewardsCoordinatorOperatorCommissionUpdated) + if err := _IRewardsCoordinator.contract.UnpackLog(event, "OperatorCommissionUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorCommissionUpdated is a log parse operation binding the contract event 0x811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba. +// +// Solidity: event OperatorCommissionUpdated(address indexed operator, (address,uint32) indexed operatorSet, uint8 rewardType, uint16 newCommissionBips, uint32 effectTimestamp) +func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseOperatorCommissionUpdated(log types.Log) (*IRewardsCoordinatorOperatorCommissionUpdated, error) { + event := new(IRewardsCoordinatorOperatorCommissionUpdated) + if err := _IRewardsCoordinator.contract.UnpackLog(event, "OperatorCommissionUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // IRewardsCoordinatorRewardsClaimedIterator is returned from FilterRewardsClaimed and is used to iterate over the raw logs and unpacked data for RewardsClaimed events raised by the IRewardsCoordinator contract. type IRewardsCoordinatorRewardsClaimedIterator struct { Event *IRewardsCoordinatorRewardsClaimed // Event containing the contract specifics and raw log diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go index 8a8a4b60a..05cd59c15 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -29,6 +29,12 @@ var ( _ = abi.ConvertType ) +// IAVSDirectoryOperatorSet is an auto generated low-level Go binding around an user-defined struct. +type IAVSDirectoryOperatorSet struct { + Avs common.Address + Id uint32 +} + // IRewardsCoordinatorDistributionRoot is an auto generated low-level Go binding around an user-defined struct. type IRewardsCoordinatorDistributionRoot struct { Root [32]byte @@ -77,8 +83,8 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162004367380380620043678339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051613f20620004476000396000611a640152600081816104c7015261271e015260006107590152600081816103d0015261254d0152600081816102fc01526125f90152600081816104a001526124fc0152600081816106b8015261227301526000818161065e0152818161232a01526124050152613f206000f3fe608060405234801561001057600080fd5b50600436106102ba5760003560e01c8063715018a611610182578063c46db606116100e9578063f2fde38b116100a2578063f96abf2e1161007c578063f96abf2e146107a9578063fabc1cbc146107bc578063fbf1e2c1146107cf578063fce36c7d146107e257600080fd5b8063f2fde38b1461077b578063f698da251461078e578063f8cd84481461079657600080fd5b8063c46db606146106da578063d4540a5514610708578063de02e5031461071b578063e221b2451461072e578063e810ce2114610741578063ea4d3c9b1461075457600080fd5b80639104c3191161013b5780639104c319146106365780639be3d4e4146106515780639d45c28114610659578063a0169ddd14610680578063bb7e451f14610693578063bf21a8aa146106b357600080fd5b8063715018a6146105c45780637b8f8b05146105cc578063863cb9a9146105d4578063865c6953146105e7578063886f1195146106125780638da5cb5b1461062557600080fd5b806337838ed01161022657806358baaa3e116101df57806358baaa3e1461053d578063595c6a67146105505780635ac86ab7146105585780635c975abb1461057b5780635e9d8348146105835780636d21117e1461059657600080fd5b806337838ed01461049b57806339b70e38146104c25780633a8c0786146104e95780633ccc861d146105005780633efe1db6146105135780634d18cc351461052657600080fd5b8063131433b411610278578063131433b4146103cb578063136439dd146103f2578063149bc8721461040557806322f19a64146104265780632b9f64a41461044757806336af41fa1461048857600080fd5b806218572c146102bf57806304a0c502146102f7578063092db007146103335780630e9a53cf1461035b5780630eb38345146103a357806310d67a2f146103b8575b600080fd5b6102e26102cd3660046135a9565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61031e7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016102ee565b60cb5461034890600160e01b900461ffff1681565b60405161ffff90911681526020016102ee565b6103636107f5565b604080518251815260208084015163ffffffff908116918301919091528383015116918101919091526060918201511515918101919091526080016102ee565b6103b66103b13660046135d4565b6108d4565b005b6103b66103c63660046135a9565b610956565b61031e7f000000000000000000000000000000000000000000000000000000000000000081565b6103b661040036600461360d565b610a12565b61041861041336600461363e565b610b51565b6040519081526020016102ee565b61034861043436600461365a565b505060cb54600160e01b900461ffff1690565b6104706104553660046135a9565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016102ee565b6103b6610496366004613688565b610bc7565b61031e7f000000000000000000000000000000000000000000000000000000000000000081565b6104707f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461031e90600160a01b900463ffffffff1681565b6103b661050e366004613710565b610e01565b6103b6610521366004613770565b6111c5565b60cb5461031e90600160c01b900463ffffffff1681565b6103b661054b36600461379c565b611496565b6103b66114a7565b6102e26105663660046137b7565b606654600160ff9092169190911b9081161490565b606654610418565b6102e26105913660046137da565b61156e565b6102e26105a436600461380f565b60cf60209081526000928352604080842090915290825290205460ff1681565b6103b66115fb565b60ca54610418565b6103b66105e23660046135a9565b61160f565b6104186105f536600461365a565b60cd60209081526000928352604080842090915290825290205481565b606554610470906001600160a01b031681565b6033546001600160a01b0316610470565b61047073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610363611620565b61031e7f000000000000000000000000000000000000000000000000000000000000000081565b6103b661068e3660046135a9565b6116be565b6104186106a13660046135a9565b60ce6020526000908152604090205481565b61031e7f000000000000000000000000000000000000000000000000000000000000000081565b6102e26106e836600461380f565b60d060209081526000928352604080842090915290825290205460ff1681565b6103b6610716366004613858565b61171d565b61036361072936600461360d565b611865565b6103b661073c3660046138cb565b6118f7565b61031e61074f36600461360d565b611908565b6104707f000000000000000000000000000000000000000000000000000000000000000081565b6103b66107893660046135a9565b6119ea565b610418611a60565b6104186107a436600461363e565b611a9e565b6103b66107b736600461379c565b611aaf565b6103b66107ca36600461360d565b611ce5565b60cb54610470906001600160a01b031681565b6103b66107f0366004613688565b611e41565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b80156108d057600060ca6108326001846138fc565b8154811061084257610842613913565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615801560608301819052919250906108b25750806040015163ffffffff164210155b156108bd5792915050565b50806108c881613929565b91505061081d565b5090565b6108dc611fc0565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cd9190613940565b6001600160a01b0316336001600160a01b031614610a065760405162461bcd60e51b81526004016109fd9061395d565b60405180910390fd5b610a0f8161201a565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7e91906139a7565b610a9a5760405162461bcd60e51b81526004016109fd906139c4565b60665481811614610b135760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016109fd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610b6160208401846135a9565b8360200135604051602001610baa9392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610bf05760405162461bcd60e51b81526004016109fd90613a0c565b33600090815260d1602052604090205460ff16610c8f5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a4016109fd565b60026097541415610cb25760405162461bcd60e51b81526004016109fd90613a43565b600260975560005b82811015610df65736848483818110610cd557610cd5613913565b9050602002810190610ce79190613a7a565b33600081815260ce60209081526040808320549051949550939192610d129290918591879101613bbf565b604051602081830303815290604052805190602001209050610d3383612111565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610d66908390613bef565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610dae908890613c07565b60405180910390a4610de0333060408601803590610dcf90602089016135a9565b6001600160a01b03169291906128e9565b5050508080610dee90613c1a565b915050610cba565b505060016097555050565b60665460029060049081161415610e2a5760405162461bcd60e51b81526004016109fd90613a0c565b60026097541415610e4d5760405162461bcd60e51b81526004016109fd90613a43565b6002609755600060ca610e63602086018661379c565b63ffffffff1681548110610e7957610e79613913565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16151560608201529050610eda848261295a565b6000610eec60808601606087016135a9565b6001600160a01b03808216600090815260cc60205260409020549192501680610f125750805b336001600160a01b03821614610f905760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d65720000000060648201526084016109fd565b60005b610fa060a0880188613c35565b90508110156111b75736610fb760e0890189613c86565b83818110610fc757610fc7613913565b6001600160a01b038716600090815260cd602090815260408083209302949094019450929091508290610ffc908501856135a9565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808260200135116110b65760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a4016109fd565b60006110c68260208501356138fc565b6001600160a01b038716600090815260cd602090815260408220929350850180359291906110f490876135a9565b6001600160a01b0316815260208082019290925260400160002091909155611136908a908390611126908701876135a9565b6001600160a01b03169190612c26565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061117a60208901896135a9565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a450505080806111af90613c1a565b915050610f93565b505060016097555050505050565b606654600390600890811614156111ee5760405162461bcd60e51b81526004016109fd90613a0c565b60cb546001600160a01b031633146112185760405162461bcd60e51b81526004016109fd90613cd0565b60cb5463ffffffff600160c01b9091048116908316116112b45760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a4016109fd565b428263ffffffff161061134d5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a4016109fd565b60ca5460cb5460009061136d90600160a01b900463ffffffff1642613d24565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b61149e611fc0565b610a0f81612c56565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156114ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151391906139a7565b61152f5760405162461bcd60e51b81526004016109fd906139c4565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b60006115f38260ca611583602083018361379c565b63ffffffff168154811061159957611599613913565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015261295a565b506001919050565b611603611fc0565b61160d6000612cc7565b565b611617611fc0565b610a0f81612d19565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8054611654906001906138fc565b8154811061166457611664613913565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b600054610100900460ff161580801561173d5750600054600160ff909116105b806117575750303b158015611757575060005460ff166001145b6117ba5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109fd565b6000805460ff1916600117905580156117dd576000805461ff0019166101001790555b6117e5612d75565b60c9556117f28686612e0c565b6117fb87612cc7565b61180484612d19565b61180d83612c56565b61181682612ef6565b801561185c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca828154811061189c5761189c613913565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b6118ff611fc0565b610a0f81612ef6565b60ca546000905b63ffffffff81161561197b578260ca611929600184613d4c565b63ffffffff168154811061193f5761193f613913565b906000526020600020906002020160000154141561196957611962600182613d4c565b9392505050565b8061197381613d71565b91505061190f565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e6400000000000000000060648201526084016109fd565b6119f2611fc0565b6001600160a01b038116611a575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109fd565b610a0f81612cc7565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611a91575060c95490565b611a99612d75565b905090565b60006001610b6160208401846135a9565b60665460039060089081161415611ad85760405162461bcd60e51b81526004016109fd90613a0c565b60cb546001600160a01b03163314611b025760405162461bcd60e51b81526004016109fd90613cd0565b60ca5463ffffffff831610611b735760405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b60648201526084016109fd565b600060ca8363ffffffff1681548110611b8e57611b8e613913565b906000526020600020906002020190508060010160089054906101000a900460ff1615611c1b5760405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b60648201526084016109fd565b6001810154600160201b900463ffffffff164210611c9a5760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b60648201526084016109fd565b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5c9190613940565b6001600160a01b0316336001600160a01b031614611d8c5760405162461bcd60e51b81526004016109fd9061395d565b606654198119606654191614611e0a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016109fd565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610b46565b60665460009060019081161415611e6a5760405162461bcd60e51b81526004016109fd90613a0c565b60026097541415611e8d5760405162461bcd60e51b81526004016109fd90613a43565b600260975560005b82811015610df65736848483818110611eb057611eb0613913565b9050602002810190611ec29190613a7a565b33600081815260ce60209081526040808320549051949550939192611eed9290918591879101613bbf565b604051602081830303815290604052805190602001209050611f0e83612111565b33600090815260cf602090815260408083208484529091529020805460ff19166001908117909155611f41908390613bef565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190611f89908890613c07565b60405180910390a4611faa333060408601803590610dcf90602089016135a9565b5050508080611fb890613c1a565b915050611e95565b6033546001600160a01b0316331461160d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109fd565b6001600160a01b0381166120a85760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016109fd565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b600061211d8280613c86565b905011612182576040805162461bcd60e51b8152602060048201526024810191909152600080516020613ecb83398151915260448201527f7264735375626d697373696f6e3a206e6f20737472617465676965732073657460648201526084016109fd565b60008160400135116121f45760405162461bcd60e51b81526020600482015260416024820152600080516020613ecb83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a4016109fd565b6f4b3b4ca85a86c47a098a223fffffffff8160400135111561226c5760405162461bcd60e51b815260206004820152603f6024820152600080516020613ecb83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c617267650060648201526084016109fd565b63ffffffff7f0000000000000000000000000000000000000000000000000000000000000000166122a360a083016080840161379c565b63ffffffff1611156123285760405162461bcd60e51b81526020600482015260546024820152600080516020613ecb83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a4016109fd565b7f000000000000000000000000000000000000000000000000000000000000000061235960a083016080840161379c565b6123639190613da7565b63ffffffff16156124035760405162461bcd60e51b815260206004820152606a6024820152600080516020613ecb83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c4016109fd565b7f0000000000000000000000000000000000000000000000000000000000000000612434608083016060840161379c565b61243e9190613da7565b63ffffffff16156124e45760405162461bcd60e51b81526020600482015260706024820152600080516020613ecb83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c4016109fd565b6124f4608082016060830161379c565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff164261252c91906138fc565b111580156125755750612545608082016060830161379c565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b6125ef5760405162461bcd60e51b81526020600482015260516024820152600080516020613ecb83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a4016109fd565b61261f63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642613bef565b61262f608083016060840161379c565b63ffffffff1611156126b35760405162461bcd60e51b81526020600482015260536024820152600080516020613ecb83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a4016109fd565b6000805b6126c18380613c86565b90508110156128e45760006126d68480613c86565b838181106126e6576126e6613913565b6126fc92602060409092020190810191506135a9565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015612767573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278b91906139a7565b806127b257506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6128255760405162461bcd60e51b815260206004820152604a6024820152600080516020613ecb83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a4016109fd565b806001600160a01b0316836001600160a01b0316106128d25760405162461bcd60e51b81526020600482015260696024820152600080516020613ecb83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c4016109fd565b91506128dd81613c1a565b90506126b7565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526129549085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612f61565b50505050565b8060600151156129b35760405162461bcd60e51b81526020600482015260306024820152600080516020613eab83398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b60648201526084016109fd565b806040015163ffffffff16421015612a1a5760405162461bcd60e51b81526020600482015260366024820152600080516020613eab8339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b60648201526084016109fd565b612a2760c0830183613c35565b9050612a3660a0840184613c35565b905014612aae5760405162461bcd60e51b815260206004820152604c6024820152600080516020613eab83398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a4016109fd565b612abb60e0830183613c86565b9050612aca60c0840184613c35565b905014612b405760405162461bcd60e51b815260206004820152604a6024820152600080516020613eab83398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a4016109fd565b8051612b6c90612b56604085016020860161379c565b612b636040860186613dca565b86606001613033565b60005b612b7c60a0840184613c35565b90508110156128e457612c166080840135612b9a60a0860186613c35565b84818110612baa57612baa613913565b9050602002016020810190612bbf919061379c565b612bcc60c0870187613c35565b85818110612bdc57612bdc613913565b9050602002810190612bee9190613dca565b612bfb60e0890189613c86565b87818110612c0b57612c0b613913565b9050604002016131a7565b612c1f81613c1a565b9050612b6f565b6040516001600160a01b0383166024820152604481018290526128e490849063a9059cbb60e01b9060640161291d565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b0316158015612e2d57506001600160a01b03821615155b612eaf5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016109fd565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2612ef28261201a565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000612fb6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166132f89092919063ffffffff16565b8051909150156128e45780806020019051810190612fd491906139a7565b6128e45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016109fd565b61303e602083613e11565b6001901b8463ffffffff16106130c85760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a4016109fd565b60006130d382610b51565b905061311e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff891661330f565b61319f5760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a4016109fd565b505050505050565b6131b2602083613e11565b6001901b8463ffffffff16106132305760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e6465780000000060648201526084016109fd565b600061323b82611a9e565b905061328684848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff891661330f565b61319f5760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f660060648201526084016109fd565b60606133078484600085613327565b949350505050565b60008361331d868585613458565b1495945050505050565b6060824710156133885760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016109fd565b6001600160a01b0385163b6133df5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016109fd565b600080866001600160a01b031685876040516133fb9190613e51565b60006040518083038185875af1925050503d8060008114613438576040519150601f19603f3d011682016040523d82523d6000602084013e61343d565b606091505b509150915061344d82828661355b565b979650505050505050565b6000602084516134689190613e63565b156134ef5760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a4016109fd565b8260205b8551811161355257613506600285613e63565b61352757816000528086015160205260406000209150600284049350613540565b8086015160005281602052604060002091506002840493505b61354b602082613bef565b90506134f3565b50949350505050565b6060831561356a575081611962565b82511561357a5782518084602001fd5b8160405162461bcd60e51b81526004016109fd9190613e77565b6001600160a01b0381168114610a0f57600080fd5b6000602082840312156135bb57600080fd5b813561196281613594565b8015158114610a0f57600080fd5b600080604083850312156135e757600080fd5b82356135f281613594565b91506020830135613602816135c6565b809150509250929050565b60006020828403121561361f57600080fd5b5035919050565b60006040828403121561363857600080fd5b50919050565b60006040828403121561365057600080fd5b6119628383613626565b6000806040838503121561366d57600080fd5b823561367881613594565b9150602083013561360281613594565b6000806020838503121561369b57600080fd5b823567ffffffffffffffff808211156136b357600080fd5b818501915085601f8301126136c757600080fd5b8135818111156136d657600080fd5b8660208260051b85010111156136eb57600080fd5b60209290920196919550909350505050565b6000610100828403121561363857600080fd5b6000806040838503121561372357600080fd5b823567ffffffffffffffff81111561373a57600080fd5b613746858286016136fd565b925050602083013561360281613594565b803563ffffffff8116811461376b57600080fd5b919050565b6000806040838503121561378357600080fd5b8235915061379360208401613757565b90509250929050565b6000602082840312156137ae57600080fd5b61196282613757565b6000602082840312156137c957600080fd5b813560ff8116811461196257600080fd5b6000602082840312156137ec57600080fd5b813567ffffffffffffffff81111561380357600080fd5b613307848285016136fd565b6000806040838503121561382257600080fd5b823561382d81613594565b946020939093013593505050565b803561376b81613594565b803561ffff8116811461376b57600080fd5b60008060008060008060c0878903121561387157600080fd5b863561387c81613594565b9550602087013561388c81613594565b94506040870135935060608701356138a381613594565b92506138b160808801613757565b91506138bf60a08801613846565b90509295509295509295565b6000602082840312156138dd57600080fd5b61196282613846565b634e487b7160e01b600052601160045260246000fd5b60008282101561390e5761390e6138e6565b500390565b634e487b7160e01b600052603260045260246000fd5b600081613938576139386138e6565b506000190190565b60006020828403121561395257600080fd5b815161196281613594565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156139b957600080fd5b8151611962816135c6565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008235609e19833603018112613a9057600080fd5b9190910192915050565b818352600060208085019450826000805b86811015613aff578235613abe81613594565b6001600160a01b03168852828401356bffffffffffffffffffffffff8116808214613ae7578384fd5b89860152506040978801979290920191600101613aab565b50959695505050505050565b60008135601e19833603018112613b2157600080fd5b8201803567ffffffffffffffff811115613b3a57600080fd5b8060061b3603841315613b4c57600080fd5b60a08552613b6160a086018260208501613a9a565b915050613b706020840161383b565b6001600160a01b0316602085015260408381013590850152613b9460608401613757565b63ffffffff166060850152613bab60808401613757565b63ffffffff81166080860152509392505050565b60018060a01b0384168152826020820152606060408201526000613be66060830184613b0b565b95945050505050565b60008219821115613c0257613c026138e6565b500190565b6020815260006119626020830184613b0b565b6000600019821415613c2e57613c2e6138e6565b5060010190565b6000808335601e19843603018112613c4c57600080fd5b83018035915067ffffffffffffffff821115613c6757600080fd5b6020019150600581901b3603821315613c7f57600080fd5b9250929050565b6000808335601e19843603018112613c9d57600080fd5b83018035915067ffffffffffffffff821115613cb857600080fd5b6020019150600681901b3603821315613c7f57600080fd5b60208082526034908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6040820152733a103a3432903932bbb0b93239aab83230ba32b960611b606082015260800190565b600063ffffffff808316818516808303821115613d4357613d436138e6565b01949350505050565b600063ffffffff83811690831681811015613d6957613d696138e6565b039392505050565b600063ffffffff821680613d8757613d876138e6565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff80841680613dbe57613dbe613d91565b92169190910692915050565b6000808335601e19843603018112613de157600080fd5b83018035915067ffffffffffffffff821115613dfc57600080fd5b602001915036819003821315613c7f57600080fd5b600082613e2057613e20613d91565b500490565b60005b83811015613e40578181015183820152602001613e28565b838111156129545750506000910152565b60008251613a90818460208701613e25565b600082613e7257613e72613d91565b500690565b6020815260008251806020840152613e96816040850160208701613e25565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2052657761726473436f6f7264696e61746f722e5f76616c696461746552657761a2646970667358221220e5af77c5c79a3a1f7b84974f2789fb89e4b95901500e1c742b1e285bb759f77e64736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x6101806040523480156200001257600080fd5b5060405162004ac838038062004ac88339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e0516101005161012051610140516101605161468162000447600039600061204f0152600081816104f70152612d01015260006107f40152600081816104210152612b3001526000818161034d0152612bdc0152600081816104d00152612adf01526000818161074001526128560152600081816106e60152818161290d01526129e801526146816000f3fe608060405234801561001057600080fd5b506004361061030b5760003560e01c80637adace911161019d578063c46db606116100e9578063f2fde38b116100a2578063f96abf2e1161007c578063f96abf2e14610844578063fabc1cbc14610857578063fbf1e2c11461086a578063fce36c7d1461087d57600080fd5b8063f2fde38b14610816578063f698da2514610829578063f8cd84481461083157600080fd5b8063c46db60614610775578063d4540a55146107a3578063de02e503146107b6578063e221b245146107c9578063e810ce21146107dc578063ea4d3c9b146107ef57600080fd5b80639104c31911610156578063a0169ddd11610130578063a0169ddd14610708578063bb7e451f1461071b578063bf21a8aa1461073b578063c336f19d1461076257600080fd5b80639104c319146106be5780639be3d4e4146106d95780639d45c281146106e157600080fd5b80637adace91146106225780637b8f8b0514610654578063863cb9a91461065c578063865c69531461066f578063886f11951461069a5780638da5cb5b146106ad57600080fd5b80633a8c07861161025c57806358baaa3e116102155780635c975abb116101ef5780635c975abb146105d15780635e9d8348146105d95780636d21117e146105ec578063715018a61461061a57600080fd5b806358baaa3e14610593578063595c6a67146105a65780635ac86ab7146105ae57600080fd5b80633a8c0786146105195780633c8fcf7c146105305780633ccc861d146105435780633efe1db6146105565780634d18cc35146105695780634d7a80d41461058057600080fd5b8063131433b4116102c95780632b9f64a4116102a35780632b9f64a41461047757806336af41fa146104b857806337838ed0146104cb57806339b70e38146104f257600080fd5b8063131433b41461041c578063136439dd14610443578063149bc8721461045657600080fd5b806218572c1461031057806304a0c50214610348578063092db007146103845780630e9a53cf146103ac5780630eb38345146103f457806310d67a2f14610409575b600080fd5b61033361031e366004613b8c565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161033f565b60cb5461039990600160e01b900461ffff1681565b60405161ffff909116815260200161033f565b6103b4610890565b604080518251815260208084015163ffffffff9081169183019190915283830151169181019190915260609182015115159181019190915260800161033f565b610407610402366004613bb7565b61096f565b005b610407610417366004613b8c565b6109f1565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610407610451366004613bf0565b610aad565b610469610464366004613c21565b610bec565b60405190815260200161033f565b6104a0610485366004613b8c565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161033f565b6104076104c6366004613c3d565b610c62565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b6104a07f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461036f90600160a01b900463ffffffff1681565b61036f61053e366004613cd8565b610e94565b610407610551366004613d2f565b611125565b610407610564366004613d8a565b6114e7565b60cb5461036f90600160c01b900463ffffffff1681565b61039961058e366004613db6565b6117b8565b6104076105a1366004613df3565b61196a565b61040761197b565b6103336105bc366004613e0e565b606654600160ff9092169190911b9081161490565b606654610469565b6103336105e7366004613e31565b611a42565b6103336105fa366004613e66565b60cf60209081526000928352604080842090915290825290205460ff1681565b610407611acf565b610635610630366004613e92565b611ae3565b6040805161ffff909316835263ffffffff90911660208301520161033f565b60ca54610469565b61040761066a366004613b8c565b611b4b565b61046961067d366004613efd565b60cd60209081526000928352604080842090915290825290205481565b6065546104a0906001600160a01b031681565b6033546001600160a01b03166104a0565b6104a073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103b4611b5c565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610407610716366004613b8c565b611bfa565b610469610729366004613b8c565b60ce6020526000908152604090205481565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610469610770366004613db6565b611c59565b610333610783366004613e66565b60d060209081526000928352604080842090915290825290205460ff1681565b6104076107b1366004613f2b565b611d0f565b6103b46107c4366004613bf0565b611e57565b6104076107d7366004613f9e565b611ee9565b61036f6107ea366004613bf0565b611efa565b6104a07f000000000000000000000000000000000000000000000000000000000000000081565b610407610824366004613b8c565b611fd5565b61046961204b565b61046961083f366004613c21565b612089565b610407610852366004613df3565b61209a565b610407610865366004613bf0565b6122d0565b60cb546104a0906001600160a01b031681565b61040761088b366004613c3d565b61242c565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b801561096b57600060ca6108cd600184613fcf565b815481106108dd576108dd613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16158015606083018190529192509061094d5750806040015163ffffffff164210155b156109585792915050565b508061096381613ffc565b9150506108b8565b5090565b6109776125a3565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a689190614013565b6001600160a01b0316336001600160a01b031614610aa15760405162461bcd60e51b8152600401610a9890614030565b60405180910390fd5b610aaa816125fd565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b19919061407a565b610b355760405162461bcd60e51b8152600401610a9890614097565b60665481811614610bae5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610a98565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610bfc6020840184613b8c565b8360200135604051602001610c459392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610c8b5760405162461bcd60e51b8152600401610a98906140df565b33600090815260d1602052604090205460ff16610d2a5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a401610a98565b60026097541415610d4d5760405162461bcd60e51b8152600401610a9890614116565b600260975560005b82811015610e895736848483818110610d7057610d70613fe6565b9050602002810190610d82919061414d565b33600081815260ce60209081526040808320549051949550939192610dad9290918591879101614292565b604051602081830303815290604052805190602001209050610dce836126f4565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610e019083906142c2565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610e499088906142da565b60405180910390a4610e7b333060408601803590610e6a9060208901613b8c565b6001600160a01b0316929190612ecc565b836001019350505050610d55565b505060016097555050565b600061271061ffff83161115610f205760405162461bcd60e51b815260206004820152604560248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72436f60448201527f6d6d697373696f6e426970733a20636f6d6d697373696f6e4269707320746f6f606482015264040d0d2ced60db1b608482015260a401610a98565b610f2d62093a80426142c2565b33600090815260d26020908152604082209293509091908290610f5290880188613b8c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000866020016020810190610f879190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000856001811115610fb557610fb56142ed565b6001811115610fc657610fc66142ed565b815260208101919091526040016000208054909150801580611021575063ffffffff831682610ff6600184613fcf565b8154811061100657611006613fe6565b60009182526020909120015462010000900463ffffffff1614155b15611084576040805180820190915261ffff808616825263ffffffff808616602080850191825286546001810188556000888152919091209451940180549151909216620100000265ffffffffffff1990911693909216929092171790556110c1565b8382611091600184613fcf565b815481106110a1576110a1613fe6565b6000918252602090912001805461ffff191661ffff929092169190911790555b856040516110cf9190614303565b6040518091039020336001600160a01b03167f811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba8787876040516111149392919061433b565b60405180910390a350509392505050565b6066546002906004908116141561114e5760405162461bcd60e51b8152600401610a98906140df565b600260975414156111715760405162461bcd60e51b8152600401610a9890614116565b6002609755600060ca6111876020860186613df3565b63ffffffff168154811061119d5761119d613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015290506111fe8482612f3d565b60006112106080860160608701613b8c565b6001600160a01b03808216600090815260cc602052604090205491925016806112365750805b336001600160a01b038216146112b45760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608401610a98565b60005b6112c460a088018861437b565b90508110156114d957366112db60e08901896143cc565b838181106112eb576112eb613fe6565b6001600160a01b038716600090815260cd60209081526040808320930294909401945092909150829061132090850185613b8c565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808260200135116113da5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a401610a98565b60006113ea826020850135613fcf565b6001600160a01b038716600090815260cd602090815260408220929350850180359291906114189087613b8c565b6001600160a01b031681526020808201929092526040016000209190915561145a908a90839061144a90870187613b8c565b6001600160a01b03169190613209565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061149e6020890189613b8c565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050806114d290614416565b90506112b7565b505060016097555050505050565b606654600390600890811614156115105760405162461bcd60e51b8152600401610a98906140df565b60cb546001600160a01b0316331461153a5760405162461bcd60e51b8152600401610a9890614431565b60cb5463ffffffff600160c01b9091048116908316116115d65760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a401610a98565b428263ffffffff161061166f5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a401610a98565b60ca5460cb5460009061168f90600160a01b900463ffffffff1642614485565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b60cb546001600160a01b038416600090815260d26020908152604082209192600160e01b900461ffff1691839182906117f390880188613b8c565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008660200160208101906118289190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000856001811115611856576118566142ed565b6001811115611867576118676142ed565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156118db576000848152602090819020604080518082019091529084015461ffff8116825262010000900463ffffffff1681830152825260019092019101611895565b5050825192935050505b801561195d5763ffffffff4216826118fe600184613fcf565b8151811061190e5761190e613fe6565b60200260200101516020015163ffffffff16116119545781611931600183613fcf565b8151811061194157611941613fe6565b602002602001015160000151925061195d565b600019016118e5565b50909150505b9392505050565b6119726125a3565b610aaa81613239565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e7919061407a565b611a035760405162461bcd60e51b8152600401610a9890614097565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000611ac78260ca611a576020830183613df3565b63ffffffff1681548110611a6d57611a6d613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612f3d565b506001919050565b611ad76125a3565b611ae160006132aa565b565b60d26020528460005260406000206020528360005260406000206020528260005260406000206020528160005260406000208181548110611b2357600080fd5b60009182526020909120015461ffff8116955062010000900463ffffffff1693508592505050565b611b536125a3565b610aaa816132fc565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8054611b9090600190613fcf565b81548110611ba057611ba0613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b6001600160a01b038316600090815260d2602090815260408220908290611c8290860186613b8c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000846020016020810190611cb79190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000836001811115611ce557611ce56142ed565b6001811115611cf657611cf66142ed565b8152602081019190915260400160002054949350505050565b600054610100900460ff1615808015611d2f5750600054600160ff909116105b80611d495750303b158015611d49575060005460ff166001145b611dac5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a98565b6000805460ff191660011790558015611dcf576000805461ff0019166101001790555b611dd7613358565b60c955611de486866133ef565b611ded876132aa565b611df6846132fc565b611dff83613239565b611e08826134d9565b8015611e4e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8281548110611e8e57611e8e613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b611ef16125a3565b610aaa816134d9565b60ca546000905b63ffffffff811615611f66578260ca611f1b6001846144ad565b63ffffffff1681548110611f3157611f31613fe6565b9060005260206000209060020201600001541415611f54576119636001826144ad565b80611f5e816144d2565b915050611f01565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608401610a98565b611fdd6125a3565b6001600160a01b0381166120425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a98565b610aaa816132aa565b60007f000000000000000000000000000000000000000000000000000000000000000046141561207c575060c95490565b612084613358565b905090565b60006001610bfc6020840184613b8c565b606654600390600890811614156120c35760405162461bcd60e51b8152600401610a98906140df565b60cb546001600160a01b031633146120ed5760405162461bcd60e51b8152600401610a9890614431565b60ca5463ffffffff83161061215e5760405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608401610a98565b600060ca8363ffffffff168154811061217957612179613fe6565b906000526020600020906002020190508060010160089054906101000a900460ff16156122065760405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608401610a98565b6001810154600160201b900463ffffffff1642106122855760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608401610a98565b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123479190614013565b6001600160a01b0316336001600160a01b0316146123775760405162461bcd60e51b8152600401610a9890614030565b6066541981196066541916146123f55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610a98565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610be1565b606654600090600190811614156124555760405162461bcd60e51b8152600401610a98906140df565b600260975414156124785760405162461bcd60e51b8152600401610a9890614116565b600260975560005b82811015610e89573684848381811061249b5761249b613fe6565b90506020028101906124ad919061414d565b33600081815260ce602090815260408083205490519495509391926124d89290918591879101614292565b6040516020818303038152906040528051906020012090506124f9836126f4565b33600090815260cf602090815260408083208484529091529020805460ff1916600190811790915561252c9083906142c2565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281906125749088906142da565b60405180910390a4612595333060408601803590610e6a9060208901613b8c565b836001019350505050612480565b6033546001600160a01b03163314611ae15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a98565b6001600160a01b03811661268b5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610a98565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b600061270082806143cc565b905011612765576040805162461bcd60e51b815260206004820152602481019190915260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206e6f2073747261746567696573207365746064820152608401610a98565b60008160400135116127d75760405162461bcd60e51b8152602060048201526041602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a401610a98565b6f4b3b4ca85a86c47a098a223fffffffff8160400135111561284f5760405162461bcd60e51b815260206004820152603f602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608401610a98565b63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001661288660a0830160808401613df3565b63ffffffff16111561290b5760405162461bcd60e51b8152602060048201526054602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a401610a98565b7f000000000000000000000000000000000000000000000000000000000000000061293c60a0830160808401613df3565b6129469190614508565b63ffffffff16156129e65760405162461bcd60e51b815260206004820152606a602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c401610a98565b7f0000000000000000000000000000000000000000000000000000000000000000612a176080830160608401613df3565b612a219190614508565b63ffffffff1615612ac75760405162461bcd60e51b8152602060048201526070602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c401610a98565b612ad76080820160608301613df3565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612b0f9190613fcf565b11158015612b585750612b286080820160608301613df3565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612bd25760405162461bcd60e51b8152602060048201526051602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a401610a98565b612c0263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016426142c2565b612c126080830160608401613df3565b63ffffffff161115612c965760405162461bcd60e51b8152602060048201526053602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a401610a98565b6000805b612ca483806143cc565b9050811015612ec7576000612cb984806143cc565b83818110612cc957612cc9613fe6565b612cdf9260206040909202019081019150613b8c565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015612d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6e919061407a565b80612d9557506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b612e085760405162461bcd60e51b815260206004820152604a602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a401610a98565b806001600160a01b0316836001600160a01b031610612eb55760405162461bcd60e51b8152602060048201526069602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c401610a98565b9150612ec081614416565b9050612c9a565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052612f379085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613544565b50505050565b806060015115612f965760405162461bcd60e51b8152602060048201526030602482015260008051602061460c83398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608401610a98565b806040015163ffffffff16421015612ffd5760405162461bcd60e51b8152602060048201526036602482015260008051602061460c8339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608401610a98565b61300a60c083018361437b565b905061301960a084018461437b565b9050146130915760405162461bcd60e51b815260206004820152604c602482015260008051602061460c83398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a401610a98565b61309e60e08301836143cc565b90506130ad60c084018461437b565b9050146131235760405162461bcd60e51b815260206004820152604a602482015260008051602061460c83398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610a98565b805161314f906131396040850160208601613df3565b613146604086018661452b565b86606001613616565b60005b61315f60a084018461437b565b9050811015612ec7576131f9608084013561317d60a086018661437b565b8481811061318d5761318d613fe6565b90506020020160208101906131a29190613df3565b6131af60c087018761437b565b858181106131bf576131bf613fe6565b90506020028101906131d1919061452b565b6131de60e08901896143cc565b878181106131ee576131ee613fe6565b90506040020161378a565b61320281614416565b9050613152565b6040516001600160a01b038316602482015260448101829052612ec790849063a9059cbb60e01b90606401612f00565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b031615801561341057506001600160a01b03821615155b6134925760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610a98565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26134d5826125fd565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000613599826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138db9092919063ffffffff16565b805190915015612ec757808060200190518101906135b7919061407a565b612ec75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a98565b613621602083614572565b6001901b8463ffffffff16106136ab5760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a401610a98565b60006136b682610bec565b905061370184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff89166138f2565b6137825760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a401610a98565b505050505050565b613795602083614572565b6001901b8463ffffffff16106138135760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608401610a98565b600061381e82612089565b905061386984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff89166138f2565b6137825760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608401610a98565b60606138ea848460008561390a565b949350505050565b600083613900868585613a3b565b1495945050505050565b60608247101561396b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a98565b6001600160a01b0385163b6139c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a98565b600080866001600160a01b031685876040516139de91906145b2565b60006040518083038185875af1925050503d8060008114613a1b576040519150601f19603f3d011682016040523d82523d6000602084013e613a20565b606091505b5091509150613a30828286613b3e565b979650505050505050565b600060208451613a4b91906145c4565b15613ad25760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610a98565b8260205b85518111613b3557613ae96002856145c4565b613b0a57816000528086015160205260406000209150600284049350613b23565b8086015160005281602052604060002091506002840493505b613b2e6020826142c2565b9050613ad6565b50949350505050565b60608315613b4d575081611963565b825115613b5d5782518084602001fd5b8160405162461bcd60e51b8152600401610a9891906145d8565b6001600160a01b0381168114610aaa57600080fd5b600060208284031215613b9e57600080fd5b813561196381613b77565b8015158114610aaa57600080fd5b60008060408385031215613bca57600080fd5b8235613bd581613b77565b91506020830135613be581613ba9565b809150509250929050565b600060208284031215613c0257600080fd5b5035919050565b600060408284031215613c1b57600080fd5b50919050565b600060408284031215613c3357600080fd5b6119638383613c09565b60008060208385031215613c5057600080fd5b823567ffffffffffffffff80821115613c6857600080fd5b818501915085601f830112613c7c57600080fd5b813581811115613c8b57600080fd5b8660208260051b8501011115613ca057600080fd5b60209290920196919550909350505050565b803560028110613cc157600080fd5b919050565b803561ffff81168114613cc157600080fd5b600080600060808486031215613ced57600080fd5b613cf78585613c09565b9250613d0560408501613cb2565b9150613d1360608501613cc6565b90509250925092565b60006101008284031215613c1b57600080fd5b60008060408385031215613d4257600080fd5b823567ffffffffffffffff811115613d5957600080fd5b613d6585828601613d1c565b9250506020830135613be581613b77565b803563ffffffff81168114613cc157600080fd5b60008060408385031215613d9d57600080fd5b82359150613dad60208401613d76565b90509250929050565b600080600060808486031215613dcb57600080fd5b8335613dd681613b77565b9250613de58560208601613c09565b9150613d1360608501613cb2565b600060208284031215613e0557600080fd5b61196382613d76565b600060208284031215613e2057600080fd5b813560ff8116811461196357600080fd5b600060208284031215613e4357600080fd5b813567ffffffffffffffff811115613e5a57600080fd5b6138ea84828501613d1c565b60008060408385031215613e7957600080fd5b8235613e8481613b77565b946020939093013593505050565b600080600080600060a08688031215613eaa57600080fd5b8535613eb581613b77565b94506020860135613ec581613b77565b9350613ed360408701613d76565b9250613ee160608701613cb2565b949793965091946080013592915050565b8035613cc181613b77565b60008060408385031215613f1057600080fd5b8235613f1b81613b77565b91506020830135613be581613b77565b60008060008060008060c08789031215613f4457600080fd5b8635613f4f81613b77565b95506020870135613f5f81613b77565b9450604087013593506060870135613f7681613b77565b9250613f8460808801613d76565b9150613f9260a08801613cc6565b90509295509295509295565b600060208284031215613fb057600080fd5b61196382613cc6565b634e487b7160e01b600052601160045260246000fd5b600082821015613fe157613fe1613fb9565b500390565b634e487b7160e01b600052603260045260246000fd5b60008161400b5761400b613fb9565b506000190190565b60006020828403121561402557600080fd5b815161196381613b77565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561408c57600080fd5b815161196381613ba9565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008235609e1983360301811261416357600080fd5b9190910192915050565b818352600060208085019450826000805b868110156141d257823561419181613b77565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146141ba578384fd5b8986015250604097880197929092019160010161417e565b50959695505050505050565b60008135601e198336030181126141f457600080fd5b8201803567ffffffffffffffff81111561420d57600080fd5b8060061b360384131561421f57600080fd5b60a0855261423460a08601826020850161416d565b91505061424360208401613ef2565b6001600160a01b031660208501526040838101359085015261426760608401613d76565b63ffffffff16606085015261427e60808401613d76565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006142b960608301846141de565b95945050505050565b600082198211156142d5576142d5613fb9565b500190565b60208152600061196360208301846141de565b634e487b7160e01b600052602160045260246000fd5b6000823561431081613b77565b6001600160a01b0316825263ffffffff61432c60208501613d76565b16602083015250604001919050565b606081016002851061435d57634e487b7160e01b600052602160045260246000fd5b93815261ffff92909216602083015263ffffffff1660409091015290565b6000808335601e1984360301811261439257600080fd5b83018035915067ffffffffffffffff8211156143ad57600080fd5b6020019150600581901b36038213156143c557600080fd5b9250929050565b6000808335601e198436030181126143e357600080fd5b83018035915067ffffffffffffffff8211156143fe57600080fd5b6020019150600681901b36038213156143c557600080fd5b600060001982141561442a5761442a613fb9565b5060010190565b60208082526034908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6040820152733a103a3432903932bbb0b93239aab83230ba32b960611b606082015260800190565b600063ffffffff8083168185168083038211156144a4576144a4613fb9565b01949350505050565b600063ffffffff838116908316818110156144ca576144ca613fb9565b039392505050565b600063ffffffff8216806144e8576144e8613fb9565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061451f5761451f6144f2565b92169190910692915050565b6000808335601e1984360301811261454257600080fd5b83018035915067ffffffffffffffff82111561455d57600080fd5b6020019150368190038213156143c557600080fd5b600082614581576145816144f2565b500490565b60005b838110156145a1578181015183820152602001614589565b83811115612f375750506000910152565b60008251614163818460208701614586565b6000826145d3576145d36144f2565b500690565b60208152600082518060208401526145f7816040850160208701614586565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2052657761726473436f6f7264696e61746f722e5f76616c696461746552657761a2646970667358221220d7afccc0db13e91ca036bb96c0a4c5201c43a88dd680365dbaef13011707d7b064736f6c634300080c0033", } // RewardsCoordinatorABI is the input ABI used to generate the binding from. @@ -837,6 +843,68 @@ func (_RewardsCoordinator *RewardsCoordinatorCallerSession) GetDistributionRoots return _RewardsCoordinator.Contract.GetDistributionRootsLength(&_RewardsCoordinator.CallOpts) } +// GetOperatorCommissionBips is a free data retrieval call binding the contract method 0x4d7a80d4. +// +// Solidity: function getOperatorCommissionBips(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint16) +func (_RewardsCoordinator *RewardsCoordinatorCaller) GetOperatorCommissionBips(opts *bind.CallOpts, operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (uint16, error) { + var out []interface{} + err := _RewardsCoordinator.contract.Call(opts, &out, "getOperatorCommissionBips", operator, operatorSet, rewardType) + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// GetOperatorCommissionBips is a free data retrieval call binding the contract method 0x4d7a80d4. +// +// Solidity: function getOperatorCommissionBips(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint16) +func (_RewardsCoordinator *RewardsCoordinatorSession) GetOperatorCommissionBips(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (uint16, error) { + return _RewardsCoordinator.Contract.GetOperatorCommissionBips(&_RewardsCoordinator.CallOpts, operator, operatorSet, rewardType) +} + +// GetOperatorCommissionBips is a free data retrieval call binding the contract method 0x4d7a80d4. +// +// Solidity: function getOperatorCommissionBips(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint16) +func (_RewardsCoordinator *RewardsCoordinatorCallerSession) GetOperatorCommissionBips(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (uint16, error) { + return _RewardsCoordinator.Contract.GetOperatorCommissionBips(&_RewardsCoordinator.CallOpts, operator, operatorSet, rewardType) +} + +// GetOperatorCommissionUpdateHistoryLength is a free data retrieval call binding the contract method 0xc336f19d. +// +// Solidity: function getOperatorCommissionUpdateHistoryLength(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint256) +func (_RewardsCoordinator *RewardsCoordinatorCaller) GetOperatorCommissionUpdateHistoryLength(opts *bind.CallOpts, operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (*big.Int, error) { + var out []interface{} + err := _RewardsCoordinator.contract.Call(opts, &out, "getOperatorCommissionUpdateHistoryLength", operator, operatorSet, rewardType) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetOperatorCommissionUpdateHistoryLength is a free data retrieval call binding the contract method 0xc336f19d. +// +// Solidity: function getOperatorCommissionUpdateHistoryLength(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint256) +func (_RewardsCoordinator *RewardsCoordinatorSession) GetOperatorCommissionUpdateHistoryLength(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (*big.Int, error) { + return _RewardsCoordinator.Contract.GetOperatorCommissionUpdateHistoryLength(&_RewardsCoordinator.CallOpts, operator, operatorSet, rewardType) +} + +// GetOperatorCommissionUpdateHistoryLength is a free data retrieval call binding the contract method 0xc336f19d. +// +// Solidity: function getOperatorCommissionUpdateHistoryLength(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint256) +func (_RewardsCoordinator *RewardsCoordinatorCallerSession) GetOperatorCommissionUpdateHistoryLength(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (*big.Int, error) { + return _RewardsCoordinator.Contract.GetOperatorCommissionUpdateHistoryLength(&_RewardsCoordinator.CallOpts, operator, operatorSet, rewardType) +} + // GetRootIndexFromHash is a free data retrieval call binding the contract method 0xe810ce21. // // Solidity: function getRootIndexFromHash(bytes32 rootHash) view returns(uint32) @@ -992,35 +1060,49 @@ func (_RewardsCoordinator *RewardsCoordinatorCallerSession) IsRewardsSubmissionF return _RewardsCoordinator.Contract.IsRewardsSubmissionForAllHash(&_RewardsCoordinator.CallOpts, arg0, arg1) } -// OperatorCommissionBips is a free data retrieval call binding the contract method 0x22f19a64. +// OperatorCommissionUpdates is a free data retrieval call binding the contract method 0x7adace91. // -// Solidity: function operatorCommissionBips(address operator, address avs) view returns(uint16) -func (_RewardsCoordinator *RewardsCoordinatorCaller) OperatorCommissionBips(opts *bind.CallOpts, operator common.Address, avs common.Address) (uint16, error) { +// Solidity: function operatorCommissionUpdates(address , address , uint32 , uint8 , uint256 ) view returns(uint16 commissionBips, uint32 effectTimestamp) +func (_RewardsCoordinator *RewardsCoordinatorCaller) OperatorCommissionUpdates(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address, arg2 uint32, arg3 uint8, arg4 *big.Int) (struct { + CommissionBips uint16 + EffectTimestamp uint32 +}, error) { var out []interface{} - err := _RewardsCoordinator.contract.Call(opts, &out, "operatorCommissionBips", operator, avs) + err := _RewardsCoordinator.contract.Call(opts, &out, "operatorCommissionUpdates", arg0, arg1, arg2, arg3, arg4) + outstruct := new(struct { + CommissionBips uint16 + EffectTimestamp uint32 + }) if err != nil { - return *new(uint16), err + return *outstruct, err } - out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + outstruct.CommissionBips = *abi.ConvertType(out[0], new(uint16)).(*uint16) + outstruct.EffectTimestamp = *abi.ConvertType(out[1], new(uint32)).(*uint32) - return out0, err + return *outstruct, err } -// OperatorCommissionBips is a free data retrieval call binding the contract method 0x22f19a64. +// OperatorCommissionUpdates is a free data retrieval call binding the contract method 0x7adace91. // -// Solidity: function operatorCommissionBips(address operator, address avs) view returns(uint16) -func (_RewardsCoordinator *RewardsCoordinatorSession) OperatorCommissionBips(operator common.Address, avs common.Address) (uint16, error) { - return _RewardsCoordinator.Contract.OperatorCommissionBips(&_RewardsCoordinator.CallOpts, operator, avs) +// Solidity: function operatorCommissionUpdates(address , address , uint32 , uint8 , uint256 ) view returns(uint16 commissionBips, uint32 effectTimestamp) +func (_RewardsCoordinator *RewardsCoordinatorSession) OperatorCommissionUpdates(arg0 common.Address, arg1 common.Address, arg2 uint32, arg3 uint8, arg4 *big.Int) (struct { + CommissionBips uint16 + EffectTimestamp uint32 +}, error) { + return _RewardsCoordinator.Contract.OperatorCommissionUpdates(&_RewardsCoordinator.CallOpts, arg0, arg1, arg2, arg3, arg4) } -// OperatorCommissionBips is a free data retrieval call binding the contract method 0x22f19a64. +// OperatorCommissionUpdates is a free data retrieval call binding the contract method 0x7adace91. // -// Solidity: function operatorCommissionBips(address operator, address avs) view returns(uint16) -func (_RewardsCoordinator *RewardsCoordinatorCallerSession) OperatorCommissionBips(operator common.Address, avs common.Address) (uint16, error) { - return _RewardsCoordinator.Contract.OperatorCommissionBips(&_RewardsCoordinator.CallOpts, operator, avs) +// Solidity: function operatorCommissionUpdates(address , address , uint32 , uint8 , uint256 ) view returns(uint16 commissionBips, uint32 effectTimestamp) +func (_RewardsCoordinator *RewardsCoordinatorCallerSession) OperatorCommissionUpdates(arg0 common.Address, arg1 common.Address, arg2 uint32, arg3 uint8, arg4 *big.Int) (struct { + CommissionBips uint16 + EffectTimestamp uint32 +}, error) { + return _RewardsCoordinator.Contract.OperatorCommissionUpdates(&_RewardsCoordinator.CallOpts, arg0, arg1, arg2, arg3, arg4) } // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. @@ -1471,6 +1553,27 @@ func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) SetGlobalOperato return _RewardsCoordinator.Contract.SetGlobalOperatorCommission(&_RewardsCoordinator.TransactOpts, _globalCommissionBips) } +// SetOperatorCommissionBips is a paid mutator transaction binding the contract method 0x3c8fcf7c. +// +// Solidity: function setOperatorCommissionBips((address,uint32) operatorSet, uint8 rewardType, uint16 commissionBips) returns(uint32 effectTimestamp) +func (_RewardsCoordinator *RewardsCoordinatorTransactor) SetOperatorCommissionBips(opts *bind.TransactOpts, operatorSet IAVSDirectoryOperatorSet, rewardType uint8, commissionBips uint16) (*types.Transaction, error) { + return _RewardsCoordinator.contract.Transact(opts, "setOperatorCommissionBips", operatorSet, rewardType, commissionBips) +} + +// SetOperatorCommissionBips is a paid mutator transaction binding the contract method 0x3c8fcf7c. +// +// Solidity: function setOperatorCommissionBips((address,uint32) operatorSet, uint8 rewardType, uint16 commissionBips) returns(uint32 effectTimestamp) +func (_RewardsCoordinator *RewardsCoordinatorSession) SetOperatorCommissionBips(operatorSet IAVSDirectoryOperatorSet, rewardType uint8, commissionBips uint16) (*types.Transaction, error) { + return _RewardsCoordinator.Contract.SetOperatorCommissionBips(&_RewardsCoordinator.TransactOpts, operatorSet, rewardType, commissionBips) +} + +// SetOperatorCommissionBips is a paid mutator transaction binding the contract method 0x3c8fcf7c. +// +// Solidity: function setOperatorCommissionBips((address,uint32) operatorSet, uint8 rewardType, uint16 commissionBips) returns(uint32 effectTimestamp) +func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) SetOperatorCommissionBips(operatorSet IAVSDirectoryOperatorSet, rewardType uint8, commissionBips uint16) (*types.Transaction, error) { + return _RewardsCoordinator.Contract.SetOperatorCommissionBips(&_RewardsCoordinator.TransactOpts, operatorSet, rewardType, commissionBips) +} + // SetPauserRegistry is a paid mutator transaction binding the contract method 0x10d67a2f. // // Solidity: function setPauserRegistry(address newPauserRegistry) returns() @@ -2633,6 +2736,162 @@ func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseInitialized(log type return event, nil } +// RewardsCoordinatorOperatorCommissionUpdatedIterator is returned from FilterOperatorCommissionUpdated and is used to iterate over the raw logs and unpacked data for OperatorCommissionUpdated events raised by the RewardsCoordinator contract. +type RewardsCoordinatorOperatorCommissionUpdatedIterator struct { + Event *RewardsCoordinatorOperatorCommissionUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *RewardsCoordinatorOperatorCommissionUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(RewardsCoordinatorOperatorCommissionUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(RewardsCoordinatorOperatorCommissionUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *RewardsCoordinatorOperatorCommissionUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *RewardsCoordinatorOperatorCommissionUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// RewardsCoordinatorOperatorCommissionUpdated represents a OperatorCommissionUpdated event raised by the RewardsCoordinator contract. +type RewardsCoordinatorOperatorCommissionUpdated struct { + Operator common.Address + OperatorSet IAVSDirectoryOperatorSet + RewardType uint8 + NewCommissionBips uint16 + EffectTimestamp uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorCommissionUpdated is a free log retrieval operation binding the contract event 0x811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba. +// +// Solidity: event OperatorCommissionUpdated(address indexed operator, (address,uint32) indexed operatorSet, uint8 rewardType, uint16 newCommissionBips, uint32 effectTimestamp) +func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterOperatorCommissionUpdated(opts *bind.FilterOpts, operator []common.Address, operatorSet []IAVSDirectoryOperatorSet) (*RewardsCoordinatorOperatorCommissionUpdatedIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var operatorSetRule []interface{} + for _, operatorSetItem := range operatorSet { + operatorSetRule = append(operatorSetRule, operatorSetItem) + } + + logs, sub, err := _RewardsCoordinator.contract.FilterLogs(opts, "OperatorCommissionUpdated", operatorRule, operatorSetRule) + if err != nil { + return nil, err + } + return &RewardsCoordinatorOperatorCommissionUpdatedIterator{contract: _RewardsCoordinator.contract, event: "OperatorCommissionUpdated", logs: logs, sub: sub}, nil +} + +// WatchOperatorCommissionUpdated is a free log subscription operation binding the contract event 0x811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba. +// +// Solidity: event OperatorCommissionUpdated(address indexed operator, (address,uint32) indexed operatorSet, uint8 rewardType, uint16 newCommissionBips, uint32 effectTimestamp) +func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchOperatorCommissionUpdated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorOperatorCommissionUpdated, operator []common.Address, operatorSet []IAVSDirectoryOperatorSet) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var operatorSetRule []interface{} + for _, operatorSetItem := range operatorSet { + operatorSetRule = append(operatorSetRule, operatorSetItem) + } + + logs, sub, err := _RewardsCoordinator.contract.WatchLogs(opts, "OperatorCommissionUpdated", operatorRule, operatorSetRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(RewardsCoordinatorOperatorCommissionUpdated) + if err := _RewardsCoordinator.contract.UnpackLog(event, "OperatorCommissionUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorCommissionUpdated is a log parse operation binding the contract event 0x811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba. +// +// Solidity: event OperatorCommissionUpdated(address indexed operator, (address,uint32) indexed operatorSet, uint8 rewardType, uint16 newCommissionBips, uint32 effectTimestamp) +func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOperatorCommissionUpdated(log types.Log) (*RewardsCoordinatorOperatorCommissionUpdated, error) { + event := new(RewardsCoordinatorOperatorCommissionUpdated) + if err := _RewardsCoordinator.contract.UnpackLog(event, "OperatorCommissionUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // RewardsCoordinatorOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the RewardsCoordinator contract. type RewardsCoordinatorOwnershipTransferredIterator struct { Event *RewardsCoordinatorOwnershipTransferred // Event containing the contract specifics and raw log diff --git a/pkg/bindings/RewardsCoordinatorStorage/binding.go b/pkg/bindings/RewardsCoordinatorStorage/binding.go index 22e26b8e8..2e5ed3f4c 100644 --- a/pkg/bindings/RewardsCoordinatorStorage/binding.go +++ b/pkg/bindings/RewardsCoordinatorStorage/binding.go @@ -29,6 +29,12 @@ var ( _ = abi.ConvertType ) +// IAVSDirectoryOperatorSet is an auto generated low-level Go binding around an user-defined struct. +type IAVSDirectoryOperatorSet struct { + Avs common.Address + Id uint32 +} + // IRewardsCoordinatorDistributionRoot is an auto generated low-level Go binding around an user-defined struct. type IRewardsCoordinatorDistributionRoot struct { Root [32]byte @@ -77,7 +83,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorStorageMetaData contains all meta data concerning the RewardsCoordinatorStorage contract. var RewardsCoordinatorStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", } // RewardsCoordinatorStorageABI is the input ABI used to generate the binding from. @@ -722,6 +728,68 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) GetDis return _RewardsCoordinatorStorage.Contract.GetDistributionRootsLength(&_RewardsCoordinatorStorage.CallOpts) } +// GetOperatorCommissionBips is a free data retrieval call binding the contract method 0x4d7a80d4. +// +// Solidity: function getOperatorCommissionBips(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint16) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) GetOperatorCommissionBips(opts *bind.CallOpts, operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (uint16, error) { + var out []interface{} + err := _RewardsCoordinatorStorage.contract.Call(opts, &out, "getOperatorCommissionBips", operator, operatorSet, rewardType) + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// GetOperatorCommissionBips is a free data retrieval call binding the contract method 0x4d7a80d4. +// +// Solidity: function getOperatorCommissionBips(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint16) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) GetOperatorCommissionBips(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (uint16, error) { + return _RewardsCoordinatorStorage.Contract.GetOperatorCommissionBips(&_RewardsCoordinatorStorage.CallOpts, operator, operatorSet, rewardType) +} + +// GetOperatorCommissionBips is a free data retrieval call binding the contract method 0x4d7a80d4. +// +// Solidity: function getOperatorCommissionBips(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint16) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) GetOperatorCommissionBips(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (uint16, error) { + return _RewardsCoordinatorStorage.Contract.GetOperatorCommissionBips(&_RewardsCoordinatorStorage.CallOpts, operator, operatorSet, rewardType) +} + +// GetOperatorCommissionUpdateHistoryLength is a free data retrieval call binding the contract method 0xc336f19d. +// +// Solidity: function getOperatorCommissionUpdateHistoryLength(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint256) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) GetOperatorCommissionUpdateHistoryLength(opts *bind.CallOpts, operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (*big.Int, error) { + var out []interface{} + err := _RewardsCoordinatorStorage.contract.Call(opts, &out, "getOperatorCommissionUpdateHistoryLength", operator, operatorSet, rewardType) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetOperatorCommissionUpdateHistoryLength is a free data retrieval call binding the contract method 0xc336f19d. +// +// Solidity: function getOperatorCommissionUpdateHistoryLength(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint256) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) GetOperatorCommissionUpdateHistoryLength(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (*big.Int, error) { + return _RewardsCoordinatorStorage.Contract.GetOperatorCommissionUpdateHistoryLength(&_RewardsCoordinatorStorage.CallOpts, operator, operatorSet, rewardType) +} + +// GetOperatorCommissionUpdateHistoryLength is a free data retrieval call binding the contract method 0xc336f19d. +// +// Solidity: function getOperatorCommissionUpdateHistoryLength(address operator, (address,uint32) operatorSet, uint8 rewardType) view returns(uint256) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) GetOperatorCommissionUpdateHistoryLength(operator common.Address, operatorSet IAVSDirectoryOperatorSet, rewardType uint8) (*big.Int, error) { + return _RewardsCoordinatorStorage.Contract.GetOperatorCommissionUpdateHistoryLength(&_RewardsCoordinatorStorage.CallOpts, operator, operatorSet, rewardType) +} + // GetRootIndexFromHash is a free data retrieval call binding the contract method 0xe810ce21. // // Solidity: function getRootIndexFromHash(bytes32 rootHash) view returns(uint32) @@ -877,35 +945,49 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) IsRewa return _RewardsCoordinatorStorage.Contract.IsRewardsSubmissionForAllHash(&_RewardsCoordinatorStorage.CallOpts, arg0, arg1) } -// OperatorCommissionBips is a free data retrieval call binding the contract method 0x22f19a64. +// OperatorCommissionUpdates is a free data retrieval call binding the contract method 0x7adace91. // -// Solidity: function operatorCommissionBips(address operator, address avs) view returns(uint16) -func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) OperatorCommissionBips(opts *bind.CallOpts, operator common.Address, avs common.Address) (uint16, error) { +// Solidity: function operatorCommissionUpdates(address , address , uint32 , uint8 , uint256 ) view returns(uint16 commissionBips, uint32 effectTimestamp) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) OperatorCommissionUpdates(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address, arg2 uint32, arg3 uint8, arg4 *big.Int) (struct { + CommissionBips uint16 + EffectTimestamp uint32 +}, error) { var out []interface{} - err := _RewardsCoordinatorStorage.contract.Call(opts, &out, "operatorCommissionBips", operator, avs) + err := _RewardsCoordinatorStorage.contract.Call(opts, &out, "operatorCommissionUpdates", arg0, arg1, arg2, arg3, arg4) + outstruct := new(struct { + CommissionBips uint16 + EffectTimestamp uint32 + }) if err != nil { - return *new(uint16), err + return *outstruct, err } - out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + outstruct.CommissionBips = *abi.ConvertType(out[0], new(uint16)).(*uint16) + outstruct.EffectTimestamp = *abi.ConvertType(out[1], new(uint32)).(*uint32) - return out0, err + return *outstruct, err } -// OperatorCommissionBips is a free data retrieval call binding the contract method 0x22f19a64. +// OperatorCommissionUpdates is a free data retrieval call binding the contract method 0x7adace91. // -// Solidity: function operatorCommissionBips(address operator, address avs) view returns(uint16) -func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) OperatorCommissionBips(operator common.Address, avs common.Address) (uint16, error) { - return _RewardsCoordinatorStorage.Contract.OperatorCommissionBips(&_RewardsCoordinatorStorage.CallOpts, operator, avs) +// Solidity: function operatorCommissionUpdates(address , address , uint32 , uint8 , uint256 ) view returns(uint16 commissionBips, uint32 effectTimestamp) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) OperatorCommissionUpdates(arg0 common.Address, arg1 common.Address, arg2 uint32, arg3 uint8, arg4 *big.Int) (struct { + CommissionBips uint16 + EffectTimestamp uint32 +}, error) { + return _RewardsCoordinatorStorage.Contract.OperatorCommissionUpdates(&_RewardsCoordinatorStorage.CallOpts, arg0, arg1, arg2, arg3, arg4) } -// OperatorCommissionBips is a free data retrieval call binding the contract method 0x22f19a64. +// OperatorCommissionUpdates is a free data retrieval call binding the contract method 0x7adace91. // -// Solidity: function operatorCommissionBips(address operator, address avs) view returns(uint16) -func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) OperatorCommissionBips(operator common.Address, avs common.Address) (uint16, error) { - return _RewardsCoordinatorStorage.Contract.OperatorCommissionBips(&_RewardsCoordinatorStorage.CallOpts, operator, avs) +// Solidity: function operatorCommissionUpdates(address , address , uint32 , uint8 , uint256 ) view returns(uint16 commissionBips, uint32 effectTimestamp) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) OperatorCommissionUpdates(arg0 common.Address, arg1 common.Address, arg2 uint32, arg3 uint8, arg4 *big.Int) (struct { + CommissionBips uint16 + EffectTimestamp uint32 +}, error) { + return _RewardsCoordinatorStorage.Contract.OperatorCommissionUpdates(&_RewardsCoordinatorStorage.CallOpts, arg0, arg1, arg2, arg3, arg4) } // RewardsUpdater is a free data retrieval call binding the contract method 0xfbf1e2c1. @@ -1148,6 +1230,27 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) Se return _RewardsCoordinatorStorage.Contract.SetGlobalOperatorCommission(&_RewardsCoordinatorStorage.TransactOpts, _globalCommissionBips) } +// SetOperatorCommissionBips is a paid mutator transaction binding the contract method 0x3c8fcf7c. +// +// Solidity: function setOperatorCommissionBips((address,uint32) operatorSet, uint8 rewardType, uint16 commissionBips) returns(uint32) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) SetOperatorCommissionBips(opts *bind.TransactOpts, operatorSet IAVSDirectoryOperatorSet, rewardType uint8, commissionBips uint16) (*types.Transaction, error) { + return _RewardsCoordinatorStorage.contract.Transact(opts, "setOperatorCommissionBips", operatorSet, rewardType, commissionBips) +} + +// SetOperatorCommissionBips is a paid mutator transaction binding the contract method 0x3c8fcf7c. +// +// Solidity: function setOperatorCommissionBips((address,uint32) operatorSet, uint8 rewardType, uint16 commissionBips) returns(uint32) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) SetOperatorCommissionBips(operatorSet IAVSDirectoryOperatorSet, rewardType uint8, commissionBips uint16) (*types.Transaction, error) { + return _RewardsCoordinatorStorage.Contract.SetOperatorCommissionBips(&_RewardsCoordinatorStorage.TransactOpts, operatorSet, rewardType, commissionBips) +} + +// SetOperatorCommissionBips is a paid mutator transaction binding the contract method 0x3c8fcf7c. +// +// Solidity: function setOperatorCommissionBips((address,uint32) operatorSet, uint8 rewardType, uint16 commissionBips) returns(uint32) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) SetOperatorCommissionBips(operatorSet IAVSDirectoryOperatorSet, rewardType uint8, commissionBips uint16) (*types.Transaction, error) { + return _RewardsCoordinatorStorage.Contract.SetOperatorCommissionBips(&_RewardsCoordinatorStorage.TransactOpts, operatorSet, rewardType, commissionBips) +} + // SetRewardsForAllSubmitter is a paid mutator transaction binding the contract method 0x0eb38345. // // Solidity: function setRewardsForAllSubmitter(address _submitter, bool _newValue) returns() @@ -2113,6 +2216,162 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseGlobal return event, nil } +// RewardsCoordinatorStorageOperatorCommissionUpdatedIterator is returned from FilterOperatorCommissionUpdated and is used to iterate over the raw logs and unpacked data for OperatorCommissionUpdated events raised by the RewardsCoordinatorStorage contract. +type RewardsCoordinatorStorageOperatorCommissionUpdatedIterator struct { + Event *RewardsCoordinatorStorageOperatorCommissionUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *RewardsCoordinatorStorageOperatorCommissionUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(RewardsCoordinatorStorageOperatorCommissionUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(RewardsCoordinatorStorageOperatorCommissionUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *RewardsCoordinatorStorageOperatorCommissionUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *RewardsCoordinatorStorageOperatorCommissionUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// RewardsCoordinatorStorageOperatorCommissionUpdated represents a OperatorCommissionUpdated event raised by the RewardsCoordinatorStorage contract. +type RewardsCoordinatorStorageOperatorCommissionUpdated struct { + Operator common.Address + OperatorSet IAVSDirectoryOperatorSet + RewardType uint8 + NewCommissionBips uint16 + EffectTimestamp uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorCommissionUpdated is a free log retrieval operation binding the contract event 0x811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba. +// +// Solidity: event OperatorCommissionUpdated(address indexed operator, (address,uint32) indexed operatorSet, uint8 rewardType, uint16 newCommissionBips, uint32 effectTimestamp) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterOperatorCommissionUpdated(opts *bind.FilterOpts, operator []common.Address, operatorSet []IAVSDirectoryOperatorSet) (*RewardsCoordinatorStorageOperatorCommissionUpdatedIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var operatorSetRule []interface{} + for _, operatorSetItem := range operatorSet { + operatorSetRule = append(operatorSetRule, operatorSetItem) + } + + logs, sub, err := _RewardsCoordinatorStorage.contract.FilterLogs(opts, "OperatorCommissionUpdated", operatorRule, operatorSetRule) + if err != nil { + return nil, err + } + return &RewardsCoordinatorStorageOperatorCommissionUpdatedIterator{contract: _RewardsCoordinatorStorage.contract, event: "OperatorCommissionUpdated", logs: logs, sub: sub}, nil +} + +// WatchOperatorCommissionUpdated is a free log subscription operation binding the contract event 0x811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba. +// +// Solidity: event OperatorCommissionUpdated(address indexed operator, (address,uint32) indexed operatorSet, uint8 rewardType, uint16 newCommissionBips, uint32 effectTimestamp) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchOperatorCommissionUpdated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageOperatorCommissionUpdated, operator []common.Address, operatorSet []IAVSDirectoryOperatorSet) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var operatorSetRule []interface{} + for _, operatorSetItem := range operatorSet { + operatorSetRule = append(operatorSetRule, operatorSetItem) + } + + logs, sub, err := _RewardsCoordinatorStorage.contract.WatchLogs(opts, "OperatorCommissionUpdated", operatorRule, operatorSetRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(RewardsCoordinatorStorageOperatorCommissionUpdated) + if err := _RewardsCoordinatorStorage.contract.UnpackLog(event, "OperatorCommissionUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorCommissionUpdated is a log parse operation binding the contract event 0x811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba. +// +// Solidity: event OperatorCommissionUpdated(address indexed operator, (address,uint32) indexed operatorSet, uint8 rewardType, uint16 newCommissionBips, uint32 effectTimestamp) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseOperatorCommissionUpdated(log types.Log) (*RewardsCoordinatorStorageOperatorCommissionUpdated, error) { + event := new(RewardsCoordinatorStorageOperatorCommissionUpdated) + if err := _RewardsCoordinatorStorage.contract.UnpackLog(event, "OperatorCommissionUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // RewardsCoordinatorStorageRewardsClaimedIterator is returned from FilterRewardsClaimed and is used to iterate over the raw logs and unpacked data for RewardsClaimed events raised by the RewardsCoordinatorStorage contract. type RewardsCoordinatorStorageRewardsClaimedIterator struct { Event *RewardsCoordinatorStorageRewardsClaimed // Event containing the contract specifics and raw log diff --git a/pkg/bindings/StrategyBase/binding.go b/pkg/bindings/StrategyBase/binding.go index 60855287e..d28bad825 100644 --- a/pkg/bindings/StrategyBase/binding.go +++ b/pkg/bindings/StrategyBase/binding.go @@ -31,8 +31,8 @@ var ( // StrategyBaseMetaData contains all meta data concerning the StrategyBase contract. var StrategyBaseMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001ab438038062001ab4833981016040819052620000349162000114565b6001600160a01b0381166080526200004b62000052565b5062000146565b600054610100900460ff1615620000bf5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000112576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012757600080fd5b81516001600160a01b03811681146200013f57600080fd5b9392505050565b60805161193d620001776000396000818161019901528181610570015281816109f50152610ac0015261193d6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046115a6565b610310565b005b61014f61015f3660046115c3565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e03660046115dc565b610510565b61014f6101f3366004611608565b610754565b6101c46102063660046115a6565b610869565b61014f61087d565b610232610221366004611650565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046115c3565b610949565b600054610177906201000090046001600160a01b031681565b6101c46102843660046115c3565b610994565b6101c46102973660046115a6565b61099f565b6102a46109ad565b60405161018b919061169d565b6101c46102bf3660046115a6565b6109cd565b61014f6102d23660046116d0565b610a62565b6101c46102e53660046115c3565b610c48565b6101c46102f83660046115c3565b610c81565b61014f61030b3660046115c3565b610c8c565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103879190611711565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061172e565b60405180910390fd5b6103c981610de8565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d9190611778565b6104595760405162461bcd60e51b81526004016103b79061179a565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610eed565b60335460006105f86103e8836117f8565b905060006103e8610607610f6d565b61061191906117f8565b9050600061061f8783611810565b90508061062c8489611827565b6106369190611846565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a686856117f8565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156107305760405162461bcd60e51b815260206004820152603c60248201527f5374726174656779426173652e6465706f7369743a20746f74616c536861726560448201527f73206578636565647320604d41585f544f54414c5f534841524553600000000060648201526084016103b7565b610749826103e860335461074491906117f8565b610fdf565b505050505092915050565b600054610100900460ff16158080156107745750600054600160ff909116105b8061078e5750303b15801561078e575060005460ff166001145b6107f15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610814576000805461ff0019166101001790555b61081e8383611033565b8015610864576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000610877610258836109cd565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156108ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ee9190611778565b61090a5760405162461bcd60e51b81526004016103b79061179a565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e860335461095c91906117f8565b905060006103e861096b610f6d565b61097591906117f8565b9050816109828583611827565b61098c9190611846565b949350505050565b600061087782610c48565b60006108776102f8836109cd565b60606040518060800160405280604d81526020016118bb604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a3e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108779190611868565b6001805460029081161415610ab55760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b2d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610b3884848461117e565b60335480831115610bc75760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610bd56103e8836117f8565b905060006103e8610be4610f6d565b610bee91906117f8565b9050600082610bfd8784611827565b610c079190611846565b9050610c138685611810565b603355610c33610c238284611810565b6103e860335461074491906117f8565b610c3e888883611201565b5050505050505050565b6000806103e8603354610c5b91906117f8565b905060006103e8610c6a610f6d565b610c7491906117f8565b9050806109828386611827565b600061087782610949565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d039190611711565b6001600160a01b0316336001600160a01b031614610d335760405162461bcd60e51b81526004016103b79061172e565b600154198119600154191614610db15760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610e765760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610f695760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190611868565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be88161101384670de0b6b3a7640000611827565b61101d9190611846565b6040519081526020015b60405180910390a15050565b600054610100900460ff1661109e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b0384161790556110c4816000611215565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115d9190611881565b604080516001600160a01b03909316835260ff909116602083015201611027565b6032546001600160a01b038381169116146108645760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6108646001600160a01b0383168483611301565b6000546201000090046001600160a01b031615801561123c57506001600160a01b03821615155b6112be5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610f6982610de8565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526108649286929160009161139191851690849061140e565b80519091501561086457808060200190518101906113af9190611778565b6108645760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b606061141d8484600085611427565b90505b9392505050565b6060824710156114885760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6114df5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b031685876040516114fb919061189e565b60006040518083038185875af1925050503d8060008114611538576040519150601f19603f3d011682016040523d82523d6000602084013e61153d565b606091505b509150915061154d828286611558565b979650505050505050565b60608315611567575081611420565b8251156115775782518084602001fd5b8160405162461bcd60e51b81526004016103b7919061169d565b6001600160a01b03811681146103c957600080fd5b6000602082840312156115b857600080fd5b813561142081611591565b6000602082840312156115d557600080fd5b5035919050565b600080604083850312156115ef57600080fd5b82356115fa81611591565b946020939093013593505050565b6000806040838503121561161b57600080fd5b823561162681611591565b9150602083013561163681611591565b809150509250929050565b60ff811681146103c957600080fd5b60006020828403121561166257600080fd5b813561142081611641565b60005b83811015611688578181015183820152602001611670565b83811115611697576000848401525b50505050565b60208152600082518060208401526116bc81604085016020870161166d565b601f01601f19169190910160400192915050565b6000806000606084860312156116e557600080fd5b83356116f081611591565b9250602084013561170081611591565b929592945050506040919091013590565b60006020828403121561172357600080fd5b815161142081611591565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561178a57600080fd5b8151801515811461142057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561180b5761180b6117e2565b500190565b600082821015611822576118226117e2565b500390565b6000816000190483118215151615611841576118416117e2565b500290565b60008261186357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561187a57600080fd5b5051919050565b60006020828403121561189357600080fd5b815161142081611641565b600082516118b081846020870161166d565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220fdb1cf41dad704373536b605ad5d3c82b532af827f4ae30f7139f31ec1f8ee7064736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122067817aaf67e89a1f5f9fa8a01f03b36b6a04eaf1e7c6fb374e93554b0952ad7f64736f6c634300080c0033", } // StrategyBaseABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyBaseTVLLimits/binding.go b/pkg/bindings/StrategyBaseTVLLimits/binding.go index 063817b1a..2c04bdf21 100644 --- a/pkg/bindings/StrategyBaseTVLLimits/binding.go +++ b/pkg/bindings/StrategyBaseTVLLimits/binding.go @@ -31,8 +31,8 @@ var ( // StrategyBaseTVLLimitsMetaData contains all meta data concerning the StrategyBaseTVLLimits contract. var StrategyBaseTVLLimitsMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001f4d38038062001f4d833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611dd46200017960003960008181610216015281816107a901528181610be70152610cb20152611dd46000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a1366004611983565b6103ba565b005b6101a66101b63660046119cd565b61049d565b6101a66101c93660046119ea565b610550565b6101a66101dc366004611a0c565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b610241610266366004611a25565b610749565b6101a6610279366004611a51565b61098d565b61024161028c3660046119cd565b610a5b565b6101a6610a6f565b6102b86102a7366004611a99565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611a0c565b610b3b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611a0c565b610b86565b6102416103263660046119cd565b610b91565b610333610b9f565b6040516102089190611ae6565b61024161034e3660046119cd565b610bbf565b6101a6610361366004611b19565b610c54565b60645460655460408051928352602083019190915201610208565b61024161038f366004611a0c565b610e3a565b6102416103a2366004611a0c565b610e73565b6101a66103b5366004611a0c565b610e7e565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611b5a565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610fda565b61045083836110e7565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105149190611ba8565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b815260040161041090611bc5565b61054d8161123a565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190611ba8565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b815260040161041090611bc5565b6106018282610fda565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611c0f565b6106925760405162461bcd60e51b815260040161041090611c31565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610820848461133f565b60335460006108316103e883611c8f565b905060006103e8610840611421565b61084a9190611c8f565b905060006108588783611ca7565b9050806108658489611cbe565b61086f9190611cdd565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611c8f565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156109695760405162461bcd60e51b815260206004820152603c60248201527f5374726174656779426173652e6465706f7369743a20746f74616c536861726560448201527f73206578636565647320604d41585f544f54414c5f53484152455360000000006064820152608401610410565b610982826103e860335461097d9190611c8f565b611493565b505050505092915050565b600054610100900460ff16158080156109ad5750600054600160ff909116105b806109c75750303b1580156109c7575060005460ff166001145b6109e35760405162461bcd60e51b815260040161041090611b5a565b6000805460ff191660011790558015610a06576000805461ff0019166101001790555b610a1083836110e7565b8015610a56576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000610a696102e783610bbf565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae09190611c0f565b610afc5760405162461bcd60e51b815260040161041090611c31565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610b4e9190611c8f565b905060006103e8610b5d611421565b610b679190611c8f565b905081610b748583611cbe565b610b7e9190611cdd565b949350505050565b6000610a6982610e3a565b6000610a696103a283610bbf565b60606040518060800160405280604d8152602001611d52604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a699190611cff565b6001805460029081161415610ca75760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d1f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610d2a8484846114df565b60335480831115610db95760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610dc76103e883611c8f565b905060006103e8610dd6611421565b610de09190611c8f565b9050600082610def8784611cbe565b610df99190611cdd565b9050610e058685611ca7565b603355610e25610e158284611ca7565b6103e860335461097d9190611c8f565b610e30888883611562565b5050505050505050565b6000806103e8603354610e4d9190611c8f565b905060006103e8610e5c611421565b610e669190611c8f565b905080610b748386611cbe565b6000610a6982610b3b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef59190611ba8565b6001600160a01b0316336001600160a01b031614610f255760405162461bcd60e51b815260040161041090611bc5565b600154198119600154191614610fa35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a1808211156110dc5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166111525760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b038416179055611178816000611576565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112119190611d18565b604080516001600160a01b03909316835260ff9091166020830152015b60405180910390a15050565b6001600160a01b0381166112c85760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6064548111156113a95760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546113b4611421565b11156114175760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611662565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e9190611cff565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8816114c784670de0b6b3a7640000611cbe565b6114d19190611cdd565b60405190815260200161122e565b6032546001600160a01b03838116911614610a565760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b610a566001600160a01b03831684836116de565b6000546201000090046001600160a01b031615801561159d57506001600160a01b03821615155b61161f5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26106018261123a565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610a569286929160009161176e9185169084906117eb565b805190915015610a56578080602001905181019061178c9190611c0f565b610a565760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b60606117fa8484600085611804565b90505b9392505050565b6060824710156118655760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6118bc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b031685876040516118d89190611d35565b60006040518083038185875af1925050503d8060008114611915576040519150601f19603f3d011682016040523d82523d6000602084013e61191a565b606091505b509150915061192a828286611935565b979650505050505050565b606083156119445750816117fd565b8251156119545782518084602001fd5b8160405162461bcd60e51b81526004016104109190611ae6565b6001600160a01b038116811461054d57600080fd5b6000806000806080858703121561199957600080fd5b843593506020850135925060408501356119b28161196e565b915060608501356119c28161196e565b939692955090935050565b6000602082840312156119df57600080fd5b81356117fd8161196e565b600080604083850312156119fd57600080fd5b50508035926020909101359150565b600060208284031215611a1e57600080fd5b5035919050565b60008060408385031215611a3857600080fd5b8235611a438161196e565b946020939093013593505050565b60008060408385031215611a6457600080fd5b8235611a6f8161196e565b91506020830135611a7f8161196e565b809150509250929050565b60ff8116811461054d57600080fd5b600060208284031215611aab57600080fd5b81356117fd81611a8a565b60005b83811015611ad1578181015183820152602001611ab9565b83811115611ae0576000848401525b50505050565b6020815260008251806020840152611b05816040850160208701611ab6565b601f01601f19169190910160400192915050565b600080600060608486031215611b2e57600080fd5b8335611b398161196e565b92506020840135611b498161196e565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215611bba57600080fd5b81516117fd8161196e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c2157600080fd5b815180151581146117fd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ca257611ca2611c79565b500190565b600082821015611cb957611cb9611c79565b500390565b6000816000190483118215151615611cd857611cd8611c79565b500290565b600082611cfa57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611d1157600080fd5b5051919050565b600060208284031215611d2a57600080fd5b81516117fd81611a8a565b60008251611d47818460208701611ab6565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212207629c6ae7de5baead1b34690cf58d97cbb4740b886269a92273b5fcdf7067a4e64736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220b2454432a91a098d2f8ccb362475b556e7ed812c69079faaf360088c552a38c264736f6c634300080c0033", } // StrategyBaseTVLLimitsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyManager/binding.go b/pkg/bindings/StrategyManager/binding.go index abcb759e0..b99a93949 100644 --- a/pkg/bindings/StrategyManager/binding.go +++ b/pkg/bindings/StrategyManager/binding.go @@ -32,7 +32,11 @@ var ( // StrategyManagerMetaData contains all meta data concerning the StrategyManager contract. var StrategyManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false}]", +<<<<<<< HEAD Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea26469706673582212203e2db651a846bc3ed5aa43529cb263a5d72b401f60f7beca6bee14b366337d9664736f6c634300080c0033", +======= + Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea2646970667358221220dc14c7a334bdf15ef0e4c47d225197940d194d46b487b1caf203e28f6580419564736f6c634300080c0033", +>>>>>>> 500e0254 (feat: operator commission bips (#627)) } // StrategyManagerABI is the input ABI used to generate the binding from. diff --git a/src/contracts/core/RewardsCoordinator.sol b/src/contracts/core/RewardsCoordinator.sol index 562df4cb7..de828b0aa 100644 --- a/src/contracts/core/RewardsCoordinator.sol +++ b/src/contracts/core/RewardsCoordinator.sol @@ -34,6 +34,10 @@ contract RewardsCoordinator is uint256 internal immutable ORIGINAL_CHAIN_ID; /// @notice The maximum rewards token amount for a single rewards submission, constrained by off-chain calculation uint256 internal constant MAX_REWARDS_AMOUNT = 1e38 - 1; + /// @notice The activation delay until an updated operator's commission bips takes effect + uint32 internal constant OPERATOR_COMMISSION_ACTIVATION_DELAY = 7 days; + /// @notice The maximum commission bips that can be set for an operator + uint16 internal constant MAX_COMMISSION_BIPS = 10_000; /// @dev Index for flag that pauses calling createAVSRewardsSubmission uint8 internal constant PAUSED_AVS_REWARDS_SUBMISSION = 0; @@ -131,7 +135,7 @@ contract RewardsCoordinator is onlyWhenNotPaused(PAUSED_AVS_REWARDS_SUBMISSION) nonReentrant { - for (uint256 i = 0; i < rewardsSubmissions.length; i++) { + for (uint256 i = 0; i < rewardsSubmissions.length;) { RewardsSubmission calldata rewardsSubmission = rewardsSubmissions[i]; uint256 nonce = submissionNonce[msg.sender]; bytes32 rewardsSubmissionHash = keccak256(abi.encode(msg.sender, nonce, rewardsSubmission)); @@ -143,6 +147,10 @@ contract RewardsCoordinator is emit AVSRewardsSubmissionCreated(msg.sender, nonce, rewardsSubmissionHash, rewardsSubmission); rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount); + + unchecked { + ++i; + } } } @@ -158,7 +166,7 @@ contract RewardsCoordinator is onlyRewardsForAllSubmitter nonReentrant { - for (uint256 i = 0; i < rewardsSubmissions.length; i++) { + for (uint256 i = 0; i < rewardsSubmissions.length;) { RewardsSubmission calldata rewardsSubmission = rewardsSubmissions[i]; uint256 nonce = submissionNonce[msg.sender]; bytes32 rewardsSubmissionForAllHash = keccak256(abi.encode(msg.sender, nonce, rewardsSubmission)); @@ -170,6 +178,10 @@ contract RewardsCoordinator is emit RewardsSubmissionForAllCreated(msg.sender, nonce, rewardsSubmissionForAllHash, rewardsSubmission); rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount); + + unchecked { + ++i; + } } } @@ -198,7 +210,7 @@ contract RewardsCoordinator is claimer = earner; } require(msg.sender == claimer, "RewardsCoordinator.processClaim: caller is not valid claimer"); - for (uint256 i = 0; i < claim.tokenIndices.length; i++) { + for (uint256 i = 0; i < claim.tokenIndices.length; ++i) { TokenTreeMerkleLeaf calldata tokenLeaf = claim.tokenLeaves[i]; uint256 currCumulativeClaimed = cumulativeClaimed[earner][tokenLeaf.token]; @@ -273,6 +285,42 @@ contract RewardsCoordinator is emit ClaimerForSet(earner, prevClaimer, claimer); } + /** + * @notice Sets the commission an operator takes in bips for a given reward type and operatorSet + * @param operatorSet The operatorSet to update commission for + * @param rewardType The associated rewardType to update commission for + * @param commissionBips The commission in bips for the operator, must be <= MAX_COMMISSION_BIPS + * @return effectTimestamp The timestamp at which the operator commission update will take effect + * + * @dev The commission can range from 1 to 10000 + * @dev The commission update takes effect after 7 days + */ + function setOperatorCommissionBips( + IAVSDirectory.OperatorSet calldata operatorSet, + RewardType rewardType, + uint16 commissionBips + ) external returns (uint32 effectTimestamp) { + require( + commissionBips <= MAX_COMMISSION_BIPS, + "RewardsCoordinator.setOperatorCommissionBips: commissionBips too high" + ); + effectTimestamp = uint32(block.timestamp + OPERATOR_COMMISSION_ACTIVATION_DELAY); + OperatorCommissionUpdate[] storage commissionHistory = + operatorCommissionUpdates[msg.sender][operatorSet.avs][operatorSet.id][rewardType]; + uint256 updateLength = commissionHistory.length; + + // If no updates or latest update is not for current effective timestamp, push a new commission update + // otherwise modify current storage + if (updateLength == 0 || commissionHistory[updateLength - 1].effectTimestamp != effectTimestamp) { + commissionHistory.push( + OperatorCommissionUpdate({commissionBips: commissionBips, effectTimestamp: effectTimestamp}) + ); + } else { + commissionHistory[updateLength - 1].commissionBips = commissionBips; + } + emit OperatorCommissionUpdated(msg.sender, operatorSet, rewardType, commissionBips, effectTimestamp); + } + /** * @notice Sets the delay in timestamp before a posted root can be claimed against * @dev Only callable by the contract owner @@ -506,10 +554,29 @@ contract RewardsCoordinator is return true; } - /// @notice the commission for a specific operator for a specific avs + /// @notice the commission for an operator for a specific operatorSet and reward type /// NOTE: Currently unused and simply returns the globalOperatorCommissionBips value but will be used in future release - function operatorCommissionBips(address operator, address avs) external view returns (uint16) { - return globalOperatorCommissionBips; + function getOperatorCommissionBips( + address operator, + IAVSDirectory.OperatorSet calldata operatorSet, + RewardType rewardType + ) external view returns (uint16) { + // if no value set, default to globalOperatorCommissionBips + uint16 commissionBips = globalOperatorCommissionBips; + OperatorCommissionUpdate[] memory commissionHistory = + operatorCommissionUpdates[operator][operatorSet.avs][operatorSet.id][rewardType]; + + for (uint256 i = commissionHistory.length; i > 0;) { + if (commissionHistory[i - 1].effectTimestamp <= uint32(block.timestamp)) { + commissionBips = commissionHistory[i - 1].commissionBips; + break; + } + + unchecked { + --i; + } + } + return commissionBips; } function getDistributionRootsLength() public view returns (uint256) { @@ -546,6 +613,15 @@ contract RewardsCoordinator is revert("RewardsCoordinator.getRootIndexFromHash: root not found"); } + /// @notice returns the length of the operator commission update history + function getOperatorCommissionUpdateHistoryLength( + address operator, + IAVSDirectory.OperatorSet calldata operatorSet, + RewardType rewardType + ) external view returns (uint256) { + return operatorCommissionUpdates[operator][operatorSet.avs][operatorSet.id][rewardType].length; + } + /** * @notice Getter function for the current EIP-712 domain separator for this contract. * diff --git a/src/contracts/core/RewardsCoordinatorStorage.sol b/src/contracts/core/RewardsCoordinatorStorage.sol index ef918ffba..5e30606fd 100644 --- a/src/contracts/core/RewardsCoordinatorStorage.sol +++ b/src/contracts/core/RewardsCoordinatorStorage.sol @@ -83,6 +83,9 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { mapping(address => mapping(bytes32 => bool)) public isRewardsSubmissionForAllHash; /// @notice Mapping: address => bool to check if the address is permissioned to call createRewardsForAllSubmission mapping(address => bool) public isRewardsForAllSubmitter; + /// @notice Mapping: operator => avs => operatorSetId => OperatorCommissionUpdate history + mapping(address => mapping(address => mapping(uint32 => mapping(RewardType => OperatorCommissionUpdate[])))) public + operatorCommissionUpdates; constructor( IDelegationManager _delegationManager, @@ -115,5 +118,5 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[40] private __gap; + uint256[39] private __gap; } diff --git a/src/contracts/interfaces/IRewardsCoordinator.sol b/src/contracts/interfaces/IRewardsCoordinator.sol index 560bc9084..3f1f0eae2 100644 --- a/src/contracts/interfaces/IRewardsCoordinator.sol +++ b/src/contracts/interfaces/IRewardsCoordinator.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.12; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "./IAVSDirectory.sol"; import "./IStrategy.sol"; /** @@ -15,6 +16,13 @@ import "./IStrategy.sol"; */ interface IRewardsCoordinator { /// STRUCTS /// + + /// @notice Reward type + enum RewardType { + DELEGATED_STAKE, + UNIFORM + } + /** * @notice A linear combination of strategies and multipliers for AVSs to weigh * EigenLayer strategies. @@ -60,6 +68,16 @@ interface IRewardsCoordinator { uint32 duration; } + struct OperatorSetRewardsSubmission { + RewardType rewardType; + uint32 operatorSetId; + StrategyAndMultiplier[] strategiesAndMultipliers; + IERC20 token; + uint256 amount; + uint32 startTimestamp; + uint32 duration; + } + /** * @notice A distribution root is a merkle root of the distribution of earnings for a given period. * The RewardsCoordinator stores all historical distribution roots so that earners can claim their earnings against older roots @@ -127,6 +145,12 @@ interface IRewardsCoordinator { TokenTreeMerkleLeaf[] tokenLeaves; } + /// @notice used for setting operator commission bips per operator set + struct OperatorCommissionUpdate { + uint16 commissionBips; + uint32 effectTimestamp; + } + /// EVENTS /// /// @notice emitted when an AVS creates a valid RewardsSubmission @@ -150,6 +174,14 @@ interface IRewardsCoordinator { ); event ActivationDelaySet(uint32 oldActivationDelay, uint32 newActivationDelay); event GlobalCommissionBipsSet(uint16 oldGlobalCommissionBips, uint16 newGlobalCommissionBips); + /// @notice emitted when an operator commission is set for a specific OperatorSet and RewardType + event OperatorCommissionUpdated( + address indexed operator, + IAVSDirectory.OperatorSet indexed operatorSet, + RewardType rewardType, + uint16 newCommissionBips, + uint32 effectTimestamp + ); event ClaimerForSet(address indexed earner, address indexed oldClaimer, address indexed claimer); /// @notice rootIndex is the specific array index of the newly created root in the storage array event DistributionRootSubmitted( @@ -210,7 +242,11 @@ interface IRewardsCoordinator { /// @notice the commission for a specific operator for a specific avs /// NOTE: Currently unused and simply returns the globalOperatorCommissionBips value but will be used in future release - function operatorCommissionBips(address operator, address avs) external view returns (uint16); + function getOperatorCommissionBips( + address operator, + IAVSDirectory.OperatorSet calldata operatorSet, + RewardType rewardType + ) external view returns (uint16); /// @notice return the hash of the earner's leaf function calculateEarnerLeafHash(EarnerTreeMerkleLeaf calldata leaf) external pure returns (bytes32); @@ -237,6 +273,13 @@ interface IRewardsCoordinator { /// @notice returns the current distributionRoot function getCurrentDistributionRoot() external view returns (DistributionRoot memory); + /// @notice returns the length of the operator commission update history + function getOperatorCommissionUpdateHistoryLength( + address operator, + IAVSDirectory.OperatorSet calldata operatorSet, + RewardType rewardType + ) external view returns (uint256); + /** * * EXTERNAL FUNCTIONS @@ -325,4 +368,20 @@ interface IRewardsCoordinator { * @param _newValue The new value for isRewardsForAllSubmitter */ function setRewardsForAllSubmitter(address _submitter, bool _newValue) external; + + /** + * @notice Sets the commission an operator takes in bips for a given reward type and operatorSet + * @param operatorSet The operatorSet to update commission for + * @param rewardType The associated rewardType to update commission for + * @param commissionBips The commission in bips for the operator, must be <= MAX_COMMISSION_BIPS + * @return effectTimestamp The timestamp at which the operator commission update will take effect + * + * @dev The commission can range from 1 to 10000 + * @dev The commission update takes effect after 7 days + */ + function setOperatorCommissionBips( + IAVSDirectory.OperatorSet calldata operatorSet, + RewardType rewardType, + uint16 commissionBips + ) external returns (uint32); } diff --git a/src/test/events/IRewardsCoordinatorEvents.sol b/src/test/events/IRewardsCoordinatorEvents.sol index fa406d29f..67e427a30 100644 --- a/src/test/events/IRewardsCoordinatorEvents.sol +++ b/src/test/events/IRewardsCoordinatorEvents.sol @@ -29,6 +29,14 @@ interface IRewardsCoordinatorEvents { ); event ActivationDelaySet(uint32 oldActivationDelay, uint32 newActivationDelay); event GlobalCommissionBipsSet(uint16 oldGlobalCommissionBips, uint16 newGlobalCommissionBips); + /// @notice emitted when an operator commission is set for a specific OperatorSet + event OperatorCommissionUpdated( + address indexed operator, + IAVSDirectory.OperatorSet indexed operatorSet, + IRewardsCoordinator.RewardType rewardType, + uint16 newCommissionBips, + uint32 effectTimestamp + ); event ClaimerForSet(address indexed earner, address indexed oldClaimer, address indexed claimer); /// @notice rootIndex is the specific array index of the newly created root in the storage array event DistributionRootSubmitted( @@ -37,6 +45,7 @@ interface IRewardsCoordinatorEvents { uint32 indexed rewardsCalculationEndTimestamp, uint32 activatedAt ); + event DistributionRootDisabled(uint32 indexed rootIndex); /// @notice root is one of the submitted distribution roots that was claimed against event RewardsClaimed( bytes32 root, diff --git a/src/test/unit/RewardsCoordinatorUnit.t.sol b/src/test/unit/RewardsCoordinatorUnit.t.sol index 8cca424ea..7a9f73ef7 100644 --- a/src/test/unit/RewardsCoordinatorUnit.t.sol +++ b/src/test/unit/RewardsCoordinatorUnit.t.sol @@ -57,6 +57,10 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin /// @notice Delay in timestamp before a posted root can be claimed against uint32 activationDelay = 7 days; + /// @notice The activation delay until an updated operator's commission bips takes effect + uint32 OPERATOR_COMMISSION_ACTIVATION_DELAY = 17.5 days; + /// @notice The maximum commission bips that can be set for an operator + uint16 MAX_COMMISSION_BIPS = 10000; /// @notice the commission for all operators across all avss uint16 globalCommissionBips = 1000; @@ -74,7 +78,7 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin uint8 internal constant PAUSED_PROCESS_CLAIM = 2; /// @dev Index for flag that pauses submitRoots - uint8 internal constant PAUSED_SUBMIT_ROOTS = 3; + uint8 internal constant PAUSED_SUBMIT_DISABLE_ROOTS = 3; // RewardsCoordinator entities address rewardsUpdater = address(1000); @@ -1123,7 +1127,7 @@ contract RewardsCoordinatorUnitTests_submitRoot is RewardsCoordinatorUnitTests { function test_Revert_WhenSubmitRootPaused() public { cheats.prank(pauser); - rewardsCoordinator.pause(2 ** PAUSED_SUBMIT_ROOTS); + rewardsCoordinator.pause(2 ** PAUSED_SUBMIT_DISABLE_ROOTS); cheats.expectRevert("Pausable: index is paused"); rewardsCoordinator.submitRoot(bytes32(0), 0); @@ -1739,8 +1743,7 @@ contract RewardsCoordinatorUnitTests_processClaim is RewardsCoordinatorUnitTests /// @notice tests with earnerIndex and tokenIndex set to max value and using alternate claim proofs function testFuzz_processClaim_WhenMaxEarnerIndexAndTokenIndex( bool setClaimerFor, - address claimerFor, - uint8 numShift + address claimerFor ) public filterFuzzedAddressInputs(claimerFor) { // Hardcode earner address to earner in alternate claim proofs earner = 0x25A1B7322f9796B26a4Bec125913b34C292B28D6; @@ -1808,8 +1811,7 @@ contract RewardsCoordinatorUnitTests_processClaim is RewardsCoordinatorUnitTests /// @notice tests with single token leaf for the earner's subtree. tokenTreeProof for the token in the claim should be empty function testFuzz_processClaim_WhenSingleTokenLeaf( bool setClaimerFor, - address claimerFor, - uint8 numShift + address claimerFor ) public filterFuzzedAddressInputs(claimerFor) { // if setClaimerFor is true, set the earners claimer to the fuzzed address address claimer; @@ -1871,8 +1873,7 @@ contract RewardsCoordinatorUnitTests_processClaim is RewardsCoordinatorUnitTests /// @notice tests with single earner leaf in the merkle tree. earnerTreeProof in claim should be empty function testFuzz_processClaim_WhenSingleEarnerLeaf( bool setClaimerFor, - address claimerFor, - uint8 numShift + address claimerFor ) public filterFuzzedAddressInputs(claimerFor) { // Hardcode earner address to earner in alternate claim proofs earner = 0x0D6bA28b9919CfCDb6b233469Cc5Ce30b979e08E; @@ -2041,3 +2042,285 @@ contract RewardsCoordinatorUnitTests_processClaim is RewardsCoordinatorUnitTests return claims; } } + +contract RewardsCoordinatorUnitTests_disableRoot is RewardsCoordinatorUnitTests { + function testFuzz_disableRoot_Revert_WhenNotRewardsUpdater( + address invalidRewardsUpdater + ) public filterFuzzedAddressInputs(invalidRewardsUpdater) { + cheats.prank(invalidRewardsUpdater); + + cheats.expectRevert("RewardsCoordinator: caller is not the rewardsUpdater"); + rewardsCoordinator.disableRoot(0); + } + + function test_disableRoot_Revert_WhenPaused() public { + cheats.prank(pauser); + rewardsCoordinator.pause(2 ** PAUSED_SUBMIT_DISABLE_ROOTS); + + cheats.expectRevert("Pausable: index is paused"); + rewardsCoordinator.disableRoot(0); + } + + function testFuzz_disableRoot_Revert_WhenRootIndexOutOfBounds(uint32 rootIndex) public { + // submitRoots with indexes 0,1,2 + _submitRoots(); + cheats.assume(rootIndex > 2); + + cheats.expectRevert("RewardsCoordinator.disableRoot: invalid rootIndex"); + cheats.prank(rewardsUpdater); + rewardsCoordinator.disableRoot(rootIndex); + } + + function testFuzz_disableRoot_Revert_WhenRootAlreadyDisabled(uint32 rootIndex) public { + // submitRoots with indexes 0,1,2 + _submitRoots(); + rootIndex = uint32(bound(uint256(rootIndex), 0, 2)); + + cheats.startPrank(rewardsUpdater); + rewardsCoordinator.disableRoot(rootIndex); + + cheats.expectRevert("RewardsCoordinator.disableRoot: root already disabled"); + rewardsCoordinator.disableRoot(rootIndex); + cheats.stopPrank(); + } + + function testeFuzz_disableRoot_Revert_WhenRootAlreadyActivated(uint32 rootIndex) public { + // submitRoots with indexes 0,1,2 + _submitRoots(); + rootIndex = uint32(bound(uint256(rootIndex), 0, 2)); + cheats.warp(block.timestamp + activationDelay); + + cheats.expectRevert("RewardsCoordinator.disableRoot: root already activated"); + cheats.prank(rewardsUpdater); + rewardsCoordinator.disableRoot(rootIndex); + } + + function testFuzz_disableRoot(uint32 rootIndex, uint256 randSalt) public { + // Set timestamp to some value in the future + cheats.warp(bound(randSalt, 1e5, 1e6)); + uint256 currTimestamp = block.timestamp; + // submitRoots with indexes 0,1,2 + _submitRoots(); + rootIndex = uint32(bound(uint256(rootIndex), 0, 2)); + + cheats.warp(currTimestamp); + + cheats.expectEmit(true, true, true, true, address(rewardsCoordinator)); + emit DistributionRootDisabled(rootIndex); + cheats.prank(rewardsUpdater); + rewardsCoordinator.disableRoot(rootIndex); + + assertEq( + rewardsCoordinator.getDistributionRootAtIndex(rootIndex).disabled, + true, + "root should be disabled" + ); + } + + function _submitRoots() internal { + cheats.warp(1e6); + + // submitRoots with indexes 0,1,2 + cheats.startPrank(rewardsUpdater); + rewardsCoordinator.submitRoot(bytes32("0"), uint32(block.timestamp - 1)); + + cheats.warp(block.timestamp + 2); + rewardsCoordinator.submitRoot(bytes32("1"), uint32(block.timestamp - 1)); + + cheats.warp(block.timestamp + 2); + rewardsCoordinator.submitRoot(bytes32("2"), uint32(block.timestamp - 1)); + + cheats.stopPrank(); + } +} + +contract RewardsCoordinatorUnitTests_operatorCommission is RewardsCoordinatorUnitTests { + function testFuzz_operatorCommissionBips_EmptyHistory( + address operator, + IAVSDirectory.OperatorSet calldata operatorSet, + uint8 rewardTypeEnum + ) public { + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(uint8(bound(rewardTypeEnum, 0, 1))); + rewardType = IRewardsCoordinator.RewardType(uint8(bound(uint256(rewardType), 0, 1))); + // Check operator commission + uint32 operatorCommissionBipsStored = rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType); + assertEq( + globalCommissionBips, + operatorCommissionBipsStored, + "Incorrect default operator commission bips" + ); + } + + function testFuzz_setOperatorCommissionBips_Reverts_WhenBipsGreaterThanMax( + address operator, + IAVSDirectory.OperatorSet calldata operatorSet, + uint8 rewardTypeEnum, + uint16 newOperatorCommissionBips + ) public filterFuzzedAddressInputs(operator) { + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(uint8(bound(rewardTypeEnum, 0, 1))); + cheats.assume(newOperatorCommissionBips > MAX_COMMISSION_BIPS); + cheats.expectRevert("RewardsCoordinator.setOperatorCommissionBips: commissionBips too high"); + cheats.prank(operator); + rewardsCoordinator.setOperatorCommissionBips(operatorSet, rewardType, newOperatorCommissionBips); + } + + /// @notice test setting operator commission bips to a new value with empty history + function testFuzz_setOperatorCommissionBips_EmptyHistory( + address operator, + IAVSDirectory.OperatorSet calldata operatorSet, + uint8 rewardTypeEnum, + uint16 newOperatorCommissionBips, + uint256 randSalt + ) public filterFuzzedAddressInputs(operator) { + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(uint8(bound(rewardTypeEnum, 0, 1))); + cheats.assume(newOperatorCommissionBips != globalCommissionBips); + cheats.assume(newOperatorCommissionBips <= MAX_COMMISSION_BIPS); + // 1. Set operator commission and check updated value hasn't taken effect yet + uint16 prevOperatorCommissionBips = rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType); + cheats.prank(operator); + uint32 effectTimestamp = rewardsCoordinator.setOperatorCommissionBips( + operatorSet, + rewardType, + newOperatorCommissionBips + ); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == prevOperatorCommissionBips, + "Operator commission bips should not be updated" + ); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) != newOperatorCommissionBips, + "Operator commission bips should not be updated" + ); + + // 2. warp timestamp forwards to random time that is not the effectTimestamp + uint256 warpTimestamp = bound(randSalt, block.timestamp, effectTimestamp - 1); + cheats.warp(warpTimestamp); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) != newOperatorCommissionBips, + "Operator commission bips should still be not updated" + ); + + // 3. warp timestamp forwards to effectTimestamp, operator commission should be updated now + cheats.warp(effectTimestamp); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == newOperatorCommissionBips, + "Operator commission bips should be updated" + ); + } + + /// @notice test setting operator commission bips to a new value with non empty history + function testFuzz_setOperatorCommissionBips_WithHistory( + address operator, + IAVSDirectory.OperatorSet calldata operatorSet, + uint8 rewardTypeEnum, + uint16 newOperatorCommissionBips, + uint256 randSalt + ) public filterFuzzedAddressInputs(operator) { + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(uint8(bound(rewardTypeEnum, 0, 1))); + cheats.assume(newOperatorCommissionBips <= MAX_COMMISSION_BIPS); + + // 1. Set operator commission to initial value with existing history + uint16 prevOperatorCommissionBips = uint16(bound(randSalt, 0, MAX_COMMISSION_BIPS)); + cheats.assume(prevOperatorCommissionBips != newOperatorCommissionBips); + cheats.prank(operator); + uint32 effectTimestamp = rewardsCoordinator.setOperatorCommissionBips( + operatorSet, + rewardType, + prevOperatorCommissionBips + ); + cheats.warp(effectTimestamp); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == prevOperatorCommissionBips, + "1. Operator commission bips should be initialized properly" + ); + assertEq( + rewardsCoordinator.getOperatorCommissionUpdateHistoryLength(operator, operatorSet, rewardType), + 1, + "2. Invalid commission history length" + ); + + // 2. Set operator commission and check updated value hasn't taken effect yet + cheats.prank(operator); + effectTimestamp = rewardsCoordinator.setOperatorCommissionBips( + operatorSet, + rewardType, + newOperatorCommissionBips + ); + assertEq( + rewardsCoordinator.getOperatorCommissionUpdateHistoryLength(operator, operatorSet, rewardType), + 2, + "3. Invalid commission history length" + ); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == prevOperatorCommissionBips, + "4. Operator commission bips should not be updated" + ); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) != newOperatorCommissionBips, + "5. Operator commission bips should not be updated" + ); + + // 3. warp timestamp forwards to random time that is not the effectTimestamp + uint256 warpTimestamp = bound(randSalt, block.timestamp, effectTimestamp - 1); + + cheats.warp(warpTimestamp); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == prevOperatorCommissionBips, + "6. Operator commission bips should still be not updated" + ); + + // 4. warp timestamp forwards to effectTimestamp, operator commission should be updated now + cheats.warp(effectTimestamp); + assertTrue( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType) == newOperatorCommissionBips, + "7.Operator commission bips should be updated" + ); + } + + /// @notice test setting operator commission bips to a new value with pending update + /// has same effectTimestamp. Should overrwrite previous value + function testFuzz_setOperatorCommissionBips_SameBlockUpdate( + address operator, + IAVSDirectory.OperatorSet calldata operatorSet, + uint8 rewardTypeEnum, + uint16 pendingCommissionBips, + uint16 overwriteCommissionBips + ) public filterFuzzedAddressInputs(operator) { + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(uint8(bound(rewardTypeEnum, 0, 1))); + cheats.assume(pendingCommissionBips <= MAX_COMMISSION_BIPS); + cheats.assume(overwriteCommissionBips <= MAX_COMMISSION_BIPS); + cheats.prank(operator); + uint32 effectTimestamp = rewardsCoordinator.setOperatorCommissionBips( + operatorSet, + rewardType, + pendingCommissionBips + ); + assertEq( + rewardsCoordinator.getOperatorCommissionUpdateHistoryLength(operator, operatorSet, rewardType), + 1, + "1. Invalid commission history length" + ); + cheats.prank(operator); + uint32 effectTimestamp2 = rewardsCoordinator.setOperatorCommissionBips( + operatorSet, + rewardType, + overwriteCommissionBips + ); + assertEq( + rewardsCoordinator.getOperatorCommissionUpdateHistoryLength(operator, operatorSet, rewardType), + 1, + "2. Invalid commission history length" + ); + assertEq( + effectTimestamp, + effectTimestamp2, + "3. Effect timestamp should be the same" + ); + cheats.warp(effectTimestamp); + assertEq( + rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType), + overwriteCommissionBips, + "4. Operator commission bips should be updated" + ); + } +} From 4ec0a166554341c4ae3b14e82f117ec78709bea3 Mon Sep 17 00:00:00 2001 From: Michael Sun Date: Tue, 23 Jul 2024 00:14:12 -0400 Subject: [PATCH 24/43] fix: compiling from conflict fix also pushed updated bindings --- pkg/bindings/AVSDirectory/binding.go | 791 ++++++++++++-- pkg/bindings/AVSDirectoryStorage/binding.go | 972 +++++++++++++++--- pkg/bindings/IAVSDirectory/binding.go | 750 +++++++++++++- pkg/bindings/IRewardsCoordinator/binding.go | 6 +- pkg/bindings/RewardsCoordinator/binding.go | 8 +- .../RewardsCoordinatorStorage/binding.go | 6 +- src/contracts/core/RewardsCoordinator.sol | 6 +- 7 files changed, 2262 insertions(+), 277 deletions(-) diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 65c5706da..5f3e701fd 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -29,6 +29,12 @@ var ( _ = abi.ConvertType ) +// IAVSDirectoryOperatorSet is an auto generated low-level Go binding around an user-defined struct. +type IAVSDirectoryOperatorSet struct { + Avs common.Address + OperatorSetId uint32 +} + // ISignatureUtilsSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct. type ISignatureUtilsSignatureWithSaltAndExpiry struct { Signature []byte @@ -38,8 +44,8 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromAVSOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"memberInfo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"inTotalSets\",\"type\":\"uint248\",\"internalType\":\"uint248\"},{\"name\":\"isLegacyOperator\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isLegacyOperator\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b5060405162002b9838038062002b98833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051612a1a6200017e600039600061181c0152600081816104120152818161096501526110c10152612a1a6000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80639926ee7d116100f9578063d79aceab11610097578063f2fde38b11610071578063f2fde38b14610468578063f37c521c1461047b578063f698da25146104da578063fabc1cbc146104e257600080fd5b8063d79aceab146103e6578063df5cf7231461040d578063ec76f4421461043457600080fd5b8063a364f4da116100d3578063a364f4da14610386578063a98fb35514610399578063c1a8e2c5146103ac578063c825fe68146103bf57600080fd5b80639926ee7d1461034d5780639c6c518414610360578063a1060c881461037357600080fd5b8063595c6a6711610166578063715018a611610140578063715018a6146102f6578063886f1195146102fe5780638da5cb5b14610329578063955e66961461033a57600080fd5b8063595c6a67146102c35780635ac86ab7146102cb5780635c975abb146102ee57600080fd5b80631e2199e2116101a25780631e2199e21461020457806320606b7014610217578063374823b5146102515780633c4385d01461028f57600080fd5b806310d67a2f146101c9578063136439dd146101de5780631794bb3c146101f1575b600080fd5b6101dc6101d73660046121b8565b6104f5565b005b6101dc6101ec3660046121dc565b6105b1565b6101dc6101ff3660046121f5565b6106f0565b6101dc61021236600461239e565b61081a565b61023e7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61027f61025f36600461241a565b609860209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610248565b61027f61029d36600461245f565b609a60209081526000938452604080852082529284528284209052825290205460ff1681565b6101dc610d21565b61027f6102d93660046124a6565b606654600160ff9092169190911b9081161490565b60665461023e565b6101dc610de8565b606554610311906001600160a01b031681565b6040516001600160a01b039091168152602001610248565b6033546001600160a01b0316610311565b61023e6103483660046124c9565b610dfc565b6101dc61035b366004612530565b610e61565b6101dc61036e366004612580565b611230565b61023e6103813660046125d5565b611265565b6101dc6103943660046121b8565b6112cf565b6101dc6103a736600461261b565b6113da565b6101dc6103ba366004612580565b611421565b61023e7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61023e7fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6103117f000000000000000000000000000000000000000000000000000000000000000081565b6101dc6104423660046121dc565b33600090815260986020908152604080832093835292905220805460ff19166001179055565b6101dc6104763660046121b8565b611456565b6104bb61048936600461268d565b60996020908152600092835260408084209091529082529020546001600160f81b03811690600160f81b900460ff1682565b604080516001600160f81b039093168352901515602083015201610248565b61023e6114cc565b6101dc6104f03660046121dc565b6114db565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056c91906126c6565b6001600160a01b0316336001600160a01b0316146105a55760405162461bcd60e51b815260040161059c906126e3565b60405180910390fd5b6105ae81611637565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061d919061272d565b6106395760405162461bcd60e51b815260040161059c9061274f565b606654818116146106b25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161059c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b61078d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161059c565b6000805460ff1916600117905580156107b0576000805461ff0019166101001790555b6107ba838361172e565b6107c2611818565b6097556107ce846118e1565b8015610814576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b606654600090600190811614156108435760405162461bcd60e51b815260040161059c90612797565b42826040015110156108bb5760405162461bcd60e51b8152602060048201526047602482015260008051602061298583398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a40161059c565b6001600160a01b038516600090815260986020908152604080832085830151845290915290205460ff16156109465760405162461bcd60e51b815260206004820152603f602482015260008051602061298583398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e7400606482015260840161059c565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa1580156109ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d0919061272d565b610a4f5760405162461bcd60e51b8152602060048201526056602482015260008051602061298583398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a40161059c565b610a6f85610a6833878787602001518860400151610dfc565b8451611933565b6001600160a01b03851660008181526098602090815260408083208683015184528252808320805460ff1916600117905533835260998252808320938352929052208054600160f81b900460ff16610b045780546001600160f81b0316600160f81b1781556040516001815233906001600160a01b038816906000805160206129a58339815191529060200160405180910390a35b60005b84811015610cf657336000908152609a602090815260408083206001600160a01b038b168452909152812090878784818110610b4557610b456127ce565b9050602002016020810190610b5a91906127e4565b63ffffffff16815260208101919091526040016000205460ff1615610bfb5760405162461bcd60e51b8152602060048201526058602482015260008051602061298583398151915260448201527f70657261746f72536574733a206f70657261746f7220616c726561647920726560648201527f676973746572656420746f206f70657261746f72207365740000000000000000608482015260a40161059c565b336000908152609a602090815260408083206001600160a01b038b1684529091528120600191888885818110610c3357610c336127ce565b9050602002016020810190610c4891906127e4565b63ffffffff1681526020810191909152604001600020805460ff19169115159190911790557f0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba3098733888885818110610ca257610ca26127ce565b9050602002016020810190610cb791906127e4565b604080516001600160a01b03948516815293909216602084015263ffffffff169082015260600160405180910390a1610cef81612815565b9050610b07565b5080546001600160f81b031981166001600160f81b0391821695909501169390931790925550505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8d919061272d565b610da95760405162461bcd60e51b815260040161059c9061274f565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610df0611af2565b610dfa60006118e1565b565b6000610e577f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610e3c96959493929190612830565b60405160208183030381529060405280519060200120611b4c565b9695505050505050565b60665460009060019081161415610e8a5760405162461bcd60e51b815260040161059c90612797565b4282604001511015610ef25760405162461bcd60e51b815260206004820152603e60248201526000805160206129c583398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161059c565b3360009081526099602090815260408083206001600160a01b038716845290915290208054600160f81b900460ff1615610f825760405162461bcd60e51b815260206004820152603f60248201526000805160206129c583398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161059c565b80546001600160f81b03161561101e5760405162461bcd60e51b815260206004820152606160248201526000805160206129c583398151915260448201527f56533a206f70657261746f7220736574204156532063616e6e6f74207265676960648201527f73746572206f70657261746f72732077697468206c6567616379206d6574686f6084820152601960fa1b60a482015260c40161059c565b6001600160a01b038416600090815260986020908152604080832086830151845290915290205460ff16156110a25760405162461bcd60e51b815260206004820152603660248201526000805160206129c58339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161059c565b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611108573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112c919061272d565b6111a25760405162461bcd60e51b815260206004820152604d60248201526000805160206129c583398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161059c565b6111c1846111ba863387602001518860400151611265565b8551611933565b6001600160a01b0384166000818152609860209081526040808320878301518452825291829020805460ff1916600190811790915584546001600160f81b0316600160f81b17855591519182523392916000805160206129a5833981519152910160405180910390a350505050565b606654600090600190811614156112595760405162461bcd60e51b815260040161059c90612797565b61081484338585611b93565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290526000906112c69060c001610e3c565b95945050505050565b606654600090600190811614156112f85760405162461bcd60e51b815260040161059c90612797565b3360009081526099602090815260408083206001600160a01b038616845290915290208054600160f81b900460ff166113995760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161059c565b80546001600160f81b031681556040516000815233906001600160a01b038516906000805160206129a58339815191529060200160405180910390a3505050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516114159291906128a0565b60405180910390a25050565b6066546000906001908116141561144a5760405162461bcd60e51b815260040161059c90612797565b61081433858585611b93565b61145e611af2565b6001600160a01b0381166114c35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161059c565b6105ae816118e1565b60006114d6611818565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155291906126c6565b6001600160a01b0316336001600160a01b0316146115825760405162461bcd60e51b815260040161059c906126e3565b6066541981196066541916146116005760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161059c565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106e5565b6001600160a01b0381166116c55760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161059c565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561174f57506001600160a01b03821615155b6117d15760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161059c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261181482611637565b5050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415611849575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b15611a5257604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e9061197390869086906004016128cf565b602060405180830381865afa158015611990573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b4919061292c565b6001600160e01b03191614611a4d5760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161059c565b505050565b826001600160a01b0316611a668383611e2e565b6001600160a01b031614611a4d5760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161059c565b6033546001600160a01b03163314610dfa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161059c565b6000611b56611818565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60005b81811015611d9c576001600160a01b038086166000908152609a60209081526040808320938816835292905290812090848484818110611bd857611bd86127ce565b9050602002016020810190611bed91906127e4565b63ffffffff16815260208101919091526040016000205460ff16611c9f5760405162461bcd60e51b815260206004820152605860248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4f70657261746f725365743a206f70657261746f72206e6f742072656760648201527f6973746572656420666f72206f70657261746f72207365740000000000000000608482015260a40161059c565b6001600160a01b038086166000908152609a60209081526040808320938816835292905290812081858585818110611cd957611cd96127ce565b9050602002016020810190611cee91906127e4565b63ffffffff1681526020810191909152604001600020805460ff19169115159190911790557f9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df828486858585818110611d4857611d486127ce565b9050602002016020810190611d5d91906127e4565b604080516001600160a01b03948516815293909216602084015263ffffffff169082015260600160405180910390a1611d9581612815565b9050611b96565b506001600160a01b03808516600090815260996020908152604080832093871683529290522080546001600160f81b03808216849003166001600160f81b031990911681178255611e275780546001600160f81b03168155604051600081526001600160a01b0386811691908616906000805160206129a58339815191529060200160405180910390a35b5050505050565b6000806000611e3d8585611e52565b91509150611e4a81611ec2565b509392505050565b600080825160411415611e895760208301516040840151606085015160001a611e7d8782858561207d565b94509450505050611ebb565b825160401415611eb35760208301516040840151611ea886838361216a565b935093505050611ebb565b506000905060025b9250929050565b6000816004811115611ed657611ed6612956565b1415611edf5750565b6001816004811115611ef357611ef3612956565b1415611f415760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161059c565b6002816004811115611f5557611f55612956565b1415611fa35760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161059c565b6003816004811115611fb757611fb7612956565b14156120105760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161059c565b600481600481111561202457612024612956565b14156105ae5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161059c565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156120b45750600090506003612161565b8460ff16601b141580156120cc57508460ff16601c14155b156120dd5750600090506004612161565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612131573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661215a57600060019250925050612161565b9150600090505b94509492505050565b6000806001600160ff1b0383168161218760ff86901c601b61296c565b90506121958782888561207d565b935093505050935093915050565b6001600160a01b03811681146105ae57600080fd5b6000602082840312156121ca57600080fd5b81356121d5816121a3565b9392505050565b6000602082840312156121ee57600080fd5b5035919050565b60008060006060848603121561220a57600080fd5b8335612215816121a3565b92506020840135612225816121a3565b929592945050506040919091013590565b60008083601f84011261224857600080fd5b50813567ffffffffffffffff81111561226057600080fd5b6020830191508360208260051b8501011115611ebb57600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156122b4576122b461227b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156122e3576122e361227b565b604052919050565b6000606082840312156122fd57600080fd5b612305612291565b9050813567ffffffffffffffff8082111561231f57600080fd5b818401915084601f83011261233357600080fd5b81356020828211156123475761234761227b565b612359601f8301601f191682016122ba565b9250818352868183860101111561236f57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b600080600080606085870312156123b457600080fd5b84356123bf816121a3565b9350602085013567ffffffffffffffff808211156123dc57600080fd5b6123e888838901612236565b9095509350604087013591508082111561240157600080fd5b5061240e878288016122eb565b91505092959194509250565b6000806040838503121561242d57600080fd5b8235612438816121a3565b946020939093013593505050565b803563ffffffff8116811461245a57600080fd5b919050565b60008060006060848603121561247457600080fd5b833561247f816121a3565b9250602084013561248f816121a3565b915061249d60408501612446565b90509250925092565b6000602082840312156124b857600080fd5b813560ff811681146121d557600080fd5b6000806000806000608086880312156124e157600080fd5b85356124ec816121a3565b9450602086013567ffffffffffffffff81111561250857600080fd5b61251488828901612236565b9699909850959660408101359660609091013595509350505050565b6000806040838503121561254357600080fd5b823561254e816121a3565b9150602083013567ffffffffffffffff81111561256a57600080fd5b612576858286016122eb565b9150509250929050565b60008060006040848603121561259557600080fd5b83356125a0816121a3565b9250602084013567ffffffffffffffff8111156125bc57600080fd5b6125c886828701612236565b9497909650939450505050565b600080600080608085870312156125eb57600080fd5b84356125f6816121a3565b93506020850135612606816121a3565b93969395505050506040820135916060013590565b6000806020838503121561262e57600080fd5b823567ffffffffffffffff8082111561264657600080fd5b818501915085601f83011261265a57600080fd5b81358181111561266957600080fd5b86602082850101111561267b57600080fd5b60209290920196919550909350505050565b600080604083850312156126a057600080fd5b82356126ab816121a3565b915060208301356126bb816121a3565b809150509250929050565b6000602082840312156126d857600080fd5b81516121d5816121a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561273f57600080fd5b815180151581146121d557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156127f657600080fd5b6121d582612446565b634e487b7160e01b600052601160045260246000fd5b6000600019821415612829576128296127ff565b5060010190565b8681526001600160a01b03861660208083019190915260a0604083018190528201859052600090869060c08401835b888110156128885763ffffffff61287585612446565b168252928201929082019060010161285f565b50606085019690965250505060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b82815260006020604081840152835180604085015260005b81811015612903578581018301518582016060015282016128e7565b81811115612915576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561293e57600080fd5b81516001600160e01b0319811681146121d557600080fd5b634e487b7160e01b600052602160045260246000fd5b6000821982111561297f5761297f6127ff565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220abc08f435dccd66e9e342b55c33d48f0b14953f563bc7cf580c802cd03e5343764736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60c06040523480156200001157600080fd5b50604051620037e8380380620037e8833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161366a6200017e6000396000611fdb015260008181610540015281816109bc01526111ea015261366a6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c8063955e669611610125578063c825fe68116100ad578063ec76f4421161007c578063ec76f44214610562578063ef2dfa8d14610596578063f2fde38b146105a9578063f698da25146105bc578063fabc1cbc146105c457600080fd5b8063c825fe68146104c6578063d79aceab146104ed578063dce974b914610514578063df5cf7231461053b57600080fd5b8063a98fb355116100f4578063a98fb35514610472578063aec205c514610485578063afe02ed51461048d578063b2841d48146104a0578063c1a8e2c5146104b357600080fd5b8063955e6696146104265780639926ee7d14610439578063a1060c881461044c578063a364f4da1461045f57600080fd5b806349075da3116101a8578063715018a611610177578063715018a6146103915780637673e93a1461039957806384d76f7b146103bc578063886f1195146103ea5780638da5cb5b1461041557600080fd5b806349075da314610323578063595c6a671461035e5780635ac86ab7146103665780635c975abb1461038957600080fd5b806320606b70116101e457806320606b7014610264578063374823b51461029e5780633c4385d0146102dc5780633fee332d1461031057600080fd5b806310d67a2f14610216578063136439dd1461022b5780631794bb3c1461023e5780631e2199e214610251575b600080fd5b610229610224366004612bfb565b6105d7565b005b610229610239366004612c1f565b610693565b61022961024c366004612c38565b6107d2565b61022961025f366004612ddd565b6108fc565b61028b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6102cc6102ac366004612e58565b609960209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610295565b6102cc6102ea366004612e9d565b609c60209081526000938452604080852082529284528284209052825290205460ff1681565b61022961031e366004612ee4565b610c1c565b610351610331366004612f72565b609860209081526000928352604080842090915290825290205460ff1681565b6040516102959190612fc1565b610229610e66565b6102cc610374366004612fe9565b606654600160ff9092169190911b9081161490565b60665461028b565b610229610f2d565b6102cc6103a7366004612bfb565b609a6020526000908152604090205460ff1681565b6102cc6103ca36600461300c565b609b60209081526000928352604080842090915290825290205460ff1681565b6065546103fd906001600160a01b031681565b6040516001600160a01b039091168152602001610295565b6033546001600160a01b03166103fd565b61028b610434366004613041565b610f41565b6102296104473660046130a7565b610fa6565b61028b61045a3660046130f6565b611374565b61022961046d366004612bfb565b6113de565b61022961048036600461313c565b61151b565b610229611562565b61022961049b3660046131ad565b61162a565b61028b6104ae366004613041565b6117f7565b6102296104c13660046131ee565b611837565b61028b7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61028b7fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b61028b7f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b6103fd7f000000000000000000000000000000000000000000000000000000000000000081565b610229610570366004612c1f565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b6102296105a4366004613242565b61186c565b6102296105b7366004612bfb565b611c15565b61028b611c8b565b6102296105d2366004612c1f565b611c9a565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e91906132ad565b6001600160a01b0316336001600160a01b0316146106875760405162461bcd60e51b815260040161067e906132ca565b60405180910390fd5b61069081611df6565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ff9190613314565b61071b5760405162461bcd60e51b815260040161067e90613336565b606654818116146107945760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161067e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156107f25750600054600160ff909116105b8061080c5750303b15801561080c575060005460ff166001145b61086f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161067e565b6000805460ff191660011790558015610892576000805461ff0019166101001790555b61089c8383611eed565b6108a4611fd7565b6097556108b0846120a0565b80156108f6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b606654600090600190811614156109255760405162461bcd60e51b815260040161067e9061337e565b428260400151101561099d5760405162461bcd60e51b815260206004820152604760248201526000805160206135f583398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a40161067e565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a279190613314565b610aa65760405162461bcd60e51b815260206004820152605660248201526000805160206135f583398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a40161067e565b336000908152609a602052604090205460ff16610b2d5760405162461bcd60e51b815260206004820152604b60248201526000805160206135f583398151915260448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a40161067e565b6001600160a01b038516600090815260996020908152604080832085830151845290915290205460ff1615610bb85760405162461bcd60e51b815260206004820152603f60248201526000805160206135f583398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e7400606482015260840161067e565b610bd885610bd133878787602001518860400151610f41565b84516120f2565b6001600160a01b03851660009081526099602090815260408083208583015184529091529020805460ff19166001179055610c15338686866122ac565b5050505050565b60665460009060019081161415610c455760405162461bcd60e51b815260040161067e9061337e565b815151610cdd57336001600160a01b03871614610cd85760405162461bcd60e51b815260206004820152604560248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2063616c6c6572206d757374206265206f70656064820152643930ba37b960d91b608482015260a40161067e565b610e52565b4282604001511015610d685760405162461bcd60e51b815260206004820152604860248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a206f70657261746f72207369676e617475726560648201526708195e1c1a5c995960c21b608482015260a40161067e565b6001600160a01b038616600090815260996020908152604080832085830151845290915290205460ff1615610e07576040805162461bcd60e51b81526020600482015260248101919091527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2073616c7420616c7265616479207370656e74606482015260840161067e565b610e2086610bd1878787876020015188604001516117f7565b6001600160a01b03861660009081526099602090815260408083208583015184529091529020805460ff191660011790555b610e5e858786866125ab565b505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613314565b610eee5760405162461bcd60e51b815260040161067e90613336565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f356127d0565b610f3f60006120a0565b565b6000610f9c7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610f81969594939291906133f9565b6040516020818303038152906040528051906020012061282a565b9695505050505050565b60665460009060019081161415610fcf5760405162461bcd60e51b815260040161067e9061337e565b42826040015110156110375760405162461bcd60e51b815260206004820152603e602482015260008051602061361583398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161067e565b336000908152609a602052604090205460ff16156110ab5760405162461bcd60e51b815260206004820152603e602482015260008051602061361583398151915260448201527f56533a2041565320697320616e206f70657261746f7220736574204156530000606482015260840161067e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156110e5576110e5612fab565b14156111475760405162461bcd60e51b815260206004820152603f602482015260008051602061361583398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161067e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156111cb5760405162461bcd60e51b815260206004820152603660248201526000805160206136158339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161067e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112559190613314565b6112cb5760405162461bcd60e51b815260206004820152604d602482015260008051602061361583398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161067e565b6112e383610bd1853386602001518760400151611374565b6001600160a01b038316600081815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916113679190612fc1565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290526000906113d59060c001610f81565b95945050505050565b606654600090600190811614156114075760405162461bcd60e51b815260040161067e9061337e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561144157611441612fab565b146114b45760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161067e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161150f9190612fc1565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051611556929190613439565b60405180910390a25050565b336000908152609a602052604090205460ff16156115e85760405162461bcd60e51b815260206004820152603e60248201527f4156534469726563746f72792e6265636f6d654f70657261746f72536574415660448201527f533a20616c726561647920616e206f70657261746f7220736574204156530000606482015260840161067e565b336000818152609a6020526040808220805460ff19166001179055517f702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf9190a2565b60005b818110156117f257336000908152609b602052604081209084848481811061165757611657613468565b905060200201602081019061166c919061347e565b63ffffffff16815260208101919091526040016000205460ff16156116f95760405162461bcd60e51b815260206004820152603b60248201527f4156534469726563746f72792e6372656174654f70657261746f725365743a2060448201527f6f70657261746f722073657420616c7265616479206578697374730000000000606482015260840161067e565b336000908152609b6020526040812060019185858581811061171d5761171d613468565b9050602002016020810190611732919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280336001600160a01b031681526020018585858181106117b0576117b0613468565b90506020020160208101906117c5919061347e565b63ffffffff1690526040516117da9190613499565b60405180910390a16117eb816134d5565b905061162d565b505050565b6000610f9c7f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958787878787604051602001610f81969594939291906133f9565b606654600090600190811614156118605760405162461bcd60e51b815260040161067e9061337e565b6108f6338585856125ab565b606654600090600190811614156118955760405162461bcd60e51b815260040161067e9061337e565b336000908152609a602052604090205460ff1661192e5760405162461bcd60e51b815260206004820152604b60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a40161067e565b60005b84811015610e5e5760013360009081526098602052604081209088888581811061195d5761195d613468565b90506020020160208101906119729190612bfb565b6001600160a01b0316815260208101919091526040016000205460ff1660018111156119a0576119a0612fab565b14611a4c5760405162461bcd60e51b815260206004820152606a60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a206f70657261746f7220616c7265616479206d6960648201527f677261746564206f72206e6f742061206c656761637920726567697374657265608482015269321037b832b930ba37b960b11b60a482015260c40161067e565b611aa033878784818110611a6257611a62613468565b9050602002016020810190611a779190612bfb565b868685818110611a8957611a89613468565b9050602002810190611a9b91906134f0565b6122ac565b33600090815260986020526040812081888885818110611ac257611ac2613468565b9050602002016020810190611ad79190612bfb565b6001600160a01b031681526020810191909152604001600020805460ff191660018381811115611b0957611b09612fab565b021790555033868683818110611b2157611b21613468565b9050602002016020810190611b369190612bfb565b6001600160a01b03167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416000604051611b6f9190612fc1565b60405180910390a333868683818110611b8a57611b8a613468565b9050602002016020810190611b9f9190612bfb565b6001600160a01b03167f54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01868685818110611bdb57611bdb613468565b9050602002810190611bed91906134f0565b604051611bfb929190613539565b60405180910390a380611c0d816134d5565b915050611931565b611c1d6127d0565b6001600160a01b038116611c825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067e565b610690816120a0565b6000611c95611fd7565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1191906132ad565b6001600160a01b0316336001600160a01b031614611d415760405162461bcd60e51b815260040161067e906132ca565b606654198119606654191614611dbf5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161067e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107c7565b6001600160a01b038116611e845760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161067e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316158015611f0e57506001600160a01b03821615155b611f905760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161067e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611fd382611df6565b5050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612008575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561220c57604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906121329086908690600401613555565b602060405180830381865afa15801561214f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217391906135b2565b6001600160e01b031916146117f25760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161067e565b826001600160a01b03166122208383612871565b6001600160a01b0316146117f25760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161067e565b60005b81811015610c15576001600160a01b0385166000908152609b60205260408120908484848181106122e2576122e2613468565b90506020020160208101906122f7919061347e565b63ffffffff16815260208101919091526040016000205460ff1661238e5760405162461bcd60e51b815260206004820152604260248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a20696e76616c6964206f70657261746f722073606482015261195d60f21b608482015260a40161067e565b6001600160a01b038086166000908152609c602090815260408083209388168352929052908120908484848181106123c8576123c8613468565b90506020020160208101906123dd919061347e565b63ffffffff16815260208101919091526040016000205460ff16156124905760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a206f70657261746f7220616c7265616479207260648201527f65676973746572656420746f206f70657261746f722073657400000000000000608482015260a40161067e565b6001600160a01b038086166000908152609c6020908152604080832093881683529290529081206001918585858181106124cc576124cc613468565b90506020020160208101906124e1919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e6040518060400160405280886001600160a01b0316815260200186868681811061256957612569613468565b905060200201602081019061257e919061347e565b63ffffffff1690526040516125939190613499565b60405180910390a26125a4816134d5565b90506122af565b60005b81811015610c15576001600160a01b038086166000908152609c602090815260408083209388168352929052908120908484848181106125f0576125f0613468565b9050602002016020810190612605919061347e565b63ffffffff16815260208101919091526040016000205460ff166126b75760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f646572656769737465724f70657261746f7260448201527f46726f6d4f70657261746f725365743a206f70657261746f72206e6f7420726560648201527f676973746572656420666f72206f70657261746f722073657400000000000000608482015260a40161067e565b6001600160a01b038086166000908152609c602090815260408083209388168352929052908120818585858181106126f1576126f1613468565b9050602002016020810190612706919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe6040518060400160405280886001600160a01b0316815260200186868681811061278e5761278e613468565b90506020020160208101906127a3919061347e565b63ffffffff1690526040516127b89190613499565b60405180910390a26127c9816134d5565b90506125ae565b6033546001600160a01b03163314610f3f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b6000612834611fd7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60008060006128808585612895565b9150915061288d81612905565b509392505050565b6000808251604114156128cc5760208301516040840151606085015160001a6128c087828585612ac0565b945094505050506128fe565b8251604014156128f657602083015160408401516128eb868383612bad565b9350935050506128fe565b506000905060025b9250929050565b600081600481111561291957612919612fab565b14156129225750565b600181600481111561293657612936612fab565b14156129845760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161067e565b600281600481111561299857612998612fab565b14156129e65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161067e565b60038160048111156129fa576129fa612fab565b1415612a535760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161067e565b6004816004811115612a6757612a67612fab565b14156106905760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161067e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612af75750600090506003612ba4565b8460ff16601b14158015612b0f57508460ff16601c14155b15612b205750600090506004612ba4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612b74573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b9d57600060019250925050612ba4565b9150600090505b94509492505050565b6000806001600160ff1b03831681612bca60ff86901c601b6135dc565b9050612bd887828885612ac0565b935093505050935093915050565b6001600160a01b038116811461069057600080fd5b600060208284031215612c0d57600080fd5b8135612c1881612be6565b9392505050565b600060208284031215612c3157600080fd5b5035919050565b600080600060608486031215612c4d57600080fd5b8335612c5881612be6565b92506020840135612c6881612be6565b929592945050506040919091013590565b60008083601f840112612c8b57600080fd5b5081356001600160401b03811115612ca257600080fd5b6020830191508360208260051b85010111156128fe57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612cf557612cf5612cbd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d2357612d23612cbd565b604052919050565b600060608284031215612d3d57600080fd5b612d45612cd3565b905081356001600160401b0380821115612d5e57600080fd5b818401915084601f830112612d7257600080fd5b8135602082821115612d8657612d86612cbd565b612d98601f8301601f19168201612cfb565b92508183528681838601011115612dae57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b60008060008060608587031215612df357600080fd5b8435612dfe81612be6565b935060208501356001600160401b0380821115612e1a57600080fd5b612e2688838901612c79565b90955093506040870135915080821115612e3f57600080fd5b50612e4c87828801612d2b565b91505092959194509250565b60008060408385031215612e6b57600080fd5b8235612e7681612be6565b946020939093013593505050565b803563ffffffff81168114612e9857600080fd5b919050565b600080600060608486031215612eb257600080fd5b8335612ebd81612be6565b92506020840135612ecd81612be6565b9150612edb60408501612e84565b90509250925092565b600080600080600060808688031215612efc57600080fd5b8535612f0781612be6565b94506020860135612f1781612be6565b935060408601356001600160401b0380821115612f3357600080fd5b612f3f89838a01612c79565b90955093506060880135915080821115612f5857600080fd5b50612f6588828901612d2b565b9150509295509295909350565b60008060408385031215612f8557600080fd5b8235612f9081612be6565b91506020830135612fa081612be6565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b6020810160028310612fe357634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215612ffb57600080fd5b813560ff81168114612c1857600080fd5b6000806040838503121561301f57600080fd5b823561302a81612be6565b915061303860208401612e84565b90509250929050565b60008060008060006080868803121561305957600080fd5b853561306481612be6565b945060208601356001600160401b0381111561307f57600080fd5b61308b88828901612c79565b9699909850959660408101359660609091013595509350505050565b600080604083850312156130ba57600080fd5b82356130c581612be6565b915060208301356001600160401b038111156130e057600080fd5b6130ec85828601612d2b565b9150509250929050565b6000806000806080858703121561310c57600080fd5b843561311781612be6565b9350602085013561312781612be6565b93969395505050506040820135916060013590565b6000806020838503121561314f57600080fd5b82356001600160401b038082111561316657600080fd5b818501915085601f83011261317a57600080fd5b81358181111561318957600080fd5b86602082850101111561319b57600080fd5b60209290920196919550909350505050565b600080602083850312156131c057600080fd5b82356001600160401b038111156131d657600080fd5b6131e285828601612c79565b90969095509350505050565b60008060006040848603121561320357600080fd5b833561320e81612be6565b925060208401356001600160401b0381111561322957600080fd5b61323586828701612c79565b9497909650939450505050565b6000806000806040858703121561325857600080fd5b84356001600160401b038082111561326f57600080fd5b61327b88838901612c79565b9096509450602087013591508082111561329457600080fd5b506132a187828801612c79565b95989497509550505050565b6000602082840312156132bf57600080fd5b8151612c1881612be6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561332657600080fd5b81518015158114612c1857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b8183526000602080850194508260005b858110156133ee5763ffffffff6133db83612e84565b16875295820195908201906001016133c5565b509495945050505050565b8681526001600160a01b038616602082015260a06040820181905260009061342490830186886133b5565b60608301949094525060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561349057600080fd5b612c1882612e84565b81516001600160a01b0316815260209182015163ffffffff169181019190915260400190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156134e9576134e96134bf565b5060010190565b6000808335601e1984360301811261350757600080fd5b8301803591506001600160401b0382111561352157600080fd5b6020019150600581901b36038213156128fe57600080fd5b60208152600061354d6020830184866133b5565b949350505050565b82815260006020604081840152835180604085015260005b818110156135895785810183015185820160600152820161356d565b8181111561359b576000606083870101525b50601f01601f191692909201606001949350505050565b6000602082840312156135c457600080fd5b81516001600160e01b031981168114612c1857600080fd5b600082198211156135ef576135ef6134bf565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f4156534469726563746f72792e72656769737465724f70657261746f72546f41a264697066735822122063fbd7f23a7f01883d56cd6404863ff2529ad2cd773cd1eaa3d3a029dab146d364736f6c634300080c0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. @@ -271,6 +277,37 @@ func (_AVSDirectory *AVSDirectoryCallerSession) OPERATORAVSREGISTRATIONTYPEHASH( return _AVSDirectory.Contract.OPERATORAVSREGISTRATIONTYPEHASH(&_AVSDirectory.CallOpts) } +// OPERATORSETFORCEDEREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xdce974b9. +// +// Solidity: function OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectory *AVSDirectoryCaller) OPERATORSETFORCEDEREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _AVSDirectory.contract.Call(opts, &out, "OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// OPERATORSETFORCEDEREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xdce974b9. +// +// Solidity: function OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectory *AVSDirectorySession) OPERATORSETFORCEDEREGISTRATIONTYPEHASH() ([32]byte, error) { + return _AVSDirectory.Contract.OPERATORSETFORCEDEREGISTRATIONTYPEHASH(&_AVSDirectory.CallOpts) +} + +// OPERATORSETFORCEDEREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xdce974b9. +// +// Solidity: function OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectory *AVSDirectoryCallerSession) OPERATORSETFORCEDEREGISTRATIONTYPEHASH() ([32]byte, error) { + return _AVSDirectory.Contract.OPERATORSETFORCEDEREGISTRATIONTYPEHASH(&_AVSDirectory.CallOpts) +} + // OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68. // // Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32) @@ -302,6 +339,37 @@ func (_AVSDirectory *AVSDirectoryCallerSession) OPERATORSETREGISTRATIONTYPEHASH( return _AVSDirectory.Contract.OPERATORSETREGISTRATIONTYPEHASH(&_AVSDirectory.CallOpts) } +// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// +// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) +func (_AVSDirectory *AVSDirectoryCaller) AvsOperatorStatus(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (uint8, error) { + var out []interface{} + err := _AVSDirectory.contract.Call(opts, &out, "avsOperatorStatus", arg0, arg1) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// +// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) +func (_AVSDirectory *AVSDirectorySession) AvsOperatorStatus(arg0 common.Address, arg1 common.Address) (uint8, error) { + return _AVSDirectory.Contract.AvsOperatorStatus(&_AVSDirectory.CallOpts, arg0, arg1) +} + +// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// +// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) +func (_AVSDirectory *AVSDirectoryCallerSession) AvsOperatorStatus(arg0 common.Address, arg1 common.Address) (uint8, error) { + return _AVSDirectory.Contract.AvsOperatorStatus(&_AVSDirectory.CallOpts, arg0, arg1) +} + // CalculateOperatorAVSRegistrationDigestHash is a free data retrieval call binding the contract method 0xa1060c88. // // Solidity: function calculateOperatorAVSRegistrationDigestHash(address operator, address avs, bytes32 salt, uint256 expiry) view returns(bytes32) @@ -333,6 +401,37 @@ func (_AVSDirectory *AVSDirectoryCallerSession) CalculateOperatorAVSRegistration return _AVSDirectory.Contract.CalculateOperatorAVSRegistrationDigestHash(&_AVSDirectory.CallOpts, operator, avs, salt, expiry) } +// CalculateOperatorSetForceDeregistrationTypehash is a free data retrieval call binding the contract method 0xb2841d48. +// +// Solidity: function calculateOperatorSetForceDeregistrationTypehash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectory *AVSDirectoryCaller) CalculateOperatorSetForceDeregistrationTypehash(opts *bind.CallOpts, avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + var out []interface{} + err := _AVSDirectory.contract.Call(opts, &out, "calculateOperatorSetForceDeregistrationTypehash", avs, operatorSetIds, salt, expiry) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// CalculateOperatorSetForceDeregistrationTypehash is a free data retrieval call binding the contract method 0xb2841d48. +// +// Solidity: function calculateOperatorSetForceDeregistrationTypehash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectory *AVSDirectorySession) CalculateOperatorSetForceDeregistrationTypehash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _AVSDirectory.Contract.CalculateOperatorSetForceDeregistrationTypehash(&_AVSDirectory.CallOpts, avs, operatorSetIds, salt, expiry) +} + +// CalculateOperatorSetForceDeregistrationTypehash is a free data retrieval call binding the contract method 0xb2841d48. +// +// Solidity: function calculateOperatorSetForceDeregistrationTypehash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectory *AVSDirectoryCallerSession) CalculateOperatorSetForceDeregistrationTypehash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _AVSDirectory.Contract.CalculateOperatorSetForceDeregistrationTypehash(&_AVSDirectory.CallOpts, avs, operatorSetIds, salt, expiry) +} + // CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. // // Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) @@ -457,49 +556,66 @@ func (_AVSDirectory *AVSDirectoryCallerSession) IsMember(arg0 common.Address, ar return _AVSDirectory.Contract.IsMember(&_AVSDirectory.CallOpts, arg0, arg1, arg2) } -// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. // -// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) -func (_AVSDirectory *AVSDirectoryCaller) MemberInfo(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (struct { - InTotalSets *big.Int - IsLegacyOperator bool -}, error) { +// Solidity: function isOperatorSet(address , uint32 ) view returns(bool) +func (_AVSDirectory *AVSDirectoryCaller) IsOperatorSet(opts *bind.CallOpts, arg0 common.Address, arg1 uint32) (bool, error) { var out []interface{} - err := _AVSDirectory.contract.Call(opts, &out, "memberInfo", arg0, arg1) + err := _AVSDirectory.contract.Call(opts, &out, "isOperatorSet", arg0, arg1) - outstruct := new(struct { - InTotalSets *big.Int - IsLegacyOperator bool - }) if err != nil { - return *outstruct, err + return *new(bool), err } - outstruct.InTotalSets = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - outstruct.IsLegacyOperator = *abi.ConvertType(out[1], new(bool)).(*bool) + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - return *outstruct, err + return out0, err + +} + +// IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. +// +// Solidity: function isOperatorSet(address , uint32 ) view returns(bool) +func (_AVSDirectory *AVSDirectorySession) IsOperatorSet(arg0 common.Address, arg1 uint32) (bool, error) { + return _AVSDirectory.Contract.IsOperatorSet(&_AVSDirectory.CallOpts, arg0, arg1) +} + +// IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. +// +// Solidity: function isOperatorSet(address , uint32 ) view returns(bool) +func (_AVSDirectory *AVSDirectoryCallerSession) IsOperatorSet(arg0 common.Address, arg1 uint32) (bool, error) { + return _AVSDirectory.Contract.IsOperatorSet(&_AVSDirectory.CallOpts, arg0, arg1) +} + +// IsOperatorSetAVS is a free data retrieval call binding the contract method 0x7673e93a. +// +// Solidity: function isOperatorSetAVS(address ) view returns(bool) +func (_AVSDirectory *AVSDirectoryCaller) IsOperatorSetAVS(opts *bind.CallOpts, arg0 common.Address) (bool, error) { + var out []interface{} + err := _AVSDirectory.contract.Call(opts, &out, "isOperatorSetAVS", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err } -// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// IsOperatorSetAVS is a free data retrieval call binding the contract method 0x7673e93a. // -// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) -func (_AVSDirectory *AVSDirectorySession) MemberInfo(arg0 common.Address, arg1 common.Address) (struct { - InTotalSets *big.Int - IsLegacyOperator bool -}, error) { - return _AVSDirectory.Contract.MemberInfo(&_AVSDirectory.CallOpts, arg0, arg1) +// Solidity: function isOperatorSetAVS(address ) view returns(bool) +func (_AVSDirectory *AVSDirectorySession) IsOperatorSetAVS(arg0 common.Address) (bool, error) { + return _AVSDirectory.Contract.IsOperatorSetAVS(&_AVSDirectory.CallOpts, arg0) } -// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// IsOperatorSetAVS is a free data retrieval call binding the contract method 0x7673e93a. // -// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) -func (_AVSDirectory *AVSDirectoryCallerSession) MemberInfo(arg0 common.Address, arg1 common.Address) (struct { - InTotalSets *big.Int - IsLegacyOperator bool -}, error) { - return _AVSDirectory.Contract.MemberInfo(&_AVSDirectory.CallOpts, arg0, arg1) +// Solidity: function isOperatorSetAVS(address ) view returns(bool) +func (_AVSDirectory *AVSDirectoryCallerSession) IsOperatorSetAVS(arg0 common.Address) (bool, error) { + return _AVSDirectory.Contract.IsOperatorSetAVS(&_AVSDirectory.CallOpts, arg0) } // OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5. @@ -657,6 +773,27 @@ func (_AVSDirectory *AVSDirectoryCallerSession) PauserRegistry() (common.Address return _AVSDirectory.Contract.PauserRegistry(&_AVSDirectory.CallOpts) } +// BecomeOperatorSetAVS is a paid mutator transaction binding the contract method 0xaec205c5. +// +// Solidity: function becomeOperatorSetAVS() returns() +func (_AVSDirectory *AVSDirectoryTransactor) BecomeOperatorSetAVS(opts *bind.TransactOpts) (*types.Transaction, error) { + return _AVSDirectory.contract.Transact(opts, "becomeOperatorSetAVS") +} + +// BecomeOperatorSetAVS is a paid mutator transaction binding the contract method 0xaec205c5. +// +// Solidity: function becomeOperatorSetAVS() returns() +func (_AVSDirectory *AVSDirectorySession) BecomeOperatorSetAVS() (*types.Transaction, error) { + return _AVSDirectory.Contract.BecomeOperatorSetAVS(&_AVSDirectory.TransactOpts) +} + +// BecomeOperatorSetAVS is a paid mutator transaction binding the contract method 0xaec205c5. +// +// Solidity: function becomeOperatorSetAVS() returns() +func (_AVSDirectory *AVSDirectoryTransactorSession) BecomeOperatorSetAVS() (*types.Transaction, error) { + return _AVSDirectory.Contract.BecomeOperatorSetAVS(&_AVSDirectory.TransactOpts) +} + // CancelSalt is a paid mutator transaction binding the contract method 0xec76f442. // // Solidity: function cancelSalt(bytes32 salt) returns() @@ -678,25 +815,25 @@ func (_AVSDirectory *AVSDirectoryTransactorSession) CancelSalt(salt [32]byte) (* return _AVSDirectory.Contract.CancelSalt(&_AVSDirectory.TransactOpts, salt) } -// DeregisterFromAVSOperatorSets is a paid mutator transaction binding the contract method 0x9c6c5184. +// CreateOperatorSets is a paid mutator transaction binding the contract method 0xafe02ed5. // -// Solidity: function deregisterFromAVSOperatorSets(address avs, uint32[] operatorSetIds) returns() -func (_AVSDirectory *AVSDirectoryTransactor) DeregisterFromAVSOperatorSets(opts *bind.TransactOpts, avs common.Address, operatorSetIds []uint32) (*types.Transaction, error) { - return _AVSDirectory.contract.Transact(opts, "deregisterFromAVSOperatorSets", avs, operatorSetIds) +// Solidity: function createOperatorSets(uint32[] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectoryTransactor) CreateOperatorSets(opts *bind.TransactOpts, operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectory.contract.Transact(opts, "createOperatorSets", operatorSetIds) } -// DeregisterFromAVSOperatorSets is a paid mutator transaction binding the contract method 0x9c6c5184. +// CreateOperatorSets is a paid mutator transaction binding the contract method 0xafe02ed5. // -// Solidity: function deregisterFromAVSOperatorSets(address avs, uint32[] operatorSetIds) returns() -func (_AVSDirectory *AVSDirectorySession) DeregisterFromAVSOperatorSets(avs common.Address, operatorSetIds []uint32) (*types.Transaction, error) { - return _AVSDirectory.Contract.DeregisterFromAVSOperatorSets(&_AVSDirectory.TransactOpts, avs, operatorSetIds) +// Solidity: function createOperatorSets(uint32[] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectorySession) CreateOperatorSets(operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectory.Contract.CreateOperatorSets(&_AVSDirectory.TransactOpts, operatorSetIds) } -// DeregisterFromAVSOperatorSets is a paid mutator transaction binding the contract method 0x9c6c5184. +// CreateOperatorSets is a paid mutator transaction binding the contract method 0xafe02ed5. // -// Solidity: function deregisterFromAVSOperatorSets(address avs, uint32[] operatorSetIds) returns() -func (_AVSDirectory *AVSDirectoryTransactorSession) DeregisterFromAVSOperatorSets(avs common.Address, operatorSetIds []uint32) (*types.Transaction, error) { - return _AVSDirectory.Contract.DeregisterFromAVSOperatorSets(&_AVSDirectory.TransactOpts, avs, operatorSetIds) +// Solidity: function createOperatorSets(uint32[] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectoryTransactorSession) CreateOperatorSets(operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectory.Contract.CreateOperatorSets(&_AVSDirectory.TransactOpts, operatorSetIds) } // DeregisterOperatorFromAVS is a paid mutator transaction binding the contract method 0xa364f4da. @@ -741,6 +878,27 @@ func (_AVSDirectory *AVSDirectoryTransactorSession) DeregisterOperatorFromOperat return _AVSDirectory.Contract.DeregisterOperatorFromOperatorSets(&_AVSDirectory.TransactOpts, operator, operatorSetIds) } +// ForceDeregisterFromOperatorSets is a paid mutator transaction binding the contract method 0x3fee332d. +// +// Solidity: function forceDeregisterFromOperatorSets(address operator, address avs, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectory *AVSDirectoryTransactor) ForceDeregisterFromOperatorSets(opts *bind.TransactOpts, operator common.Address, avs common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectory.contract.Transact(opts, "forceDeregisterFromOperatorSets", operator, avs, operatorSetIds, operatorSignature) +} + +// ForceDeregisterFromOperatorSets is a paid mutator transaction binding the contract method 0x3fee332d. +// +// Solidity: function forceDeregisterFromOperatorSets(address operator, address avs, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectory *AVSDirectorySession) ForceDeregisterFromOperatorSets(operator common.Address, avs common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectory.Contract.ForceDeregisterFromOperatorSets(&_AVSDirectory.TransactOpts, operator, avs, operatorSetIds, operatorSignature) +} + +// ForceDeregisterFromOperatorSets is a paid mutator transaction binding the contract method 0x3fee332d. +// +// Solidity: function forceDeregisterFromOperatorSets(address operator, address avs, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectory *AVSDirectoryTransactorSession) ForceDeregisterFromOperatorSets(operator common.Address, avs common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectory.Contract.ForceDeregisterFromOperatorSets(&_AVSDirectory.TransactOpts, operator, avs, operatorSetIds, operatorSignature) +} + // Initialize is a paid mutator transaction binding the contract method 0x1794bb3c. // // Solidity: function initialize(address initialOwner, address _pauserRegistry, uint256 initialPausedStatus) returns() @@ -762,6 +920,27 @@ func (_AVSDirectory *AVSDirectoryTransactorSession) Initialize(initialOwner comm return _AVSDirectory.Contract.Initialize(&_AVSDirectory.TransactOpts, initialOwner, _pauserRegistry, initialPausedStatus) } +// MigrateOperatorsToOperatorSets is a paid mutator transaction binding the contract method 0xef2dfa8d. +// +// Solidity: function migrateOperatorsToOperatorSets(address[] operators, uint32[][] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectoryTransactor) MigrateOperatorsToOperatorSets(opts *bind.TransactOpts, operators []common.Address, operatorSetIds [][]uint32) (*types.Transaction, error) { + return _AVSDirectory.contract.Transact(opts, "migrateOperatorsToOperatorSets", operators, operatorSetIds) +} + +// MigrateOperatorsToOperatorSets is a paid mutator transaction binding the contract method 0xef2dfa8d. +// +// Solidity: function migrateOperatorsToOperatorSets(address[] operators, uint32[][] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectorySession) MigrateOperatorsToOperatorSets(operators []common.Address, operatorSetIds [][]uint32) (*types.Transaction, error) { + return _AVSDirectory.Contract.MigrateOperatorsToOperatorSets(&_AVSDirectory.TransactOpts, operators, operatorSetIds) +} + +// MigrateOperatorsToOperatorSets is a paid mutator transaction binding the contract method 0xef2dfa8d. +// +// Solidity: function migrateOperatorsToOperatorSets(address[] operators, uint32[][] operatorSetIds) returns() +func (_AVSDirectory *AVSDirectoryTransactorSession) MigrateOperatorsToOperatorSets(operators []common.Address, operatorSetIds [][]uint32) (*types.Transaction, error) { + return _AVSDirectory.Contract.MigrateOperatorsToOperatorSets(&_AVSDirectory.TransactOpts, operators, operatorSetIds) +} + // Pause is a paid mutator transaction binding the contract method 0x136439dd. // // Solidity: function pause(uint256 newPausedStatus) returns() @@ -1096,6 +1275,150 @@ func (_AVSDirectory *AVSDirectoryFilterer) ParseAVSMetadataURIUpdated(log types. return event, nil } +// AVSDirectoryAVSMigratedToOperatorSetsIterator is returned from FilterAVSMigratedToOperatorSets and is used to iterate over the raw logs and unpacked data for AVSMigratedToOperatorSets events raised by the AVSDirectory contract. +type AVSDirectoryAVSMigratedToOperatorSetsIterator struct { + Event *AVSDirectoryAVSMigratedToOperatorSets // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AVSDirectoryAVSMigratedToOperatorSetsIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryAVSMigratedToOperatorSets) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryAVSMigratedToOperatorSets) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AVSDirectoryAVSMigratedToOperatorSetsIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AVSDirectoryAVSMigratedToOperatorSetsIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AVSDirectoryAVSMigratedToOperatorSets represents a AVSMigratedToOperatorSets event raised by the AVSDirectory contract. +type AVSDirectoryAVSMigratedToOperatorSets struct { + Avs common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAVSMigratedToOperatorSets is a free log retrieval operation binding the contract event 0x702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf. +// +// Solidity: event AVSMigratedToOperatorSets(address indexed avs) +func (_AVSDirectory *AVSDirectoryFilterer) FilterAVSMigratedToOperatorSets(opts *bind.FilterOpts, avs []common.Address) (*AVSDirectoryAVSMigratedToOperatorSetsIterator, error) { + + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + + logs, sub, err := _AVSDirectory.contract.FilterLogs(opts, "AVSMigratedToOperatorSets", avsRule) + if err != nil { + return nil, err + } + return &AVSDirectoryAVSMigratedToOperatorSetsIterator{contract: _AVSDirectory.contract, event: "AVSMigratedToOperatorSets", logs: logs, sub: sub}, nil +} + +// WatchAVSMigratedToOperatorSets is a free log subscription operation binding the contract event 0x702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf. +// +// Solidity: event AVSMigratedToOperatorSets(address indexed avs) +func (_AVSDirectory *AVSDirectoryFilterer) WatchAVSMigratedToOperatorSets(opts *bind.WatchOpts, sink chan<- *AVSDirectoryAVSMigratedToOperatorSets, avs []common.Address) (event.Subscription, error) { + + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + + logs, sub, err := _AVSDirectory.contract.WatchLogs(opts, "AVSMigratedToOperatorSets", avsRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AVSDirectoryAVSMigratedToOperatorSets) + if err := _AVSDirectory.contract.UnpackLog(event, "AVSMigratedToOperatorSets", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAVSMigratedToOperatorSets is a log parse operation binding the contract event 0x702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf. +// +// Solidity: event AVSMigratedToOperatorSets(address indexed avs) +func (_AVSDirectory *AVSDirectoryFilterer) ParseAVSMigratedToOperatorSets(log types.Log) (*AVSDirectoryAVSMigratedToOperatorSets, error) { + event := new(AVSDirectoryAVSMigratedToOperatorSets) + if err := _AVSDirectory.contract.UnpackLog(event, "AVSMigratedToOperatorSets", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // AVSDirectoryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the AVSDirectory contract. type AVSDirectoryInitializedIterator struct { Event *AVSDirectoryInitialized // Event containing the contract specifics and raw log @@ -1299,15 +1622,15 @@ func (it *AVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator) Close() erro // AVSDirectoryOperatorAVSRegistrationStatusUpdated represents a OperatorAVSRegistrationStatusUpdated event raised by the AVSDirectory contract. type AVSDirectoryOperatorAVSRegistrationStatusUpdated struct { - Operator common.Address - Avs common.Address - IsLegacyOperator bool - Raw types.Log // Blockchain specific contextual infos + Operator common.Address + Avs common.Address + Status uint8 + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. +// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorAVSRegistrationStatusUpdated(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*AVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator, error) { var operatorRule []interface{} @@ -1326,9 +1649,9 @@ func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorAVSRegistrationStatusUp return &AVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator{contract: _AVSDirectory.contract, event: "OperatorAVSRegistrationStatusUpdated", logs: logs, sub: sub}, nil } -// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. +// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorAVSRegistrationStatusUpdated(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOperatorAVSRegistrationStatusUpdated, operator []common.Address, avs []common.Address) (event.Subscription, error) { var operatorRule []interface{} @@ -1372,9 +1695,9 @@ func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorAVSRegistrationStatusUpd }), nil } -// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. +// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorAVSRegistrationStatusUpdated(log types.Log) (*AVSDirectoryOperatorAVSRegistrationStatusUpdated, error) { event := new(AVSDirectoryOperatorAVSRegistrationStatusUpdated) if err := _AVSDirectory.contract.UnpackLog(event, "OperatorAVSRegistrationStatusUpdated", log); err != nil { @@ -1453,30 +1776,39 @@ func (it *AVSDirectoryOperatorAddedToOperatorSetIterator) Close() error { // AVSDirectoryOperatorAddedToOperatorSet represents a OperatorAddedToOperatorSet event raised by the AVSDirectory contract. type AVSDirectoryOperatorAddedToOperatorSet struct { - Operator common.Address - Avs common.Address - OperatorSetId uint32 - Raw types.Log // Blockchain specific contextual infos + Operator common.Address + OperatorSet IAVSDirectoryOperatorSet + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e. // -// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts) (*AVSDirectoryOperatorAddedToOperatorSetIterator, error) { +// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*AVSDirectoryOperatorAddedToOperatorSetIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } - logs, sub, err := _AVSDirectory.contract.FilterLogs(opts, "OperatorAddedToOperatorSet") + logs, sub, err := _AVSDirectory.contract.FilterLogs(opts, "OperatorAddedToOperatorSet", operatorRule) if err != nil { return nil, err } return &AVSDirectoryOperatorAddedToOperatorSetIterator{contract: _AVSDirectory.contract, event: "OperatorAddedToOperatorSet", logs: logs, sub: sub}, nil } -// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e. // -// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOperatorAddedToOperatorSet) (event.Subscription, error) { +// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOperatorAddedToOperatorSet, operator []common.Address) (event.Subscription, error) { - logs, sub, err := _AVSDirectory.contract.WatchLogs(opts, "OperatorAddedToOperatorSet") + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _AVSDirectory.contract.WatchLogs(opts, "OperatorAddedToOperatorSet", operatorRule) if err != nil { return nil, err } @@ -1508,9 +1840,9 @@ func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorAddedToOperatorSet(opts }), nil } -// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e. // -// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) +// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet) func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorAddedToOperatorSet(log types.Log) (*AVSDirectoryOperatorAddedToOperatorSet, error) { event := new(AVSDirectoryOperatorAddedToOperatorSet) if err := _AVSDirectory.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { @@ -1520,6 +1852,160 @@ func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorAddedToOperatorSet(log t return event, nil } +// AVSDirectoryOperatorMigratedToOperatorSetsIterator is returned from FilterOperatorMigratedToOperatorSets and is used to iterate over the raw logs and unpacked data for OperatorMigratedToOperatorSets events raised by the AVSDirectory contract. +type AVSDirectoryOperatorMigratedToOperatorSetsIterator struct { + Event *AVSDirectoryOperatorMigratedToOperatorSets // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AVSDirectoryOperatorMigratedToOperatorSetsIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryOperatorMigratedToOperatorSets) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryOperatorMigratedToOperatorSets) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AVSDirectoryOperatorMigratedToOperatorSetsIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AVSDirectoryOperatorMigratedToOperatorSetsIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AVSDirectoryOperatorMigratedToOperatorSets represents a OperatorMigratedToOperatorSets event raised by the AVSDirectory contract. +type AVSDirectoryOperatorMigratedToOperatorSets struct { + Operator common.Address + Avs common.Address + OperatorSetIds []uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorMigratedToOperatorSets is a free log retrieval operation binding the contract event 0x54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01. +// +// Solidity: event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds) +func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorMigratedToOperatorSets(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*AVSDirectoryOperatorMigratedToOperatorSetsIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + + logs, sub, err := _AVSDirectory.contract.FilterLogs(opts, "OperatorMigratedToOperatorSets", operatorRule, avsRule) + if err != nil { + return nil, err + } + return &AVSDirectoryOperatorMigratedToOperatorSetsIterator{contract: _AVSDirectory.contract, event: "OperatorMigratedToOperatorSets", logs: logs, sub: sub}, nil +} + +// WatchOperatorMigratedToOperatorSets is a free log subscription operation binding the contract event 0x54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01. +// +// Solidity: event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds) +func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorMigratedToOperatorSets(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOperatorMigratedToOperatorSets, operator []common.Address, avs []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + + logs, sub, err := _AVSDirectory.contract.WatchLogs(opts, "OperatorMigratedToOperatorSets", operatorRule, avsRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AVSDirectoryOperatorMigratedToOperatorSets) + if err := _AVSDirectory.contract.UnpackLog(event, "OperatorMigratedToOperatorSets", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorMigratedToOperatorSets is a log parse operation binding the contract event 0x54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01. +// +// Solidity: event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds) +func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorMigratedToOperatorSets(log types.Log) (*AVSDirectoryOperatorMigratedToOperatorSets, error) { + event := new(AVSDirectoryOperatorMigratedToOperatorSets) + if err := _AVSDirectory.contract.UnpackLog(event, "OperatorMigratedToOperatorSets", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // AVSDirectoryOperatorRemovedFromOperatorSetIterator is returned from FilterOperatorRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorRemovedFromOperatorSet events raised by the AVSDirectory contract. type AVSDirectoryOperatorRemovedFromOperatorSetIterator struct { Event *AVSDirectoryOperatorRemovedFromOperatorSet // Event containing the contract specifics and raw log @@ -1589,30 +2075,39 @@ func (it *AVSDirectoryOperatorRemovedFromOperatorSetIterator) Close() error { // AVSDirectoryOperatorRemovedFromOperatorSet represents a OperatorRemovedFromOperatorSet event raised by the AVSDirectory contract. type AVSDirectoryOperatorRemovedFromOperatorSet struct { - Operator common.Address - Avs common.Address - OperatorSetId uint32 - Raw types.Log // Blockchain specific contextual infos + Operator common.Address + OperatorSet IAVSDirectoryOperatorSet + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe. // -// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts) (*AVSDirectoryOperatorRemovedFromOperatorSetIterator, error) { +// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*AVSDirectoryOperatorRemovedFromOperatorSetIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } - logs, sub, err := _AVSDirectory.contract.FilterLogs(opts, "OperatorRemovedFromOperatorSet") + logs, sub, err := _AVSDirectory.contract.FilterLogs(opts, "OperatorRemovedFromOperatorSet", operatorRule) if err != nil { return nil, err } return &AVSDirectoryOperatorRemovedFromOperatorSetIterator{contract: _AVSDirectory.contract, event: "OperatorRemovedFromOperatorSet", logs: logs, sub: sub}, nil } -// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe. // -// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOperatorRemovedFromOperatorSet) (event.Subscription, error) { +// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOperatorRemovedFromOperatorSet, operator []common.Address) (event.Subscription, error) { - logs, sub, err := _AVSDirectory.contract.WatchLogs(opts, "OperatorRemovedFromOperatorSet") + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _AVSDirectory.contract.WatchLogs(opts, "OperatorRemovedFromOperatorSet", operatorRule) if err != nil { return nil, err } @@ -1644,9 +2139,9 @@ func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorRemovedFromOperatorSet(o }), nil } -// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe. // -// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet) func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorRemovedFromOperatorSet(log types.Log) (*AVSDirectoryOperatorRemovedFromOperatorSet, error) { event := new(AVSDirectoryOperatorRemovedFromOperatorSet) if err := _AVSDirectory.contract.UnpackLog(event, "OperatorRemovedFromOperatorSet", log); err != nil { @@ -1656,6 +2151,140 @@ func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorRemovedFromOperatorSet(l return event, nil } +// AVSDirectoryOperatorSetCreatedIterator is returned from FilterOperatorSetCreated and is used to iterate over the raw logs and unpacked data for OperatorSetCreated events raised by the AVSDirectory contract. +type AVSDirectoryOperatorSetCreatedIterator struct { + Event *AVSDirectoryOperatorSetCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AVSDirectoryOperatorSetCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryOperatorSetCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryOperatorSetCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AVSDirectoryOperatorSetCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AVSDirectoryOperatorSetCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AVSDirectoryOperatorSetCreated represents a OperatorSetCreated event raised by the AVSDirectory contract. +type AVSDirectoryOperatorSetCreated struct { + OperatorSet IAVSDirectoryOperatorSet + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorSetCreated is a free log retrieval operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c. +// +// Solidity: event OperatorSetCreated((address,uint32) operatorSet) +func (_AVSDirectory *AVSDirectoryFilterer) FilterOperatorSetCreated(opts *bind.FilterOpts) (*AVSDirectoryOperatorSetCreatedIterator, error) { + + logs, sub, err := _AVSDirectory.contract.FilterLogs(opts, "OperatorSetCreated") + if err != nil { + return nil, err + } + return &AVSDirectoryOperatorSetCreatedIterator{contract: _AVSDirectory.contract, event: "OperatorSetCreated", logs: logs, sub: sub}, nil +} + +// WatchOperatorSetCreated is a free log subscription operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c. +// +// Solidity: event OperatorSetCreated((address,uint32) operatorSet) +func (_AVSDirectory *AVSDirectoryFilterer) WatchOperatorSetCreated(opts *bind.WatchOpts, sink chan<- *AVSDirectoryOperatorSetCreated) (event.Subscription, error) { + + logs, sub, err := _AVSDirectory.contract.WatchLogs(opts, "OperatorSetCreated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AVSDirectoryOperatorSetCreated) + if err := _AVSDirectory.contract.UnpackLog(event, "OperatorSetCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorSetCreated is a log parse operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c. +// +// Solidity: event OperatorSetCreated((address,uint32) operatorSet) +func (_AVSDirectory *AVSDirectoryFilterer) ParseOperatorSetCreated(log types.Log) (*AVSDirectoryOperatorSetCreated, error) { + event := new(AVSDirectoryOperatorSetCreated) + if err := _AVSDirectory.contract.UnpackLog(event, "OperatorSetCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // AVSDirectoryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the AVSDirectory contract. type AVSDirectoryOwnershipTransferredIterator struct { Event *AVSDirectoryOwnershipTransferred // Event containing the contract specifics and raw log diff --git a/pkg/bindings/AVSDirectoryStorage/binding.go b/pkg/bindings/AVSDirectoryStorage/binding.go index 94ad040a7..8fd8324c3 100644 --- a/pkg/bindings/AVSDirectoryStorage/binding.go +++ b/pkg/bindings/AVSDirectoryStorage/binding.go @@ -29,6 +29,12 @@ var ( _ = abi.ConvertType ) +// IAVSDirectoryOperatorSet is an auto generated low-level Go binding around an user-defined struct. +type IAVSDirectoryOperatorSet struct { + Avs common.Address + OperatorSetId uint32 +} + // ISignatureUtilsSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct. type ISignatureUtilsSignatureWithSaltAndExpiry struct { Signature []byte @@ -38,7 +44,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryStorageMetaData contains all meta data concerning the AVSDirectoryStorage contract. var AVSDirectoryStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"memberInfo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"inTotalSets\",\"type\":\"uint248\",\"internalType\":\"uint248\"},{\"name\":\"isLegacyOperator\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isLegacyOperator\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", } // AVSDirectoryStorageABI is the input ABI used to generate the binding from. @@ -249,6 +255,37 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) OPERATORAVSREGISTR return _AVSDirectoryStorage.Contract.OPERATORAVSREGISTRATIONTYPEHASH(&_AVSDirectoryStorage.CallOpts) } +// OPERATORSETFORCEDEREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xdce974b9. +// +// Solidity: function OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) OPERATORSETFORCEDEREGISTRATIONTYPEHASH(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _AVSDirectoryStorage.contract.Call(opts, &out, "OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// OPERATORSETFORCEDEREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xdce974b9. +// +// Solidity: function OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) OPERATORSETFORCEDEREGISTRATIONTYPEHASH() ([32]byte, error) { + return _AVSDirectoryStorage.Contract.OPERATORSETFORCEDEREGISTRATIONTYPEHASH(&_AVSDirectoryStorage.CallOpts) +} + +// OPERATORSETFORCEDEREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xdce974b9. +// +// Solidity: function OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH() view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) OPERATORSETFORCEDEREGISTRATIONTYPEHASH() ([32]byte, error) { + return _AVSDirectoryStorage.Contract.OPERATORSETFORCEDEREGISTRATIONTYPEHASH(&_AVSDirectoryStorage.CallOpts) +} + // OPERATORSETREGISTRATIONTYPEHASH is a free data retrieval call binding the contract method 0xc825fe68. // // Solidity: function OPERATOR_SET_REGISTRATION_TYPEHASH() view returns(bytes32) @@ -280,6 +317,37 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) OPERATORSETREGISTR return _AVSDirectoryStorage.Contract.OPERATORSETREGISTRATIONTYPEHASH(&_AVSDirectoryStorage.CallOpts) } +// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// +// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) AvsOperatorStatus(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (uint8, error) { + var out []interface{} + err := _AVSDirectoryStorage.contract.Call(opts, &out, "avsOperatorStatus", arg0, arg1) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// +// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) AvsOperatorStatus(arg0 common.Address, arg1 common.Address) (uint8, error) { + return _AVSDirectoryStorage.Contract.AvsOperatorStatus(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +} + +// AvsOperatorStatus is a free data retrieval call binding the contract method 0x49075da3. +// +// Solidity: function avsOperatorStatus(address , address ) view returns(uint8) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) AvsOperatorStatus(arg0 common.Address, arg1 common.Address) (uint8, error) { + return _AVSDirectoryStorage.Contract.AvsOperatorStatus(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +} + // CalculateOperatorAVSRegistrationDigestHash is a free data retrieval call binding the contract method 0xa1060c88. // // Solidity: function calculateOperatorAVSRegistrationDigestHash(address operator, address avs, bytes32 salt, uint256 expiry) view returns(bytes32) @@ -311,6 +379,37 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) CalculateOperatorA return _AVSDirectoryStorage.Contract.CalculateOperatorAVSRegistrationDigestHash(&_AVSDirectoryStorage.CallOpts, operator, avs, salt, expiry) } +// CalculateOperatorSetForceDeregistrationTypehash is a free data retrieval call binding the contract method 0xb2841d48. +// +// Solidity: function calculateOperatorSetForceDeregistrationTypehash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) CalculateOperatorSetForceDeregistrationTypehash(opts *bind.CallOpts, avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + var out []interface{} + err := _AVSDirectoryStorage.contract.Call(opts, &out, "calculateOperatorSetForceDeregistrationTypehash", avs, operatorSetIds, salt, expiry) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// CalculateOperatorSetForceDeregistrationTypehash is a free data retrieval call binding the contract method 0xb2841d48. +// +// Solidity: function calculateOperatorSetForceDeregistrationTypehash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) CalculateOperatorSetForceDeregistrationTypehash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _AVSDirectoryStorage.Contract.CalculateOperatorSetForceDeregistrationTypehash(&_AVSDirectoryStorage.CallOpts, avs, operatorSetIds, salt, expiry) +} + +// CalculateOperatorSetForceDeregistrationTypehash is a free data retrieval call binding the contract method 0xb2841d48. +// +// Solidity: function calculateOperatorSetForceDeregistrationTypehash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) CalculateOperatorSetForceDeregistrationTypehash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _AVSDirectoryStorage.Contract.CalculateOperatorSetForceDeregistrationTypehash(&_AVSDirectoryStorage.CallOpts, avs, operatorSetIds, salt, expiry) +} + // CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. // // Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) @@ -373,6 +472,37 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) Delegation() (comm return _AVSDirectoryStorage.Contract.Delegation(&_AVSDirectoryStorage.CallOpts) } +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _AVSDirectoryStorage.contract.Call(opts, &out, "domainSeparator") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) DomainSeparator() ([32]byte, error) { + return _AVSDirectoryStorage.Contract.DomainSeparator(&_AVSDirectoryStorage.CallOpts) +} + +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) DomainSeparator() ([32]byte, error) { + return _AVSDirectoryStorage.Contract.DomainSeparator(&_AVSDirectoryStorage.CallOpts) +} + // IsMember is a free data retrieval call binding the contract method 0x3c4385d0. // // Solidity: function isMember(address , address , uint32 ) view returns(bool) @@ -404,49 +534,66 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) IsMember(arg0 comm return _AVSDirectoryStorage.Contract.IsMember(&_AVSDirectoryStorage.CallOpts, arg0, arg1, arg2) } -// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. +// +// Solidity: function isOperatorSet(address , uint32 ) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) IsOperatorSet(opts *bind.CallOpts, arg0 common.Address, arg1 uint32) (bool, error) { + var out []interface{} + err := _AVSDirectoryStorage.contract.Call(opts, &out, "isOperatorSet", arg0, arg1) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. +// +// Solidity: function isOperatorSet(address , uint32 ) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) IsOperatorSet(arg0 common.Address, arg1 uint32) (bool, error) { + return _AVSDirectoryStorage.Contract.IsOperatorSet(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +} + +// IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. +// +// Solidity: function isOperatorSet(address , uint32 ) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) IsOperatorSet(arg0 common.Address, arg1 uint32) (bool, error) { + return _AVSDirectoryStorage.Contract.IsOperatorSet(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +} + +// IsOperatorSetAVS is a free data retrieval call binding the contract method 0x7673e93a. // -// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) -func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) MemberInfo(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (struct { - InTotalSets *big.Int - IsLegacyOperator bool -}, error) { +// Solidity: function isOperatorSetAVS(address ) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) IsOperatorSetAVS(opts *bind.CallOpts, arg0 common.Address) (bool, error) { var out []interface{} - err := _AVSDirectoryStorage.contract.Call(opts, &out, "memberInfo", arg0, arg1) + err := _AVSDirectoryStorage.contract.Call(opts, &out, "isOperatorSetAVS", arg0) - outstruct := new(struct { - InTotalSets *big.Int - IsLegacyOperator bool - }) if err != nil { - return *outstruct, err + return *new(bool), err } - outstruct.InTotalSets = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - outstruct.IsLegacyOperator = *abi.ConvertType(out[1], new(bool)).(*bool) + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - return *outstruct, err + return out0, err } -// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// IsOperatorSetAVS is a free data retrieval call binding the contract method 0x7673e93a. // -// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) -func (_AVSDirectoryStorage *AVSDirectoryStorageSession) MemberInfo(arg0 common.Address, arg1 common.Address) (struct { - InTotalSets *big.Int - IsLegacyOperator bool -}, error) { - return _AVSDirectoryStorage.Contract.MemberInfo(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +// Solidity: function isOperatorSetAVS(address ) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) IsOperatorSetAVS(arg0 common.Address) (bool, error) { + return _AVSDirectoryStorage.Contract.IsOperatorSetAVS(&_AVSDirectoryStorage.CallOpts, arg0) } -// MemberInfo is a free data retrieval call binding the contract method 0xf37c521c. +// IsOperatorSetAVS is a free data retrieval call binding the contract method 0x7673e93a. // -// Solidity: function memberInfo(address , address ) view returns(uint248 inTotalSets, bool isLegacyOperator) -func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) MemberInfo(arg0 common.Address, arg1 common.Address) (struct { - InTotalSets *big.Int - IsLegacyOperator bool -}, error) { - return _AVSDirectoryStorage.Contract.MemberInfo(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +// Solidity: function isOperatorSetAVS(address ) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) IsOperatorSetAVS(arg0 common.Address) (bool, error) { + return _AVSDirectoryStorage.Contract.IsOperatorSetAVS(&_AVSDirectoryStorage.CallOpts, arg0) } // OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5. @@ -480,6 +627,69 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) OperatorSaltIsSpen return _AVSDirectoryStorage.Contract.OperatorSaltIsSpent(&_AVSDirectoryStorage.CallOpts, arg0, arg1) } +// BecomeOperatorSetAVS is a paid mutator transaction binding the contract method 0xaec205c5. +// +// Solidity: function becomeOperatorSetAVS() returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) BecomeOperatorSetAVS(opts *bind.TransactOpts) (*types.Transaction, error) { + return _AVSDirectoryStorage.contract.Transact(opts, "becomeOperatorSetAVS") +} + +// BecomeOperatorSetAVS is a paid mutator transaction binding the contract method 0xaec205c5. +// +// Solidity: function becomeOperatorSetAVS() returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) BecomeOperatorSetAVS() (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.BecomeOperatorSetAVS(&_AVSDirectoryStorage.TransactOpts) +} + +// BecomeOperatorSetAVS is a paid mutator transaction binding the contract method 0xaec205c5. +// +// Solidity: function becomeOperatorSetAVS() returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) BecomeOperatorSetAVS() (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.BecomeOperatorSetAVS(&_AVSDirectoryStorage.TransactOpts) +} + +// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442. +// +// Solidity: function cancelSalt(bytes32 salt) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) CancelSalt(opts *bind.TransactOpts, salt [32]byte) (*types.Transaction, error) { + return _AVSDirectoryStorage.contract.Transact(opts, "cancelSalt", salt) +} + +// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442. +// +// Solidity: function cancelSalt(bytes32 salt) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) CancelSalt(salt [32]byte) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.CancelSalt(&_AVSDirectoryStorage.TransactOpts, salt) +} + +// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442. +// +// Solidity: function cancelSalt(bytes32 salt) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) CancelSalt(salt [32]byte) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.CancelSalt(&_AVSDirectoryStorage.TransactOpts, salt) +} + +// CreateOperatorSets is a paid mutator transaction binding the contract method 0xafe02ed5. +// +// Solidity: function createOperatorSets(uint32[] operatorSetIds) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) CreateOperatorSets(opts *bind.TransactOpts, operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectoryStorage.contract.Transact(opts, "createOperatorSets", operatorSetIds) +} + +// CreateOperatorSets is a paid mutator transaction binding the contract method 0xafe02ed5. +// +// Solidity: function createOperatorSets(uint32[] operatorSetIds) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) CreateOperatorSets(operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.CreateOperatorSets(&_AVSDirectoryStorage.TransactOpts, operatorSetIds) +} + +// CreateOperatorSets is a paid mutator transaction binding the contract method 0xafe02ed5. +// +// Solidity: function createOperatorSets(uint32[] operatorSetIds) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) CreateOperatorSets(operatorSetIds []uint32) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.CreateOperatorSets(&_AVSDirectoryStorage.TransactOpts, operatorSetIds) +} + // DeregisterOperatorFromAVS is a paid mutator transaction binding the contract method 0xa364f4da. // // Solidity: function deregisterOperatorFromAVS(address operator) returns() @@ -522,6 +732,48 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) DeregisterOper return _AVSDirectoryStorage.Contract.DeregisterOperatorFromOperatorSets(&_AVSDirectoryStorage.TransactOpts, operator, operatorSetIds) } +// ForceDeregisterFromOperatorSets is a paid mutator transaction binding the contract method 0x3fee332d. +// +// Solidity: function forceDeregisterFromOperatorSets(address operator, address avs, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) ForceDeregisterFromOperatorSets(opts *bind.TransactOpts, operator common.Address, avs common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectoryStorage.contract.Transact(opts, "forceDeregisterFromOperatorSets", operator, avs, operatorSetIds, operatorSignature) +} + +// ForceDeregisterFromOperatorSets is a paid mutator transaction binding the contract method 0x3fee332d. +// +// Solidity: function forceDeregisterFromOperatorSets(address operator, address avs, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) ForceDeregisterFromOperatorSets(operator common.Address, avs common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.ForceDeregisterFromOperatorSets(&_AVSDirectoryStorage.TransactOpts, operator, avs, operatorSetIds, operatorSignature) +} + +// ForceDeregisterFromOperatorSets is a paid mutator transaction binding the contract method 0x3fee332d. +// +// Solidity: function forceDeregisterFromOperatorSets(address operator, address avs, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) ForceDeregisterFromOperatorSets(operator common.Address, avs common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.ForceDeregisterFromOperatorSets(&_AVSDirectoryStorage.TransactOpts, operator, avs, operatorSetIds, operatorSignature) +} + +// MigrateOperatorsToOperatorSets is a paid mutator transaction binding the contract method 0xef2dfa8d. +// +// Solidity: function migrateOperatorsToOperatorSets(address[] operators, uint32[][] operatorSetIds) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) MigrateOperatorsToOperatorSets(opts *bind.TransactOpts, operators []common.Address, operatorSetIds [][]uint32) (*types.Transaction, error) { + return _AVSDirectoryStorage.contract.Transact(opts, "migrateOperatorsToOperatorSets", operators, operatorSetIds) +} + +// MigrateOperatorsToOperatorSets is a paid mutator transaction binding the contract method 0xef2dfa8d. +// +// Solidity: function migrateOperatorsToOperatorSets(address[] operators, uint32[][] operatorSetIds) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) MigrateOperatorsToOperatorSets(operators []common.Address, operatorSetIds [][]uint32) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.MigrateOperatorsToOperatorSets(&_AVSDirectoryStorage.TransactOpts, operators, operatorSetIds) +} + +// MigrateOperatorsToOperatorSets is a paid mutator transaction binding the contract method 0xef2dfa8d. +// +// Solidity: function migrateOperatorsToOperatorSets(address[] operators, uint32[][] operatorSetIds) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) MigrateOperatorsToOperatorSets(operators []common.Address, operatorSetIds [][]uint32) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.MigrateOperatorsToOperatorSets(&_AVSDirectoryStorage.TransactOpts, operators, operatorSetIds) +} + // RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d. // // Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns() @@ -545,23 +797,23 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) RegisterOperat // RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. // -// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() -func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) RegisterOperatorToOperatorSets(opts *bind.TransactOpts, operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { - return _AVSDirectoryStorage.contract.Transact(opts, "registerOperatorToOperatorSets", operator, operatorSetIds, signature) +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactor) RegisterOperatorToOperatorSets(opts *bind.TransactOpts, operator common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectoryStorage.contract.Transact(opts, "registerOperatorToOperatorSets", operator, operatorSetIds, operatorSignature) } // RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. // -// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() -func (_AVSDirectoryStorage *AVSDirectoryStorageSession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { - return _AVSDirectoryStorage.Contract.RegisterOperatorToOperatorSets(&_AVSDirectoryStorage.TransactOpts, operator, operatorSetIds, signature) +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.RegisterOperatorToOperatorSets(&_AVSDirectoryStorage.TransactOpts, operator, operatorSetIds, operatorSignature) } // RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. // -// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() -func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { - return _AVSDirectoryStorage.Contract.RegisterOperatorToOperatorSets(&_AVSDirectoryStorage.TransactOpts, operator, operatorSetIds, signature) +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_AVSDirectoryStorage *AVSDirectoryStorageTransactorSession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _AVSDirectoryStorage.Contract.RegisterOperatorToOperatorSets(&_AVSDirectoryStorage.TransactOpts, operator, operatorSetIds, operatorSignature) } // UpdateAVSMetadataURI is a paid mutator transaction binding the contract method 0xa98fb355. @@ -730,9 +982,9 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseAVSMetadataURIUpda return event, nil } -// AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator is returned from FilterOperatorAVSRegistrationStatusUpdated and is used to iterate over the raw logs and unpacked data for OperatorAVSRegistrationStatusUpdated events raised by the AVSDirectoryStorage contract. -type AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator struct { - Event *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated // Event containing the contract specifics and raw log +// AVSDirectoryStorageAVSMigratedToOperatorSetsIterator is returned from FilterAVSMigratedToOperatorSets and is used to iterate over the raw logs and unpacked data for AVSMigratedToOperatorSets events raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageAVSMigratedToOperatorSetsIterator struct { + Event *AVSDirectoryStorageAVSMigratedToOperatorSets // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -746,7 +998,7 @@ type AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator) Next() bool { +func (it *AVSDirectoryStorageAVSMigratedToOperatorSetsIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -755,7 +1007,7 @@ func (it *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator) Next( if it.done { select { case log := <-it.logs: - it.Event = new(AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated) + it.Event = new(AVSDirectoryStorageAVSMigratedToOperatorSets) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -770,7 +1022,7 @@ func (it *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator) Next( // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated) + it.Event = new(AVSDirectoryStorageAVSMigratedToOperatorSets) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -786,61 +1038,51 @@ func (it *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator) Next( } // Error returns any retrieval or parsing error occurred during filtering. -func (it *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator) Error() error { +func (it *AVSDirectoryStorageAVSMigratedToOperatorSetsIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator) Close() error { +func (it *AVSDirectoryStorageAVSMigratedToOperatorSetsIterator) Close() error { it.sub.Unsubscribe() return nil } -// AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated represents a OperatorAVSRegistrationStatusUpdated event raised by the AVSDirectoryStorage contract. -type AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated struct { - Operator common.Address - Avs common.Address - IsLegacyOperator bool - Raw types.Log // Blockchain specific contextual infos +// AVSDirectoryStorageAVSMigratedToOperatorSets represents a AVSMigratedToOperatorSets event raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageAVSMigratedToOperatorSets struct { + Avs common.Address + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. +// FilterAVSMigratedToOperatorSets is a free log retrieval operation binding the contract event 0x702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) -func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorAVSRegistrationStatusUpdated(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator, error) { +// Solidity: event AVSMigratedToOperatorSets(address indexed avs) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterAVSMigratedToOperatorSets(opts *bind.FilterOpts, avs []common.Address) (*AVSDirectoryStorageAVSMigratedToOperatorSetsIterator, error) { - var operatorRule []interface{} - for _, operatorItem := range operator { - operatorRule = append(operatorRule, operatorItem) - } var avsRule []interface{} for _, avsItem := range avs { avsRule = append(avsRule, avsItem) } - logs, sub, err := _AVSDirectoryStorage.contract.FilterLogs(opts, "OperatorAVSRegistrationStatusUpdated", operatorRule, avsRule) + logs, sub, err := _AVSDirectoryStorage.contract.FilterLogs(opts, "AVSMigratedToOperatorSets", avsRule) if err != nil { return nil, err } - return &AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator{contract: _AVSDirectoryStorage.contract, event: "OperatorAVSRegistrationStatusUpdated", logs: logs, sub: sub}, nil + return &AVSDirectoryStorageAVSMigratedToOperatorSetsIterator{contract: _AVSDirectoryStorage.contract, event: "AVSMigratedToOperatorSets", logs: logs, sub: sub}, nil } -// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. +// WatchAVSMigratedToOperatorSets is a free log subscription operation binding the contract event 0x702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) -func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAVSRegistrationStatusUpdated(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated, operator []common.Address, avs []common.Address) (event.Subscription, error) { +// Solidity: event AVSMigratedToOperatorSets(address indexed avs) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchAVSMigratedToOperatorSets(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageAVSMigratedToOperatorSets, avs []common.Address) (event.Subscription, error) { - var operatorRule []interface{} - for _, operatorItem := range operator { - operatorRule = append(operatorRule, operatorItem) - } var avsRule []interface{} for _, avsItem := range avs { avsRule = append(avsRule, avsItem) } - logs, sub, err := _AVSDirectoryStorage.contract.WatchLogs(opts, "OperatorAVSRegistrationStatusUpdated", operatorRule, avsRule) + logs, sub, err := _AVSDirectoryStorage.contract.WatchLogs(opts, "AVSMigratedToOperatorSets", avsRule) if err != nil { return nil, err } @@ -850,8 +1092,8 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAVSRegistr select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated) - if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorAVSRegistrationStatusUpdated", log); err != nil { + event := new(AVSDirectoryStorageAVSMigratedToOperatorSets) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "AVSMigratedToOperatorSets", log); err != nil { return err } event.Raw = log @@ -872,21 +1114,21 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAVSRegistr }), nil } -// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. +// ParseAVSMigratedToOperatorSets is a log parse operation binding the contract event 0x702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) -func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorAVSRegistrationStatusUpdated(log types.Log) (*AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated, error) { - event := new(AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated) - if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorAVSRegistrationStatusUpdated", log); err != nil { +// Solidity: event AVSMigratedToOperatorSets(address indexed avs) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseAVSMigratedToOperatorSets(log types.Log) (*AVSDirectoryStorageAVSMigratedToOperatorSets, error) { + event := new(AVSDirectoryStorageAVSMigratedToOperatorSets) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "AVSMigratedToOperatorSets", log); err != nil { return nil, err } event.Raw = log return event, nil } -// AVSDirectoryStorageOperatorAddedToOperatorSetIterator is returned from FilterOperatorAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorAddedToOperatorSet events raised by the AVSDirectoryStorage contract. -type AVSDirectoryStorageOperatorAddedToOperatorSetIterator struct { - Event *AVSDirectoryStorageOperatorAddedToOperatorSet // Event containing the contract specifics and raw log +// AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator is returned from FilterOperatorAVSRegistrationStatusUpdated and is used to iterate over the raw logs and unpacked data for OperatorAVSRegistrationStatusUpdated events raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator struct { + Event *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -900,7 +1142,7 @@ type AVSDirectoryStorageOperatorAddedToOperatorSetIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Next() bool { +func (it *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -909,7 +1151,7 @@ func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Next() bool { if it.done { select { case log := <-it.logs: - it.Event = new(AVSDirectoryStorageOperatorAddedToOperatorSet) + it.Event = new(AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -924,7 +1166,7 @@ func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Next() bool { // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(AVSDirectoryStorageOperatorAddedToOperatorSet) + it.Event = new(AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -940,43 +1182,61 @@ func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Next() bool { } // Error returns any retrieval or parsing error occurred during filtering. -func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Error() error { +func (it *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Close() error { +func (it *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator) Close() error { it.sub.Unsubscribe() return nil } -// AVSDirectoryStorageOperatorAddedToOperatorSet represents a OperatorAddedToOperatorSet event raised by the AVSDirectoryStorage contract. -type AVSDirectoryStorageOperatorAddedToOperatorSet struct { - Operator common.Address - Avs common.Address - OperatorSetId uint32 - Raw types.Log // Blockchain specific contextual infos +// AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated represents a OperatorAVSRegistrationStatusUpdated event raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated struct { + Operator common.Address + Avs common.Address + Status uint8 + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. // -// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts) (*AVSDirectoryStorageOperatorAddedToOperatorSetIterator, error) { +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorAVSRegistrationStatusUpdated(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } - logs, sub, err := _AVSDirectoryStorage.contract.FilterLogs(opts, "OperatorAddedToOperatorSet") + logs, sub, err := _AVSDirectoryStorage.contract.FilterLogs(opts, "OperatorAVSRegistrationStatusUpdated", operatorRule, avsRule) if err != nil { return nil, err } - return &AVSDirectoryStorageOperatorAddedToOperatorSetIterator{contract: _AVSDirectoryStorage.contract, event: "OperatorAddedToOperatorSet", logs: logs, sub: sub}, nil + return &AVSDirectoryStorageOperatorAVSRegistrationStatusUpdatedIterator{contract: _AVSDirectoryStorage.contract, event: "OperatorAVSRegistrationStatusUpdated", logs: logs, sub: sub}, nil } -// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. // -// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorAddedToOperatorSet) (event.Subscription, error) { +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAVSRegistrationStatusUpdated(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated, operator []common.Address, avs []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } - logs, sub, err := _AVSDirectoryStorage.contract.WatchLogs(opts, "OperatorAddedToOperatorSet") + logs, sub, err := _AVSDirectoryStorage.contract.WatchLogs(opts, "OperatorAVSRegistrationStatusUpdated", operatorRule, avsRule) if err != nil { return nil, err } @@ -986,8 +1246,8 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAddedToOpe select { case log := <-logs: // New log arrived, parse the event and forward to the user - event := new(AVSDirectoryStorageOperatorAddedToOperatorSet) - if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { + event := new(AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorAVSRegistrationStatusUpdated", log); err != nil { return err } event.Raw = log @@ -1008,21 +1268,21 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAddedToOpe }), nil } -// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. // -// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorAddedToOperatorSet(log types.Log) (*AVSDirectoryStorageOperatorAddedToOperatorSet, error) { - event := new(AVSDirectoryStorageOperatorAddedToOperatorSet) - if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorAVSRegistrationStatusUpdated(log types.Log) (*AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated, error) { + event := new(AVSDirectoryStorageOperatorAVSRegistrationStatusUpdated) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorAVSRegistrationStatusUpdated", log); err != nil { return nil, err } event.Raw = log return event, nil } -// AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator is returned from FilterOperatorRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorRemovedFromOperatorSet events raised by the AVSDirectoryStorage contract. -type AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator struct { - Event *AVSDirectoryStorageOperatorRemovedFromOperatorSet // Event containing the contract specifics and raw log +// AVSDirectoryStorageOperatorAddedToOperatorSetIterator is returned from FilterOperatorAddedToOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorAddedToOperatorSet events raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorAddedToOperatorSetIterator struct { + Event *AVSDirectoryStorageOperatorAddedToOperatorSet // Event containing the contract specifics and raw log contract *bind.BoundContract // Generic contract to use for unpacking event data event string // Event name to use for unpacking event data @@ -1036,7 +1296,7 @@ type AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator struct { // Next advances the iterator to the subsequent event, returning whether there // are any more events found. In case of a retrieval or parsing error, false is // returned and Error() can be queried for the exact failure. -func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Next() bool { +func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Next() bool { // If the iterator failed, stop iterating if it.fail != nil { return false @@ -1045,7 +1305,7 @@ func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Next() bool if it.done { select { case log := <-it.logs: - it.Event = new(AVSDirectoryStorageOperatorRemovedFromOperatorSet) + it.Event = new(AVSDirectoryStorageOperatorAddedToOperatorSet) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1060,7 +1320,7 @@ func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Next() bool // Iterator still in progress, wait for either a data or an error event select { case log := <-it.logs: - it.Event = new(AVSDirectoryStorageOperatorRemovedFromOperatorSet) + it.Event = new(AVSDirectoryStorageOperatorAddedToOperatorSet) if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { it.fail = err return false @@ -1076,43 +1336,351 @@ func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Next() bool } // Error returns any retrieval or parsing error occurred during filtering. -func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Error() error { +func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Error() error { return it.fail } // Close terminates the iteration process, releasing any pending underlying // resources. -func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Close() error { +func (it *AVSDirectoryStorageOperatorAddedToOperatorSetIterator) Close() error { it.sub.Unsubscribe() return nil } -// AVSDirectoryStorageOperatorRemovedFromOperatorSet represents a OperatorRemovedFromOperatorSet event raised by the AVSDirectoryStorage contract. -type AVSDirectoryStorageOperatorRemovedFromOperatorSet struct { - Operator common.Address - Avs common.Address - OperatorSetId uint32 - Raw types.Log // Blockchain specific contextual infos +// AVSDirectoryStorageOperatorAddedToOperatorSet represents a OperatorAddedToOperatorSet event raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorAddedToOperatorSet struct { + Operator common.Address + OperatorSet IAVSDirectoryOperatorSet + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e. // -// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts) (*AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator, error) { +// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*AVSDirectoryStorageOperatorAddedToOperatorSetIterator, error) { - logs, sub, err := _AVSDirectoryStorage.contract.FilterLogs(opts, "OperatorRemovedFromOperatorSet") - if err != nil { - return nil, err - } - return &AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator{contract: _AVSDirectoryStorage.contract, event: "OperatorRemovedFromOperatorSet", logs: logs, sub: sub}, nil + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _AVSDirectoryStorage.contract.FilterLogs(opts, "OperatorAddedToOperatorSet", operatorRule) + if err != nil { + return nil, err + } + return &AVSDirectoryStorageOperatorAddedToOperatorSetIterator{contract: _AVSDirectoryStorage.contract, event: "OperatorAddedToOperatorSet", logs: logs, sub: sub}, nil +} + +// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e. +// +// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorAddedToOperatorSet, operator []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _AVSDirectoryStorage.contract.WatchLogs(opts, "OperatorAddedToOperatorSet", operatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AVSDirectoryStorageOperatorAddedToOperatorSet) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e. +// +// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorAddedToOperatorSet(log types.Log) (*AVSDirectoryStorageOperatorAddedToOperatorSet, error) { + event := new(AVSDirectoryStorageOperatorAddedToOperatorSet) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AVSDirectoryStorageOperatorMigratedToOperatorSetsIterator is returned from FilterOperatorMigratedToOperatorSets and is used to iterate over the raw logs and unpacked data for OperatorMigratedToOperatorSets events raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorMigratedToOperatorSetsIterator struct { + Event *AVSDirectoryStorageOperatorMigratedToOperatorSets // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AVSDirectoryStorageOperatorMigratedToOperatorSetsIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryStorageOperatorMigratedToOperatorSets) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryStorageOperatorMigratedToOperatorSets) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AVSDirectoryStorageOperatorMigratedToOperatorSetsIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AVSDirectoryStorageOperatorMigratedToOperatorSetsIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AVSDirectoryStorageOperatorMigratedToOperatorSets represents a OperatorMigratedToOperatorSets event raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorMigratedToOperatorSets struct { + Operator common.Address + Avs common.Address + OperatorSetIds []uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorMigratedToOperatorSets is a free log retrieval operation binding the contract event 0x54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01. +// +// Solidity: event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorMigratedToOperatorSets(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*AVSDirectoryStorageOperatorMigratedToOperatorSetsIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + + logs, sub, err := _AVSDirectoryStorage.contract.FilterLogs(opts, "OperatorMigratedToOperatorSets", operatorRule, avsRule) + if err != nil { + return nil, err + } + return &AVSDirectoryStorageOperatorMigratedToOperatorSetsIterator{contract: _AVSDirectoryStorage.contract, event: "OperatorMigratedToOperatorSets", logs: logs, sub: sub}, nil +} + +// WatchOperatorMigratedToOperatorSets is a free log subscription operation binding the contract event 0x54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01. +// +// Solidity: event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorMigratedToOperatorSets(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorMigratedToOperatorSets, operator []common.Address, avs []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + + logs, sub, err := _AVSDirectoryStorage.contract.WatchLogs(opts, "OperatorMigratedToOperatorSets", operatorRule, avsRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AVSDirectoryStorageOperatorMigratedToOperatorSets) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorMigratedToOperatorSets", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorMigratedToOperatorSets is a log parse operation binding the contract event 0x54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01. +// +// Solidity: event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorMigratedToOperatorSets(log types.Log) (*AVSDirectoryStorageOperatorMigratedToOperatorSets, error) { + event := new(AVSDirectoryStorageOperatorMigratedToOperatorSets) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorMigratedToOperatorSets", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator is returned from FilterOperatorRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorRemovedFromOperatorSet events raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator struct { + Event *AVSDirectoryStorageOperatorRemovedFromOperatorSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryStorageOperatorRemovedFromOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryStorageOperatorRemovedFromOperatorSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } } -// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AVSDirectoryStorageOperatorRemovedFromOperatorSet represents a OperatorRemovedFromOperatorSet event raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorRemovedFromOperatorSet struct { + Operator common.Address + OperatorSet IAVSDirectoryOperatorSet + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe. // -// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorRemovedFromOperatorSet) (event.Subscription, error) { +// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } - logs, sub, err := _AVSDirectoryStorage.contract.WatchLogs(opts, "OperatorRemovedFromOperatorSet") + logs, sub, err := _AVSDirectoryStorage.contract.FilterLogs(opts, "OperatorRemovedFromOperatorSet", operatorRule) + if err != nil { + return nil, err + } + return &AVSDirectoryStorageOperatorRemovedFromOperatorSetIterator{contract: _AVSDirectoryStorage.contract, event: "OperatorRemovedFromOperatorSet", logs: logs, sub: sub}, nil +} + +// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe. +// +// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorRemovedFromOperatorSet, operator []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _AVSDirectoryStorage.contract.WatchLogs(opts, "OperatorRemovedFromOperatorSet", operatorRule) if err != nil { return nil, err } @@ -1144,9 +1712,9 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorRemovedFro }), nil } -// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe. // -// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet) func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorRemovedFromOperatorSet(log types.Log) (*AVSDirectoryStorageOperatorRemovedFromOperatorSet, error) { event := new(AVSDirectoryStorageOperatorRemovedFromOperatorSet) if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorRemovedFromOperatorSet", log); err != nil { @@ -1155,3 +1723,137 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorRemovedFro event.Raw = log return event, nil } + +// AVSDirectoryStorageOperatorSetCreatedIterator is returned from FilterOperatorSetCreated and is used to iterate over the raw logs and unpacked data for OperatorSetCreated events raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorSetCreatedIterator struct { + Event *AVSDirectoryStorageOperatorSetCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AVSDirectoryStorageOperatorSetCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryStorageOperatorSetCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AVSDirectoryStorageOperatorSetCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AVSDirectoryStorageOperatorSetCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AVSDirectoryStorageOperatorSetCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AVSDirectoryStorageOperatorSetCreated represents a OperatorSetCreated event raised by the AVSDirectoryStorage contract. +type AVSDirectoryStorageOperatorSetCreated struct { + OperatorSet IAVSDirectoryOperatorSet + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorSetCreated is a free log retrieval operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c. +// +// Solidity: event OperatorSetCreated((address,uint32) operatorSet) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) FilterOperatorSetCreated(opts *bind.FilterOpts) (*AVSDirectoryStorageOperatorSetCreatedIterator, error) { + + logs, sub, err := _AVSDirectoryStorage.contract.FilterLogs(opts, "OperatorSetCreated") + if err != nil { + return nil, err + } + return &AVSDirectoryStorageOperatorSetCreatedIterator{contract: _AVSDirectoryStorage.contract, event: "OperatorSetCreated", logs: logs, sub: sub}, nil +} + +// WatchOperatorSetCreated is a free log subscription operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c. +// +// Solidity: event OperatorSetCreated((address,uint32) operatorSet) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) WatchOperatorSetCreated(opts *bind.WatchOpts, sink chan<- *AVSDirectoryStorageOperatorSetCreated) (event.Subscription, error) { + + logs, sub, err := _AVSDirectoryStorage.contract.WatchLogs(opts, "OperatorSetCreated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AVSDirectoryStorageOperatorSetCreated) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorSetCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorSetCreated is a log parse operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c. +// +// Solidity: event OperatorSetCreated((address,uint32) operatorSet) +func (_AVSDirectoryStorage *AVSDirectoryStorageFilterer) ParseOperatorSetCreated(log types.Log) (*AVSDirectoryStorageOperatorSetCreated, error) { + event := new(AVSDirectoryStorageOperatorSetCreated) + if err := _AVSDirectoryStorage.contract.UnpackLog(event, "OperatorSetCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/bindings/IAVSDirectory/binding.go b/pkg/bindings/IAVSDirectory/binding.go index 2102d9ed3..df3c6998f 100644 --- a/pkg/bindings/IAVSDirectory/binding.go +++ b/pkg/bindings/IAVSDirectory/binding.go @@ -29,6 +29,12 @@ var ( _ = abi.ConvertType ) +// IAVSDirectoryOperatorSet is an auto generated low-level Go binding around an user-defined struct. +type IAVSDirectoryOperatorSet struct { + Avs common.Address + OperatorSetId uint32 +} + // ISignatureUtilsSignatureWithSaltAndExpiry is an auto generated low-level Go binding around an user-defined struct. type ISignatureUtilsSignatureWithSaltAndExpiry struct { Signature []byte @@ -38,7 +44,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // IAVSDirectoryMetaData contains all meta data concerning the IAVSDirectory contract. var IAVSDirectoryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"signature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"isLegacyOperator\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", } // IAVSDirectoryABI is the input ABI used to generate the binding from. @@ -280,6 +286,37 @@ func (_IAVSDirectory *IAVSDirectoryCallerSession) CalculateOperatorAVSRegistrati return _IAVSDirectory.Contract.CalculateOperatorAVSRegistrationDigestHash(&_IAVSDirectory.CallOpts, operator, avs, salt, expiry) } +// CalculateOperatorSetForceDeregistrationTypehash is a free data retrieval call binding the contract method 0xb2841d48. +// +// Solidity: function calculateOperatorSetForceDeregistrationTypehash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_IAVSDirectory *IAVSDirectoryCaller) CalculateOperatorSetForceDeregistrationTypehash(opts *bind.CallOpts, avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + var out []interface{} + err := _IAVSDirectory.contract.Call(opts, &out, "calculateOperatorSetForceDeregistrationTypehash", avs, operatorSetIds, salt, expiry) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// CalculateOperatorSetForceDeregistrationTypehash is a free data retrieval call binding the contract method 0xb2841d48. +// +// Solidity: function calculateOperatorSetForceDeregistrationTypehash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_IAVSDirectory *IAVSDirectorySession) CalculateOperatorSetForceDeregistrationTypehash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _IAVSDirectory.Contract.CalculateOperatorSetForceDeregistrationTypehash(&_IAVSDirectory.CallOpts, avs, operatorSetIds, salt, expiry) +} + +// CalculateOperatorSetForceDeregistrationTypehash is a free data retrieval call binding the contract method 0xb2841d48. +// +// Solidity: function calculateOperatorSetForceDeregistrationTypehash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) +func (_IAVSDirectory *IAVSDirectoryCallerSession) CalculateOperatorSetForceDeregistrationTypehash(avs common.Address, operatorSetIds []uint32, salt [32]byte, expiry *big.Int) ([32]byte, error) { + return _IAVSDirectory.Contract.CalculateOperatorSetForceDeregistrationTypehash(&_IAVSDirectory.CallOpts, avs, operatorSetIds, salt, expiry) +} + // CalculateOperatorSetRegistrationDigestHash is a free data retrieval call binding the contract method 0x955e6696. // // Solidity: function calculateOperatorSetRegistrationDigestHash(address avs, uint32[] operatorSetIds, bytes32 salt, uint256 expiry) view returns(bytes32) @@ -311,6 +348,68 @@ func (_IAVSDirectory *IAVSDirectoryCallerSession) CalculateOperatorSetRegistrati return _IAVSDirectory.Contract.CalculateOperatorSetRegistrationDigestHash(&_IAVSDirectory.CallOpts, avs, operatorSetIds, salt, expiry) } +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_IAVSDirectory *IAVSDirectoryCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _IAVSDirectory.contract.Call(opts, &out, "domainSeparator") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_IAVSDirectory *IAVSDirectorySession) DomainSeparator() ([32]byte, error) { + return _IAVSDirectory.Contract.DomainSeparator(&_IAVSDirectory.CallOpts) +} + +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_IAVSDirectory *IAVSDirectoryCallerSession) DomainSeparator() ([32]byte, error) { + return _IAVSDirectory.Contract.DomainSeparator(&_IAVSDirectory.CallOpts) +} + +// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// +// Solidity: function isMember(address avs, address operator, uint32 operatorSetId) view returns(bool) +func (_IAVSDirectory *IAVSDirectoryCaller) IsMember(opts *bind.CallOpts, avs common.Address, operator common.Address, operatorSetId uint32) (bool, error) { + var out []interface{} + err := _IAVSDirectory.contract.Call(opts, &out, "isMember", avs, operator, operatorSetId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// +// Solidity: function isMember(address avs, address operator, uint32 operatorSetId) view returns(bool) +func (_IAVSDirectory *IAVSDirectorySession) IsMember(avs common.Address, operator common.Address, operatorSetId uint32) (bool, error) { + return _IAVSDirectory.Contract.IsMember(&_IAVSDirectory.CallOpts, avs, operator, operatorSetId) +} + +// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// +// Solidity: function isMember(address avs, address operator, uint32 operatorSetId) view returns(bool) +func (_IAVSDirectory *IAVSDirectoryCallerSession) IsMember(avs common.Address, operator common.Address, operatorSetId uint32) (bool, error) { + return _IAVSDirectory.Contract.IsMember(&_IAVSDirectory.CallOpts, avs, operator, operatorSetId) +} + // OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5. // // Solidity: function operatorSaltIsSpent(address operator, bytes32 salt) view returns(bool) @@ -342,6 +441,69 @@ func (_IAVSDirectory *IAVSDirectoryCallerSession) OperatorSaltIsSpent(operator c return _IAVSDirectory.Contract.OperatorSaltIsSpent(&_IAVSDirectory.CallOpts, operator, salt) } +// BecomeOperatorSetAVS is a paid mutator transaction binding the contract method 0xaec205c5. +// +// Solidity: function becomeOperatorSetAVS() returns() +func (_IAVSDirectory *IAVSDirectoryTransactor) BecomeOperatorSetAVS(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IAVSDirectory.contract.Transact(opts, "becomeOperatorSetAVS") +} + +// BecomeOperatorSetAVS is a paid mutator transaction binding the contract method 0xaec205c5. +// +// Solidity: function becomeOperatorSetAVS() returns() +func (_IAVSDirectory *IAVSDirectorySession) BecomeOperatorSetAVS() (*types.Transaction, error) { + return _IAVSDirectory.Contract.BecomeOperatorSetAVS(&_IAVSDirectory.TransactOpts) +} + +// BecomeOperatorSetAVS is a paid mutator transaction binding the contract method 0xaec205c5. +// +// Solidity: function becomeOperatorSetAVS() returns() +func (_IAVSDirectory *IAVSDirectoryTransactorSession) BecomeOperatorSetAVS() (*types.Transaction, error) { + return _IAVSDirectory.Contract.BecomeOperatorSetAVS(&_IAVSDirectory.TransactOpts) +} + +// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442. +// +// Solidity: function cancelSalt(bytes32 salt) returns() +func (_IAVSDirectory *IAVSDirectoryTransactor) CancelSalt(opts *bind.TransactOpts, salt [32]byte) (*types.Transaction, error) { + return _IAVSDirectory.contract.Transact(opts, "cancelSalt", salt) +} + +// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442. +// +// Solidity: function cancelSalt(bytes32 salt) returns() +func (_IAVSDirectory *IAVSDirectorySession) CancelSalt(salt [32]byte) (*types.Transaction, error) { + return _IAVSDirectory.Contract.CancelSalt(&_IAVSDirectory.TransactOpts, salt) +} + +// CancelSalt is a paid mutator transaction binding the contract method 0xec76f442. +// +// Solidity: function cancelSalt(bytes32 salt) returns() +func (_IAVSDirectory *IAVSDirectoryTransactorSession) CancelSalt(salt [32]byte) (*types.Transaction, error) { + return _IAVSDirectory.Contract.CancelSalt(&_IAVSDirectory.TransactOpts, salt) +} + +// CreateOperatorSets is a paid mutator transaction binding the contract method 0xafe02ed5. +// +// Solidity: function createOperatorSets(uint32[] operatorSetIds) returns() +func (_IAVSDirectory *IAVSDirectoryTransactor) CreateOperatorSets(opts *bind.TransactOpts, operatorSetIds []uint32) (*types.Transaction, error) { + return _IAVSDirectory.contract.Transact(opts, "createOperatorSets", operatorSetIds) +} + +// CreateOperatorSets is a paid mutator transaction binding the contract method 0xafe02ed5. +// +// Solidity: function createOperatorSets(uint32[] operatorSetIds) returns() +func (_IAVSDirectory *IAVSDirectorySession) CreateOperatorSets(operatorSetIds []uint32) (*types.Transaction, error) { + return _IAVSDirectory.Contract.CreateOperatorSets(&_IAVSDirectory.TransactOpts, operatorSetIds) +} + +// CreateOperatorSets is a paid mutator transaction binding the contract method 0xafe02ed5. +// +// Solidity: function createOperatorSets(uint32[] operatorSetIds) returns() +func (_IAVSDirectory *IAVSDirectoryTransactorSession) CreateOperatorSets(operatorSetIds []uint32) (*types.Transaction, error) { + return _IAVSDirectory.Contract.CreateOperatorSets(&_IAVSDirectory.TransactOpts, operatorSetIds) +} + // DeregisterOperatorFromAVS is a paid mutator transaction binding the contract method 0xa364f4da. // // Solidity: function deregisterOperatorFromAVS(address operator) returns() @@ -384,6 +546,48 @@ func (_IAVSDirectory *IAVSDirectoryTransactorSession) DeregisterOperatorFromOper return _IAVSDirectory.Contract.DeregisterOperatorFromOperatorSets(&_IAVSDirectory.TransactOpts, operator, operatorSetIds) } +// ForceDeregisterFromOperatorSets is a paid mutator transaction binding the contract method 0x3fee332d. +// +// Solidity: function forceDeregisterFromOperatorSets(address operator, address avs, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_IAVSDirectory *IAVSDirectoryTransactor) ForceDeregisterFromOperatorSets(opts *bind.TransactOpts, operator common.Address, avs common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _IAVSDirectory.contract.Transact(opts, "forceDeregisterFromOperatorSets", operator, avs, operatorSetIds, operatorSignature) +} + +// ForceDeregisterFromOperatorSets is a paid mutator transaction binding the contract method 0x3fee332d. +// +// Solidity: function forceDeregisterFromOperatorSets(address operator, address avs, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_IAVSDirectory *IAVSDirectorySession) ForceDeregisterFromOperatorSets(operator common.Address, avs common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _IAVSDirectory.Contract.ForceDeregisterFromOperatorSets(&_IAVSDirectory.TransactOpts, operator, avs, operatorSetIds, operatorSignature) +} + +// ForceDeregisterFromOperatorSets is a paid mutator transaction binding the contract method 0x3fee332d. +// +// Solidity: function forceDeregisterFromOperatorSets(address operator, address avs, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_IAVSDirectory *IAVSDirectoryTransactorSession) ForceDeregisterFromOperatorSets(operator common.Address, avs common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _IAVSDirectory.Contract.ForceDeregisterFromOperatorSets(&_IAVSDirectory.TransactOpts, operator, avs, operatorSetIds, operatorSignature) +} + +// MigrateOperatorsToOperatorSets is a paid mutator transaction binding the contract method 0xef2dfa8d. +// +// Solidity: function migrateOperatorsToOperatorSets(address[] operators, uint32[][] operatorSetIds) returns() +func (_IAVSDirectory *IAVSDirectoryTransactor) MigrateOperatorsToOperatorSets(opts *bind.TransactOpts, operators []common.Address, operatorSetIds [][]uint32) (*types.Transaction, error) { + return _IAVSDirectory.contract.Transact(opts, "migrateOperatorsToOperatorSets", operators, operatorSetIds) +} + +// MigrateOperatorsToOperatorSets is a paid mutator transaction binding the contract method 0xef2dfa8d. +// +// Solidity: function migrateOperatorsToOperatorSets(address[] operators, uint32[][] operatorSetIds) returns() +func (_IAVSDirectory *IAVSDirectorySession) MigrateOperatorsToOperatorSets(operators []common.Address, operatorSetIds [][]uint32) (*types.Transaction, error) { + return _IAVSDirectory.Contract.MigrateOperatorsToOperatorSets(&_IAVSDirectory.TransactOpts, operators, operatorSetIds) +} + +// MigrateOperatorsToOperatorSets is a paid mutator transaction binding the contract method 0xef2dfa8d. +// +// Solidity: function migrateOperatorsToOperatorSets(address[] operators, uint32[][] operatorSetIds) returns() +func (_IAVSDirectory *IAVSDirectoryTransactorSession) MigrateOperatorsToOperatorSets(operators []common.Address, operatorSetIds [][]uint32) (*types.Transaction, error) { + return _IAVSDirectory.Contract.MigrateOperatorsToOperatorSets(&_IAVSDirectory.TransactOpts, operators, operatorSetIds) +} + // RegisterOperatorToAVS is a paid mutator transaction binding the contract method 0x9926ee7d. // // Solidity: function registerOperatorToAVS(address operator, (bytes,bytes32,uint256) operatorSignature) returns() @@ -407,23 +611,23 @@ func (_IAVSDirectory *IAVSDirectoryTransactorSession) RegisterOperatorToAVS(oper // RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. // -// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() -func (_IAVSDirectory *IAVSDirectoryTransactor) RegisterOperatorToOperatorSets(opts *bind.TransactOpts, operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { - return _IAVSDirectory.contract.Transact(opts, "registerOperatorToOperatorSets", operator, operatorSetIds, signature) +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_IAVSDirectory *IAVSDirectoryTransactor) RegisterOperatorToOperatorSets(opts *bind.TransactOpts, operator common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _IAVSDirectory.contract.Transact(opts, "registerOperatorToOperatorSets", operator, operatorSetIds, operatorSignature) } // RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. // -// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() -func (_IAVSDirectory *IAVSDirectorySession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { - return _IAVSDirectory.Contract.RegisterOperatorToOperatorSets(&_IAVSDirectory.TransactOpts, operator, operatorSetIds, signature) +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_IAVSDirectory *IAVSDirectorySession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _IAVSDirectory.Contract.RegisterOperatorToOperatorSets(&_IAVSDirectory.TransactOpts, operator, operatorSetIds, operatorSignature) } // RegisterOperatorToOperatorSets is a paid mutator transaction binding the contract method 0x1e2199e2. // -// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) signature) returns() -func (_IAVSDirectory *IAVSDirectoryTransactorSession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, signature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { - return _IAVSDirectory.Contract.RegisterOperatorToOperatorSets(&_IAVSDirectory.TransactOpts, operator, operatorSetIds, signature) +// Solidity: function registerOperatorToOperatorSets(address operator, uint32[] operatorSetIds, (bytes,bytes32,uint256) operatorSignature) returns() +func (_IAVSDirectory *IAVSDirectoryTransactorSession) RegisterOperatorToOperatorSets(operator common.Address, operatorSetIds []uint32, operatorSignature ISignatureUtilsSignatureWithSaltAndExpiry) (*types.Transaction, error) { + return _IAVSDirectory.Contract.RegisterOperatorToOperatorSets(&_IAVSDirectory.TransactOpts, operator, operatorSetIds, operatorSignature) } // UpdateAVSMetadataURI is a paid mutator transaction binding the contract method 0xa98fb355. @@ -592,6 +796,150 @@ func (_IAVSDirectory *IAVSDirectoryFilterer) ParseAVSMetadataURIUpdated(log type return event, nil } +// IAVSDirectoryAVSMigratedToOperatorSetsIterator is returned from FilterAVSMigratedToOperatorSets and is used to iterate over the raw logs and unpacked data for AVSMigratedToOperatorSets events raised by the IAVSDirectory contract. +type IAVSDirectoryAVSMigratedToOperatorSetsIterator struct { + Event *IAVSDirectoryAVSMigratedToOperatorSets // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IAVSDirectoryAVSMigratedToOperatorSetsIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IAVSDirectoryAVSMigratedToOperatorSets) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IAVSDirectoryAVSMigratedToOperatorSets) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IAVSDirectoryAVSMigratedToOperatorSetsIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IAVSDirectoryAVSMigratedToOperatorSetsIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IAVSDirectoryAVSMigratedToOperatorSets represents a AVSMigratedToOperatorSets event raised by the IAVSDirectory contract. +type IAVSDirectoryAVSMigratedToOperatorSets struct { + Avs common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAVSMigratedToOperatorSets is a free log retrieval operation binding the contract event 0x702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf. +// +// Solidity: event AVSMigratedToOperatorSets(address indexed avs) +func (_IAVSDirectory *IAVSDirectoryFilterer) FilterAVSMigratedToOperatorSets(opts *bind.FilterOpts, avs []common.Address) (*IAVSDirectoryAVSMigratedToOperatorSetsIterator, error) { + + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + + logs, sub, err := _IAVSDirectory.contract.FilterLogs(opts, "AVSMigratedToOperatorSets", avsRule) + if err != nil { + return nil, err + } + return &IAVSDirectoryAVSMigratedToOperatorSetsIterator{contract: _IAVSDirectory.contract, event: "AVSMigratedToOperatorSets", logs: logs, sub: sub}, nil +} + +// WatchAVSMigratedToOperatorSets is a free log subscription operation binding the contract event 0x702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf. +// +// Solidity: event AVSMigratedToOperatorSets(address indexed avs) +func (_IAVSDirectory *IAVSDirectoryFilterer) WatchAVSMigratedToOperatorSets(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryAVSMigratedToOperatorSets, avs []common.Address) (event.Subscription, error) { + + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + + logs, sub, err := _IAVSDirectory.contract.WatchLogs(opts, "AVSMigratedToOperatorSets", avsRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IAVSDirectoryAVSMigratedToOperatorSets) + if err := _IAVSDirectory.contract.UnpackLog(event, "AVSMigratedToOperatorSets", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAVSMigratedToOperatorSets is a log parse operation binding the contract event 0x702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf. +// +// Solidity: event AVSMigratedToOperatorSets(address indexed avs) +func (_IAVSDirectory *IAVSDirectoryFilterer) ParseAVSMigratedToOperatorSets(log types.Log) (*IAVSDirectoryAVSMigratedToOperatorSets, error) { + event := new(IAVSDirectoryAVSMigratedToOperatorSets) + if err := _IAVSDirectory.contract.UnpackLog(event, "AVSMigratedToOperatorSets", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // IAVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator is returned from FilterOperatorAVSRegistrationStatusUpdated and is used to iterate over the raw logs and unpacked data for OperatorAVSRegistrationStatusUpdated events raised by the IAVSDirectory contract. type IAVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator struct { Event *IAVSDirectoryOperatorAVSRegistrationStatusUpdated // Event containing the contract specifics and raw log @@ -661,15 +1009,15 @@ func (it *IAVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator) Close() err // IAVSDirectoryOperatorAVSRegistrationStatusUpdated represents a OperatorAVSRegistrationStatusUpdated event raised by the IAVSDirectory contract. type IAVSDirectoryOperatorAVSRegistrationStatusUpdated struct { - Operator common.Address - Avs common.Address - IsLegacyOperator bool - Raw types.Log // Blockchain specific contextual infos + Operator common.Address + Avs common.Address + Status uint8 + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. +// FilterOperatorAVSRegistrationStatusUpdated is a free log retrieval operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorAVSRegistrationStatusUpdated(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*IAVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator, error) { var operatorRule []interface{} @@ -688,9 +1036,9 @@ func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorAVSRegistrationStatus return &IAVSDirectoryOperatorAVSRegistrationStatusUpdatedIterator{contract: _IAVSDirectory.contract, event: "OperatorAVSRegistrationStatusUpdated", logs: logs, sub: sub}, nil } -// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. +// WatchOperatorAVSRegistrationStatusUpdated is a free log subscription operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorAVSRegistrationStatusUpdated(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryOperatorAVSRegistrationStatusUpdated, operator []common.Address, avs []common.Address) (event.Subscription, error) { var operatorRule []interface{} @@ -734,9 +1082,9 @@ func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorAVSRegistrationStatusU }), nil } -// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0x1864cf493d2c3314abbcef95e20acb37a637bccf3c51f4fe2f6f9492fbeabd7f. +// ParseOperatorAVSRegistrationStatusUpdated is a log parse operation binding the contract event 0xf0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41. // -// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, bool isLegacyOperator) +// Solidity: event OperatorAVSRegistrationStatusUpdated(address indexed operator, address indexed avs, uint8 status) func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorAVSRegistrationStatusUpdated(log types.Log) (*IAVSDirectoryOperatorAVSRegistrationStatusUpdated, error) { event := new(IAVSDirectoryOperatorAVSRegistrationStatusUpdated) if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorAVSRegistrationStatusUpdated", log); err != nil { @@ -815,30 +1163,39 @@ func (it *IAVSDirectoryOperatorAddedToOperatorSetIterator) Close() error { // IAVSDirectoryOperatorAddedToOperatorSet represents a OperatorAddedToOperatorSet event raised by the IAVSDirectory contract. type IAVSDirectoryOperatorAddedToOperatorSet struct { - Operator common.Address - Avs common.Address - OperatorSetId uint32 - Raw types.Log // Blockchain specific contextual infos + Operator common.Address + OperatorSet IAVSDirectoryOperatorSet + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// FilterOperatorAddedToOperatorSet is a free log retrieval operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e. // -// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts) (*IAVSDirectoryOperatorAddedToOperatorSetIterator, error) { +// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorAddedToOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*IAVSDirectoryOperatorAddedToOperatorSetIterator, error) { - logs, sub, err := _IAVSDirectory.contract.FilterLogs(opts, "OperatorAddedToOperatorSet") + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _IAVSDirectory.contract.FilterLogs(opts, "OperatorAddedToOperatorSet", operatorRule) if err != nil { return nil, err } return &IAVSDirectoryOperatorAddedToOperatorSetIterator{contract: _IAVSDirectory.contract, event: "OperatorAddedToOperatorSet", logs: logs, sub: sub}, nil } -// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// WatchOperatorAddedToOperatorSet is a free log subscription operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e. // -// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryOperatorAddedToOperatorSet) (event.Subscription, error) { +// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorAddedToOperatorSet(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryOperatorAddedToOperatorSet, operator []common.Address) (event.Subscription, error) { - logs, sub, err := _IAVSDirectory.contract.WatchLogs(opts, "OperatorAddedToOperatorSet") + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _IAVSDirectory.contract.WatchLogs(opts, "OperatorAddedToOperatorSet", operatorRule) if err != nil { return nil, err } @@ -870,9 +1227,9 @@ func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorAddedToOperatorSet(opt }), nil } -// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x0e2d64f3a0f18391c95a0a816961e081b15096f8bb957d0b654897b96b7ba309. +// ParseOperatorAddedToOperatorSet is a log parse operation binding the contract event 0x43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e. // -// Solidity: event OperatorAddedToOperatorSet(address operator, address avs, uint32 operatorSetId) +// Solidity: event OperatorAddedToOperatorSet(address indexed operator, (address,uint32) operatorSet) func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorAddedToOperatorSet(log types.Log) (*IAVSDirectoryOperatorAddedToOperatorSet, error) { event := new(IAVSDirectoryOperatorAddedToOperatorSet) if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorAddedToOperatorSet", log); err != nil { @@ -882,6 +1239,160 @@ func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorAddedToOperatorSet(log return event, nil } +// IAVSDirectoryOperatorMigratedToOperatorSetsIterator is returned from FilterOperatorMigratedToOperatorSets and is used to iterate over the raw logs and unpacked data for OperatorMigratedToOperatorSets events raised by the IAVSDirectory contract. +type IAVSDirectoryOperatorMigratedToOperatorSetsIterator struct { + Event *IAVSDirectoryOperatorMigratedToOperatorSets // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IAVSDirectoryOperatorMigratedToOperatorSetsIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IAVSDirectoryOperatorMigratedToOperatorSets) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IAVSDirectoryOperatorMigratedToOperatorSets) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IAVSDirectoryOperatorMigratedToOperatorSetsIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IAVSDirectoryOperatorMigratedToOperatorSetsIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IAVSDirectoryOperatorMigratedToOperatorSets represents a OperatorMigratedToOperatorSets event raised by the IAVSDirectory contract. +type IAVSDirectoryOperatorMigratedToOperatorSets struct { + Operator common.Address + Avs common.Address + OperatorSetIds []uint32 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorMigratedToOperatorSets is a free log retrieval operation binding the contract event 0x54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01. +// +// Solidity: event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds) +func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorMigratedToOperatorSets(opts *bind.FilterOpts, operator []common.Address, avs []common.Address) (*IAVSDirectoryOperatorMigratedToOperatorSetsIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + + logs, sub, err := _IAVSDirectory.contract.FilterLogs(opts, "OperatorMigratedToOperatorSets", operatorRule, avsRule) + if err != nil { + return nil, err + } + return &IAVSDirectoryOperatorMigratedToOperatorSetsIterator{contract: _IAVSDirectory.contract, event: "OperatorMigratedToOperatorSets", logs: logs, sub: sub}, nil +} + +// WatchOperatorMigratedToOperatorSets is a free log subscription operation binding the contract event 0x54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01. +// +// Solidity: event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds) +func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorMigratedToOperatorSets(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryOperatorMigratedToOperatorSets, operator []common.Address, avs []common.Address) (event.Subscription, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + + logs, sub, err := _IAVSDirectory.contract.WatchLogs(opts, "OperatorMigratedToOperatorSets", operatorRule, avsRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IAVSDirectoryOperatorMigratedToOperatorSets) + if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorMigratedToOperatorSets", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorMigratedToOperatorSets is a log parse operation binding the contract event 0x54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01. +// +// Solidity: event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds) +func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorMigratedToOperatorSets(log types.Log) (*IAVSDirectoryOperatorMigratedToOperatorSets, error) { + event := new(IAVSDirectoryOperatorMigratedToOperatorSets) + if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorMigratedToOperatorSets", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // IAVSDirectoryOperatorRemovedFromOperatorSetIterator is returned from FilterOperatorRemovedFromOperatorSet and is used to iterate over the raw logs and unpacked data for OperatorRemovedFromOperatorSet events raised by the IAVSDirectory contract. type IAVSDirectoryOperatorRemovedFromOperatorSetIterator struct { Event *IAVSDirectoryOperatorRemovedFromOperatorSet // Event containing the contract specifics and raw log @@ -951,30 +1462,39 @@ func (it *IAVSDirectoryOperatorRemovedFromOperatorSetIterator) Close() error { // IAVSDirectoryOperatorRemovedFromOperatorSet represents a OperatorRemovedFromOperatorSet event raised by the IAVSDirectory contract. type IAVSDirectoryOperatorRemovedFromOperatorSet struct { - Operator common.Address - Avs common.Address - OperatorSetId uint32 - Raw types.Log // Blockchain specific contextual infos + Operator common.Address + OperatorSet IAVSDirectoryOperatorSet + Raw types.Log // Blockchain specific contextual infos } -// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// FilterOperatorRemovedFromOperatorSet is a free log retrieval operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe. // -// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts) (*IAVSDirectoryOperatorRemovedFromOperatorSetIterator, error) { +// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorRemovedFromOperatorSet(opts *bind.FilterOpts, operator []common.Address) (*IAVSDirectoryOperatorRemovedFromOperatorSetIterator, error) { + + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } - logs, sub, err := _IAVSDirectory.contract.FilterLogs(opts, "OperatorRemovedFromOperatorSet") + logs, sub, err := _IAVSDirectory.contract.FilterLogs(opts, "OperatorRemovedFromOperatorSet", operatorRule) if err != nil { return nil, err } return &IAVSDirectoryOperatorRemovedFromOperatorSetIterator{contract: _IAVSDirectory.contract, event: "OperatorRemovedFromOperatorSet", logs: logs, sub: sub}, nil } -// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// WatchOperatorRemovedFromOperatorSet is a free log subscription operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe. // -// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) -func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryOperatorRemovedFromOperatorSet) (event.Subscription, error) { +// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet) +func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorRemovedFromOperatorSet(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryOperatorRemovedFromOperatorSet, operator []common.Address) (event.Subscription, error) { - logs, sub, err := _IAVSDirectory.contract.WatchLogs(opts, "OperatorRemovedFromOperatorSet") + var operatorRule []interface{} + for _, operatorItem := range operator { + operatorRule = append(operatorRule, operatorItem) + } + + logs, sub, err := _IAVSDirectory.contract.WatchLogs(opts, "OperatorRemovedFromOperatorSet", operatorRule) if err != nil { return nil, err } @@ -1006,9 +1526,9 @@ func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorRemovedFromOperatorSet }), nil } -// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0x9a431e7219c8c180fcf08db82dbdfe7f5512a825a1febaee77e02b9b2db8df82. +// ParseOperatorRemovedFromOperatorSet is a log parse operation binding the contract event 0xad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe. // -// Solidity: event OperatorRemovedFromOperatorSet(address operator, address avs, uint32 operatorSetId) +// Solidity: event OperatorRemovedFromOperatorSet(address indexed operator, (address,uint32) operatorSet) func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorRemovedFromOperatorSet(log types.Log) (*IAVSDirectoryOperatorRemovedFromOperatorSet, error) { event := new(IAVSDirectoryOperatorRemovedFromOperatorSet) if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorRemovedFromOperatorSet", log); err != nil { @@ -1017,3 +1537,137 @@ func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorRemovedFromOperatorSet event.Raw = log return event, nil } + +// IAVSDirectoryOperatorSetCreatedIterator is returned from FilterOperatorSetCreated and is used to iterate over the raw logs and unpacked data for OperatorSetCreated events raised by the IAVSDirectory contract. +type IAVSDirectoryOperatorSetCreatedIterator struct { + Event *IAVSDirectoryOperatorSetCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IAVSDirectoryOperatorSetCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IAVSDirectoryOperatorSetCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IAVSDirectoryOperatorSetCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IAVSDirectoryOperatorSetCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IAVSDirectoryOperatorSetCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IAVSDirectoryOperatorSetCreated represents a OperatorSetCreated event raised by the IAVSDirectory contract. +type IAVSDirectoryOperatorSetCreated struct { + OperatorSet IAVSDirectoryOperatorSet + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorSetCreated is a free log retrieval operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c. +// +// Solidity: event OperatorSetCreated((address,uint32) operatorSet) +func (_IAVSDirectory *IAVSDirectoryFilterer) FilterOperatorSetCreated(opts *bind.FilterOpts) (*IAVSDirectoryOperatorSetCreatedIterator, error) { + + logs, sub, err := _IAVSDirectory.contract.FilterLogs(opts, "OperatorSetCreated") + if err != nil { + return nil, err + } + return &IAVSDirectoryOperatorSetCreatedIterator{contract: _IAVSDirectory.contract, event: "OperatorSetCreated", logs: logs, sub: sub}, nil +} + +// WatchOperatorSetCreated is a free log subscription operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c. +// +// Solidity: event OperatorSetCreated((address,uint32) operatorSet) +func (_IAVSDirectory *IAVSDirectoryFilterer) WatchOperatorSetCreated(opts *bind.WatchOpts, sink chan<- *IAVSDirectoryOperatorSetCreated) (event.Subscription, error) { + + logs, sub, err := _IAVSDirectory.contract.WatchLogs(opts, "OperatorSetCreated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IAVSDirectoryOperatorSetCreated) + if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorSetCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorSetCreated is a log parse operation binding the contract event 0x31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c. +// +// Solidity: event OperatorSetCreated((address,uint32) operatorSet) +func (_IAVSDirectory *IAVSDirectoryFilterer) ParseOperatorSetCreated(log types.Log) (*IAVSDirectoryOperatorSetCreated, error) { + event := new(IAVSDirectoryOperatorSetCreated) + if err := _IAVSDirectory.contract.UnpackLog(event, "OperatorSetCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/pkg/bindings/IRewardsCoordinator/binding.go b/pkg/bindings/IRewardsCoordinator/binding.go index 87ae5a84e..e8177d3e8 100644 --- a/pkg/bindings/IRewardsCoordinator/binding.go +++ b/pkg/bindings/IRewardsCoordinator/binding.go @@ -31,8 +31,8 @@ var ( // IAVSDirectoryOperatorSet is an auto generated low-level Go binding around an user-defined struct. type IAVSDirectoryOperatorSet struct { - Avs common.Address - Id uint32 + Avs common.Address + OperatorSetId uint32 } // IRewardsCoordinatorDistributionRoot is an auto generated low-level Go binding around an user-defined struct. @@ -83,7 +83,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // IRewardsCoordinatorMetaData contains all meta data concerning the IRewardsCoordinator contract. var IRewardsCoordinatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", } // IRewardsCoordinatorABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go index 05cd59c15..0494a010d 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -31,8 +31,8 @@ var ( // IAVSDirectoryOperatorSet is an auto generated low-level Go binding around an user-defined struct. type IAVSDirectoryOperatorSet struct { - Avs common.Address - Id uint32 + Avs common.Address + OperatorSetId uint32 } // IRewardsCoordinatorDistributionRoot is an auto generated low-level Go binding around an user-defined struct. @@ -83,8 +83,8 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162004ac838038062004ac88339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e0516101005161012051610140516101605161468162000447600039600061204f0152600081816104f70152612d01015260006107f40152600081816104210152612b3001526000818161034d0152612bdc0152600081816104d00152612adf01526000818161074001526128560152600081816106e60152818161290d01526129e801526146816000f3fe608060405234801561001057600080fd5b506004361061030b5760003560e01c80637adace911161019d578063c46db606116100e9578063f2fde38b116100a2578063f96abf2e1161007c578063f96abf2e14610844578063fabc1cbc14610857578063fbf1e2c11461086a578063fce36c7d1461087d57600080fd5b8063f2fde38b14610816578063f698da2514610829578063f8cd84481461083157600080fd5b8063c46db60614610775578063d4540a55146107a3578063de02e503146107b6578063e221b245146107c9578063e810ce21146107dc578063ea4d3c9b146107ef57600080fd5b80639104c31911610156578063a0169ddd11610130578063a0169ddd14610708578063bb7e451f1461071b578063bf21a8aa1461073b578063c336f19d1461076257600080fd5b80639104c319146106be5780639be3d4e4146106d95780639d45c281146106e157600080fd5b80637adace91146106225780637b8f8b0514610654578063863cb9a91461065c578063865c69531461066f578063886f11951461069a5780638da5cb5b146106ad57600080fd5b80633a8c07861161025c57806358baaa3e116102155780635c975abb116101ef5780635c975abb146105d15780635e9d8348146105d95780636d21117e146105ec578063715018a61461061a57600080fd5b806358baaa3e14610593578063595c6a67146105a65780635ac86ab7146105ae57600080fd5b80633a8c0786146105195780633c8fcf7c146105305780633ccc861d146105435780633efe1db6146105565780634d18cc35146105695780634d7a80d41461058057600080fd5b8063131433b4116102c95780632b9f64a4116102a35780632b9f64a41461047757806336af41fa146104b857806337838ed0146104cb57806339b70e38146104f257600080fd5b8063131433b41461041c578063136439dd14610443578063149bc8721461045657600080fd5b806218572c1461031057806304a0c50214610348578063092db007146103845780630e9a53cf146103ac5780630eb38345146103f457806310d67a2f14610409575b600080fd5b61033361031e366004613b8c565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161033f565b60cb5461039990600160e01b900461ffff1681565b60405161ffff909116815260200161033f565b6103b4610890565b604080518251815260208084015163ffffffff9081169183019190915283830151169181019190915260609182015115159181019190915260800161033f565b610407610402366004613bb7565b61096f565b005b610407610417366004613b8c565b6109f1565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610407610451366004613bf0565b610aad565b610469610464366004613c21565b610bec565b60405190815260200161033f565b6104a0610485366004613b8c565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161033f565b6104076104c6366004613c3d565b610c62565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b6104a07f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461036f90600160a01b900463ffffffff1681565b61036f61053e366004613cd8565b610e94565b610407610551366004613d2f565b611125565b610407610564366004613d8a565b6114e7565b60cb5461036f90600160c01b900463ffffffff1681565b61039961058e366004613db6565b6117b8565b6104076105a1366004613df3565b61196a565b61040761197b565b6103336105bc366004613e0e565b606654600160ff9092169190911b9081161490565b606654610469565b6103336105e7366004613e31565b611a42565b6103336105fa366004613e66565b60cf60209081526000928352604080842090915290825290205460ff1681565b610407611acf565b610635610630366004613e92565b611ae3565b6040805161ffff909316835263ffffffff90911660208301520161033f565b60ca54610469565b61040761066a366004613b8c565b611b4b565b61046961067d366004613efd565b60cd60209081526000928352604080842090915290825290205481565b6065546104a0906001600160a01b031681565b6033546001600160a01b03166104a0565b6104a073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103b4611b5c565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610407610716366004613b8c565b611bfa565b610469610729366004613b8c565b60ce6020526000908152604090205481565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610469610770366004613db6565b611c59565b610333610783366004613e66565b60d060209081526000928352604080842090915290825290205460ff1681565b6104076107b1366004613f2b565b611d0f565b6103b46107c4366004613bf0565b611e57565b6104076107d7366004613f9e565b611ee9565b61036f6107ea366004613bf0565b611efa565b6104a07f000000000000000000000000000000000000000000000000000000000000000081565b610407610824366004613b8c565b611fd5565b61046961204b565b61046961083f366004613c21565b612089565b610407610852366004613df3565b61209a565b610407610865366004613bf0565b6122d0565b60cb546104a0906001600160a01b031681565b61040761088b366004613c3d565b61242c565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b801561096b57600060ca6108cd600184613fcf565b815481106108dd576108dd613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16158015606083018190529192509061094d5750806040015163ffffffff164210155b156109585792915050565b508061096381613ffc565b9150506108b8565b5090565b6109776125a3565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a689190614013565b6001600160a01b0316336001600160a01b031614610aa15760405162461bcd60e51b8152600401610a9890614030565b60405180910390fd5b610aaa816125fd565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b19919061407a565b610b355760405162461bcd60e51b8152600401610a9890614097565b60665481811614610bae5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610a98565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610bfc6020840184613b8c565b8360200135604051602001610c459392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610c8b5760405162461bcd60e51b8152600401610a98906140df565b33600090815260d1602052604090205460ff16610d2a5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a401610a98565b60026097541415610d4d5760405162461bcd60e51b8152600401610a9890614116565b600260975560005b82811015610e895736848483818110610d7057610d70613fe6565b9050602002810190610d82919061414d565b33600081815260ce60209081526040808320549051949550939192610dad9290918591879101614292565b604051602081830303815290604052805190602001209050610dce836126f4565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610e019083906142c2565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610e499088906142da565b60405180910390a4610e7b333060408601803590610e6a9060208901613b8c565b6001600160a01b0316929190612ecc565b836001019350505050610d55565b505060016097555050565b600061271061ffff83161115610f205760405162461bcd60e51b815260206004820152604560248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72436f60448201527f6d6d697373696f6e426970733a20636f6d6d697373696f6e4269707320746f6f606482015264040d0d2ced60db1b608482015260a401610a98565b610f2d62093a80426142c2565b33600090815260d26020908152604082209293509091908290610f5290880188613b8c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000866020016020810190610f879190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000856001811115610fb557610fb56142ed565b6001811115610fc657610fc66142ed565b815260208101919091526040016000208054909150801580611021575063ffffffff831682610ff6600184613fcf565b8154811061100657611006613fe6565b60009182526020909120015462010000900463ffffffff1614155b15611084576040805180820190915261ffff808616825263ffffffff808616602080850191825286546001810188556000888152919091209451940180549151909216620100000265ffffffffffff1990911693909216929092171790556110c1565b8382611091600184613fcf565b815481106110a1576110a1613fe6565b6000918252602090912001805461ffff191661ffff929092169190911790555b856040516110cf9190614303565b6040518091039020336001600160a01b03167f811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba8787876040516111149392919061433b565b60405180910390a350509392505050565b6066546002906004908116141561114e5760405162461bcd60e51b8152600401610a98906140df565b600260975414156111715760405162461bcd60e51b8152600401610a9890614116565b6002609755600060ca6111876020860186613df3565b63ffffffff168154811061119d5761119d613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015290506111fe8482612f3d565b60006112106080860160608701613b8c565b6001600160a01b03808216600090815260cc602052604090205491925016806112365750805b336001600160a01b038216146112b45760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608401610a98565b60005b6112c460a088018861437b565b90508110156114d957366112db60e08901896143cc565b838181106112eb576112eb613fe6565b6001600160a01b038716600090815260cd60209081526040808320930294909401945092909150829061132090850185613b8c565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808260200135116113da5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a401610a98565b60006113ea826020850135613fcf565b6001600160a01b038716600090815260cd602090815260408220929350850180359291906114189087613b8c565b6001600160a01b031681526020808201929092526040016000209190915561145a908a90839061144a90870187613b8c565b6001600160a01b03169190613209565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061149e6020890189613b8c565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050806114d290614416565b90506112b7565b505060016097555050505050565b606654600390600890811614156115105760405162461bcd60e51b8152600401610a98906140df565b60cb546001600160a01b0316331461153a5760405162461bcd60e51b8152600401610a9890614431565b60cb5463ffffffff600160c01b9091048116908316116115d65760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a401610a98565b428263ffffffff161061166f5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a401610a98565b60ca5460cb5460009061168f90600160a01b900463ffffffff1642614485565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b60cb546001600160a01b038416600090815260d26020908152604082209192600160e01b900461ffff1691839182906117f390880188613b8c565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008660200160208101906118289190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000856001811115611856576118566142ed565b6001811115611867576118676142ed565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156118db576000848152602090819020604080518082019091529084015461ffff8116825262010000900463ffffffff1681830152825260019092019101611895565b5050825192935050505b801561195d5763ffffffff4216826118fe600184613fcf565b8151811061190e5761190e613fe6565b60200260200101516020015163ffffffff16116119545781611931600183613fcf565b8151811061194157611941613fe6565b602002602001015160000151925061195d565b600019016118e5565b50909150505b9392505050565b6119726125a3565b610aaa81613239565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e7919061407a565b611a035760405162461bcd60e51b8152600401610a9890614097565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000611ac78260ca611a576020830183613df3565b63ffffffff1681548110611a6d57611a6d613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612f3d565b506001919050565b611ad76125a3565b611ae160006132aa565b565b60d26020528460005260406000206020528360005260406000206020528260005260406000206020528160005260406000208181548110611b2357600080fd5b60009182526020909120015461ffff8116955062010000900463ffffffff1693508592505050565b611b536125a3565b610aaa816132fc565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8054611b9090600190613fcf565b81548110611ba057611ba0613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b6001600160a01b038316600090815260d2602090815260408220908290611c8290860186613b8c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000846020016020810190611cb79190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000836001811115611ce557611ce56142ed565b6001811115611cf657611cf66142ed565b8152602081019190915260400160002054949350505050565b600054610100900460ff1615808015611d2f5750600054600160ff909116105b80611d495750303b158015611d49575060005460ff166001145b611dac5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a98565b6000805460ff191660011790558015611dcf576000805461ff0019166101001790555b611dd7613358565b60c955611de486866133ef565b611ded876132aa565b611df6846132fc565b611dff83613239565b611e08826134d9565b8015611e4e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8281548110611e8e57611e8e613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b611ef16125a3565b610aaa816134d9565b60ca546000905b63ffffffff811615611f66578260ca611f1b6001846144ad565b63ffffffff1681548110611f3157611f31613fe6565b9060005260206000209060020201600001541415611f54576119636001826144ad565b80611f5e816144d2565b915050611f01565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608401610a98565b611fdd6125a3565b6001600160a01b0381166120425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a98565b610aaa816132aa565b60007f000000000000000000000000000000000000000000000000000000000000000046141561207c575060c95490565b612084613358565b905090565b60006001610bfc6020840184613b8c565b606654600390600890811614156120c35760405162461bcd60e51b8152600401610a98906140df565b60cb546001600160a01b031633146120ed5760405162461bcd60e51b8152600401610a9890614431565b60ca5463ffffffff83161061215e5760405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608401610a98565b600060ca8363ffffffff168154811061217957612179613fe6565b906000526020600020906002020190508060010160089054906101000a900460ff16156122065760405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608401610a98565b6001810154600160201b900463ffffffff1642106122855760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608401610a98565b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123479190614013565b6001600160a01b0316336001600160a01b0316146123775760405162461bcd60e51b8152600401610a9890614030565b6066541981196066541916146123f55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610a98565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610be1565b606654600090600190811614156124555760405162461bcd60e51b8152600401610a98906140df565b600260975414156124785760405162461bcd60e51b8152600401610a9890614116565b600260975560005b82811015610e89573684848381811061249b5761249b613fe6565b90506020028101906124ad919061414d565b33600081815260ce602090815260408083205490519495509391926124d89290918591879101614292565b6040516020818303038152906040528051906020012090506124f9836126f4565b33600090815260cf602090815260408083208484529091529020805460ff1916600190811790915561252c9083906142c2565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281906125749088906142da565b60405180910390a4612595333060408601803590610e6a9060208901613b8c565b836001019350505050612480565b6033546001600160a01b03163314611ae15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a98565b6001600160a01b03811661268b5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610a98565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b600061270082806143cc565b905011612765576040805162461bcd60e51b815260206004820152602481019190915260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206e6f2073747261746567696573207365746064820152608401610a98565b60008160400135116127d75760405162461bcd60e51b8152602060048201526041602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a401610a98565b6f4b3b4ca85a86c47a098a223fffffffff8160400135111561284f5760405162461bcd60e51b815260206004820152603f602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608401610a98565b63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001661288660a0830160808401613df3565b63ffffffff16111561290b5760405162461bcd60e51b8152602060048201526054602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a401610a98565b7f000000000000000000000000000000000000000000000000000000000000000061293c60a0830160808401613df3565b6129469190614508565b63ffffffff16156129e65760405162461bcd60e51b815260206004820152606a602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c401610a98565b7f0000000000000000000000000000000000000000000000000000000000000000612a176080830160608401613df3565b612a219190614508565b63ffffffff1615612ac75760405162461bcd60e51b8152602060048201526070602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c401610a98565b612ad76080820160608301613df3565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612b0f9190613fcf565b11158015612b585750612b286080820160608301613df3565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612bd25760405162461bcd60e51b8152602060048201526051602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a401610a98565b612c0263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016426142c2565b612c126080830160608401613df3565b63ffffffff161115612c965760405162461bcd60e51b8152602060048201526053602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a401610a98565b6000805b612ca483806143cc565b9050811015612ec7576000612cb984806143cc565b83818110612cc957612cc9613fe6565b612cdf9260206040909202019081019150613b8c565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015612d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6e919061407a565b80612d9557506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b612e085760405162461bcd60e51b815260206004820152604a602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a401610a98565b806001600160a01b0316836001600160a01b031610612eb55760405162461bcd60e51b8152602060048201526069602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c401610a98565b9150612ec081614416565b9050612c9a565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052612f379085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613544565b50505050565b806060015115612f965760405162461bcd60e51b8152602060048201526030602482015260008051602061460c83398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608401610a98565b806040015163ffffffff16421015612ffd5760405162461bcd60e51b8152602060048201526036602482015260008051602061460c8339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608401610a98565b61300a60c083018361437b565b905061301960a084018461437b565b9050146130915760405162461bcd60e51b815260206004820152604c602482015260008051602061460c83398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a401610a98565b61309e60e08301836143cc565b90506130ad60c084018461437b565b9050146131235760405162461bcd60e51b815260206004820152604a602482015260008051602061460c83398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610a98565b805161314f906131396040850160208601613df3565b613146604086018661452b565b86606001613616565b60005b61315f60a084018461437b565b9050811015612ec7576131f9608084013561317d60a086018661437b565b8481811061318d5761318d613fe6565b90506020020160208101906131a29190613df3565b6131af60c087018761437b565b858181106131bf576131bf613fe6565b90506020028101906131d1919061452b565b6131de60e08901896143cc565b878181106131ee576131ee613fe6565b90506040020161378a565b61320281614416565b9050613152565b6040516001600160a01b038316602482015260448101829052612ec790849063a9059cbb60e01b90606401612f00565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b031615801561341057506001600160a01b03821615155b6134925760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610a98565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26134d5826125fd565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000613599826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138db9092919063ffffffff16565b805190915015612ec757808060200190518101906135b7919061407a565b612ec75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a98565b613621602083614572565b6001901b8463ffffffff16106136ab5760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a401610a98565b60006136b682610bec565b905061370184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff89166138f2565b6137825760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a401610a98565b505050505050565b613795602083614572565b6001901b8463ffffffff16106138135760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608401610a98565b600061381e82612089565b905061386984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff89166138f2565b6137825760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608401610a98565b60606138ea848460008561390a565b949350505050565b600083613900868585613a3b565b1495945050505050565b60608247101561396b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a98565b6001600160a01b0385163b6139c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a98565b600080866001600160a01b031685876040516139de91906145b2565b60006040518083038185875af1925050503d8060008114613a1b576040519150601f19603f3d011682016040523d82523d6000602084013e613a20565b606091505b5091509150613a30828286613b3e565b979650505050505050565b600060208451613a4b91906145c4565b15613ad25760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610a98565b8260205b85518111613b3557613ae96002856145c4565b613b0a57816000528086015160205260406000209150600284049350613b23565b8086015160005281602052604060002091506002840493505b613b2e6020826142c2565b9050613ad6565b50949350505050565b60608315613b4d575081611963565b825115613b5d5782518084602001fd5b8160405162461bcd60e51b8152600401610a9891906145d8565b6001600160a01b0381168114610aaa57600080fd5b600060208284031215613b9e57600080fd5b813561196381613b77565b8015158114610aaa57600080fd5b60008060408385031215613bca57600080fd5b8235613bd581613b77565b91506020830135613be581613ba9565b809150509250929050565b600060208284031215613c0257600080fd5b5035919050565b600060408284031215613c1b57600080fd5b50919050565b600060408284031215613c3357600080fd5b6119638383613c09565b60008060208385031215613c5057600080fd5b823567ffffffffffffffff80821115613c6857600080fd5b818501915085601f830112613c7c57600080fd5b813581811115613c8b57600080fd5b8660208260051b8501011115613ca057600080fd5b60209290920196919550909350505050565b803560028110613cc157600080fd5b919050565b803561ffff81168114613cc157600080fd5b600080600060808486031215613ced57600080fd5b613cf78585613c09565b9250613d0560408501613cb2565b9150613d1360608501613cc6565b90509250925092565b60006101008284031215613c1b57600080fd5b60008060408385031215613d4257600080fd5b823567ffffffffffffffff811115613d5957600080fd5b613d6585828601613d1c565b9250506020830135613be581613b77565b803563ffffffff81168114613cc157600080fd5b60008060408385031215613d9d57600080fd5b82359150613dad60208401613d76565b90509250929050565b600080600060808486031215613dcb57600080fd5b8335613dd681613b77565b9250613de58560208601613c09565b9150613d1360608501613cb2565b600060208284031215613e0557600080fd5b61196382613d76565b600060208284031215613e2057600080fd5b813560ff8116811461196357600080fd5b600060208284031215613e4357600080fd5b813567ffffffffffffffff811115613e5a57600080fd5b6138ea84828501613d1c565b60008060408385031215613e7957600080fd5b8235613e8481613b77565b946020939093013593505050565b600080600080600060a08688031215613eaa57600080fd5b8535613eb581613b77565b94506020860135613ec581613b77565b9350613ed360408701613d76565b9250613ee160608701613cb2565b949793965091946080013592915050565b8035613cc181613b77565b60008060408385031215613f1057600080fd5b8235613f1b81613b77565b91506020830135613be581613b77565b60008060008060008060c08789031215613f4457600080fd5b8635613f4f81613b77565b95506020870135613f5f81613b77565b9450604087013593506060870135613f7681613b77565b9250613f8460808801613d76565b9150613f9260a08801613cc6565b90509295509295509295565b600060208284031215613fb057600080fd5b61196382613cc6565b634e487b7160e01b600052601160045260246000fd5b600082821015613fe157613fe1613fb9565b500390565b634e487b7160e01b600052603260045260246000fd5b60008161400b5761400b613fb9565b506000190190565b60006020828403121561402557600080fd5b815161196381613b77565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561408c57600080fd5b815161196381613ba9565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008235609e1983360301811261416357600080fd5b9190910192915050565b818352600060208085019450826000805b868110156141d257823561419181613b77565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146141ba578384fd5b8986015250604097880197929092019160010161417e565b50959695505050505050565b60008135601e198336030181126141f457600080fd5b8201803567ffffffffffffffff81111561420d57600080fd5b8060061b360384131561421f57600080fd5b60a0855261423460a08601826020850161416d565b91505061424360208401613ef2565b6001600160a01b031660208501526040838101359085015261426760608401613d76565b63ffffffff16606085015261427e60808401613d76565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006142b960608301846141de565b95945050505050565b600082198211156142d5576142d5613fb9565b500190565b60208152600061196360208301846141de565b634e487b7160e01b600052602160045260246000fd5b6000823561431081613b77565b6001600160a01b0316825263ffffffff61432c60208501613d76565b16602083015250604001919050565b606081016002851061435d57634e487b7160e01b600052602160045260246000fd5b93815261ffff92909216602083015263ffffffff1660409091015290565b6000808335601e1984360301811261439257600080fd5b83018035915067ffffffffffffffff8211156143ad57600080fd5b6020019150600581901b36038213156143c557600080fd5b9250929050565b6000808335601e198436030181126143e357600080fd5b83018035915067ffffffffffffffff8211156143fe57600080fd5b6020019150600681901b36038213156143c557600080fd5b600060001982141561442a5761442a613fb9565b5060010190565b60208082526034908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6040820152733a103a3432903932bbb0b93239aab83230ba32b960611b606082015260800190565b600063ffffffff8083168185168083038211156144a4576144a4613fb9565b01949350505050565b600063ffffffff838116908316818110156144ca576144ca613fb9565b039392505050565b600063ffffffff8216806144e8576144e8613fb9565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061451f5761451f6144f2565b92169190910692915050565b6000808335601e1984360301811261454257600080fd5b83018035915067ffffffffffffffff82111561455d57600080fd5b6020019150368190038213156143c557600080fd5b600082614581576145816144f2565b500490565b60005b838110156145a1578181015183820152602001614589565b83811115612f375750506000910152565b60008251614163818460208701614586565b6000826145d3576145d36144f2565b500690565b60208152600082518060208401526145f7816040850160208701614586565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2052657761726473436f6f7264696e61746f722e5f76616c696461746552657761a2646970667358221220d7afccc0db13e91ca036bb96c0a4c5201c43a88dd680365dbaef13011707d7b064736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x6101806040523480156200001257600080fd5b5060405162004ac838038062004ac88339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e0516101005161012051610140516101605161468162000447600039600061204f0152600081816104f70152612d01015260006107f40152600081816104210152612b3001526000818161034d0152612bdc0152600081816104d00152612adf01526000818161074001526128560152600081816106e60152818161290d01526129e801526146816000f3fe608060405234801561001057600080fd5b506004361061030b5760003560e01c80637adace911161019d578063c46db606116100e9578063f2fde38b116100a2578063f96abf2e1161007c578063f96abf2e14610844578063fabc1cbc14610857578063fbf1e2c11461086a578063fce36c7d1461087d57600080fd5b8063f2fde38b14610816578063f698da2514610829578063f8cd84481461083157600080fd5b8063c46db60614610775578063d4540a55146107a3578063de02e503146107b6578063e221b245146107c9578063e810ce21146107dc578063ea4d3c9b146107ef57600080fd5b80639104c31911610156578063a0169ddd11610130578063a0169ddd14610708578063bb7e451f1461071b578063bf21a8aa1461073b578063c336f19d1461076257600080fd5b80639104c319146106be5780639be3d4e4146106d95780639d45c281146106e157600080fd5b80637adace91146106225780637b8f8b0514610654578063863cb9a91461065c578063865c69531461066f578063886f11951461069a5780638da5cb5b146106ad57600080fd5b80633a8c07861161025c57806358baaa3e116102155780635c975abb116101ef5780635c975abb146105d15780635e9d8348146105d95780636d21117e146105ec578063715018a61461061a57600080fd5b806358baaa3e14610593578063595c6a67146105a65780635ac86ab7146105ae57600080fd5b80633a8c0786146105195780633c8fcf7c146105305780633ccc861d146105435780633efe1db6146105565780634d18cc35146105695780634d7a80d41461058057600080fd5b8063131433b4116102c95780632b9f64a4116102a35780632b9f64a41461047757806336af41fa146104b857806337838ed0146104cb57806339b70e38146104f257600080fd5b8063131433b41461041c578063136439dd14610443578063149bc8721461045657600080fd5b806218572c1461031057806304a0c50214610348578063092db007146103845780630e9a53cf146103ac5780630eb38345146103f457806310d67a2f14610409575b600080fd5b61033361031e366004613b8c565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161033f565b60cb5461039990600160e01b900461ffff1681565b60405161ffff909116815260200161033f565b6103b4610890565b604080518251815260208084015163ffffffff9081169183019190915283830151169181019190915260609182015115159181019190915260800161033f565b610407610402366004613bb7565b61096f565b005b610407610417366004613b8c565b6109f1565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610407610451366004613bf0565b610aad565b610469610464366004613c21565b610bec565b60405190815260200161033f565b6104a0610485366004613b8c565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161033f565b6104076104c6366004613c3d565b610c62565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b6104a07f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461036f90600160a01b900463ffffffff1681565b61036f61053e366004613cd8565b610e94565b610407610551366004613d2f565b611125565b610407610564366004613d8a565b6114e7565b60cb5461036f90600160c01b900463ffffffff1681565b61039961058e366004613db6565b6117b8565b6104076105a1366004613df3565b61196a565b61040761197b565b6103336105bc366004613e0e565b606654600160ff9092169190911b9081161490565b606654610469565b6103336105e7366004613e31565b611a42565b6103336105fa366004613e66565b60cf60209081526000928352604080842090915290825290205460ff1681565b610407611acf565b610635610630366004613e92565b611ae3565b6040805161ffff909316835263ffffffff90911660208301520161033f565b60ca54610469565b61040761066a366004613b8c565b611b4b565b61046961067d366004613efd565b60cd60209081526000928352604080842090915290825290205481565b6065546104a0906001600160a01b031681565b6033546001600160a01b03166104a0565b6104a073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103b4611b5c565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610407610716366004613b8c565b611bfa565b610469610729366004613b8c565b60ce6020526000908152604090205481565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610469610770366004613db6565b611c59565b610333610783366004613e66565b60d060209081526000928352604080842090915290825290205460ff1681565b6104076107b1366004613f2b565b611d0f565b6103b46107c4366004613bf0565b611e57565b6104076107d7366004613f9e565b611ee9565b61036f6107ea366004613bf0565b611efa565b6104a07f000000000000000000000000000000000000000000000000000000000000000081565b610407610824366004613b8c565b611fd5565b61046961204b565b61046961083f366004613c21565b612089565b610407610852366004613df3565b61209a565b610407610865366004613bf0565b6122d0565b60cb546104a0906001600160a01b031681565b61040761088b366004613c3d565b61242c565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b801561096b57600060ca6108cd600184613fcf565b815481106108dd576108dd613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16158015606083018190529192509061094d5750806040015163ffffffff164210155b156109585792915050565b508061096381613ffc565b9150506108b8565b5090565b6109776125a3565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a689190614013565b6001600160a01b0316336001600160a01b031614610aa15760405162461bcd60e51b8152600401610a9890614030565b60405180910390fd5b610aaa816125fd565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b19919061407a565b610b355760405162461bcd60e51b8152600401610a9890614097565b60665481811614610bae5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610a98565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610bfc6020840184613b8c565b8360200135604051602001610c459392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610c8b5760405162461bcd60e51b8152600401610a98906140df565b33600090815260d1602052604090205460ff16610d2a5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a401610a98565b60026097541415610d4d5760405162461bcd60e51b8152600401610a9890614116565b600260975560005b82811015610e895736848483818110610d7057610d70613fe6565b9050602002810190610d82919061414d565b33600081815260ce60209081526040808320549051949550939192610dad9290918591879101614292565b604051602081830303815290604052805190602001209050610dce836126f4565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610e019083906142c2565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610e499088906142da565b60405180910390a4610e7b333060408601803590610e6a9060208901613b8c565b6001600160a01b0316929190612ecc565b836001019350505050610d55565b505060016097555050565b600061271061ffff83161115610f205760405162461bcd60e51b815260206004820152604560248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72436f60448201527f6d6d697373696f6e426970733a20636f6d6d697373696f6e4269707320746f6f606482015264040d0d2ced60db1b608482015260a401610a98565b610f2d62093a80426142c2565b33600090815260d26020908152604082209293509091908290610f5290880188613b8c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000866020016020810190610f879190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000856001811115610fb557610fb56142ed565b6001811115610fc657610fc66142ed565b815260208101919091526040016000208054909150801580611021575063ffffffff831682610ff6600184613fcf565b8154811061100657611006613fe6565b60009182526020909120015462010000900463ffffffff1614155b15611084576040805180820190915261ffff808616825263ffffffff808616602080850191825286546001810188556000888152919091209451940180549151909216620100000265ffffffffffff1990911693909216929092171790556110c1565b8382611091600184613fcf565b815481106110a1576110a1613fe6565b6000918252602090912001805461ffff191661ffff929092169190911790555b856040516110cf9190614303565b6040518091039020336001600160a01b03167f811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba8787876040516111149392919061433b565b60405180910390a350509392505050565b6066546002906004908116141561114e5760405162461bcd60e51b8152600401610a98906140df565b600260975414156111715760405162461bcd60e51b8152600401610a9890614116565b6002609755600060ca6111876020860186613df3565b63ffffffff168154811061119d5761119d613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015290506111fe8482612f3d565b60006112106080860160608701613b8c565b6001600160a01b03808216600090815260cc602052604090205491925016806112365750805b336001600160a01b038216146112b45760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608401610a98565b60005b6112c460a088018861437b565b90508110156114d957366112db60e08901896143cc565b838181106112eb576112eb613fe6565b6001600160a01b038716600090815260cd60209081526040808320930294909401945092909150829061132090850185613b8c565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808260200135116113da5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a401610a98565b60006113ea826020850135613fcf565b6001600160a01b038716600090815260cd602090815260408220929350850180359291906114189087613b8c565b6001600160a01b031681526020808201929092526040016000209190915561145a908a90839061144a90870187613b8c565b6001600160a01b03169190613209565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061149e6020890189613b8c565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050806114d290614416565b90506112b7565b505060016097555050505050565b606654600390600890811614156115105760405162461bcd60e51b8152600401610a98906140df565b60cb546001600160a01b0316331461153a5760405162461bcd60e51b8152600401610a9890614431565b60cb5463ffffffff600160c01b9091048116908316116115d65760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a401610a98565b428263ffffffff161061166f5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a401610a98565b60ca5460cb5460009061168f90600160a01b900463ffffffff1642614485565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b60cb546001600160a01b038416600090815260d26020908152604082209192600160e01b900461ffff1691839182906117f390880188613b8c565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008660200160208101906118289190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000856001811115611856576118566142ed565b6001811115611867576118676142ed565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156118db576000848152602090819020604080518082019091529084015461ffff8116825262010000900463ffffffff1681830152825260019092019101611895565b5050825192935050505b801561195d5763ffffffff4216826118fe600184613fcf565b8151811061190e5761190e613fe6565b60200260200101516020015163ffffffff16116119545781611931600183613fcf565b8151811061194157611941613fe6565b602002602001015160000151925061195d565b600019016118e5565b50909150505b9392505050565b6119726125a3565b610aaa81613239565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e7919061407a565b611a035760405162461bcd60e51b8152600401610a9890614097565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000611ac78260ca611a576020830183613df3565b63ffffffff1681548110611a6d57611a6d613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612f3d565b506001919050565b611ad76125a3565b611ae160006132aa565b565b60d26020528460005260406000206020528360005260406000206020528260005260406000206020528160005260406000208181548110611b2357600080fd5b60009182526020909120015461ffff8116955062010000900463ffffffff1693508592505050565b611b536125a3565b610aaa816132fc565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8054611b9090600190613fcf565b81548110611ba057611ba0613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b6001600160a01b038316600090815260d2602090815260408220908290611c8290860186613b8c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000846020016020810190611cb79190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000836001811115611ce557611ce56142ed565b6001811115611cf657611cf66142ed565b8152602081019190915260400160002054949350505050565b600054610100900460ff1615808015611d2f5750600054600160ff909116105b80611d495750303b158015611d49575060005460ff166001145b611dac5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a98565b6000805460ff191660011790558015611dcf576000805461ff0019166101001790555b611dd7613358565b60c955611de486866133ef565b611ded876132aa565b611df6846132fc565b611dff83613239565b611e08826134d9565b8015611e4e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8281548110611e8e57611e8e613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b611ef16125a3565b610aaa816134d9565b60ca546000905b63ffffffff811615611f66578260ca611f1b6001846144ad565b63ffffffff1681548110611f3157611f31613fe6565b9060005260206000209060020201600001541415611f54576119636001826144ad565b80611f5e816144d2565b915050611f01565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608401610a98565b611fdd6125a3565b6001600160a01b0381166120425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a98565b610aaa816132aa565b60007f000000000000000000000000000000000000000000000000000000000000000046141561207c575060c95490565b612084613358565b905090565b60006001610bfc6020840184613b8c565b606654600390600890811614156120c35760405162461bcd60e51b8152600401610a98906140df565b60cb546001600160a01b031633146120ed5760405162461bcd60e51b8152600401610a9890614431565b60ca5463ffffffff83161061215e5760405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608401610a98565b600060ca8363ffffffff168154811061217957612179613fe6565b906000526020600020906002020190508060010160089054906101000a900460ff16156122065760405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608401610a98565b6001810154600160201b900463ffffffff1642106122855760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608401610a98565b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123479190614013565b6001600160a01b0316336001600160a01b0316146123775760405162461bcd60e51b8152600401610a9890614030565b6066541981196066541916146123f55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610a98565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610be1565b606654600090600190811614156124555760405162461bcd60e51b8152600401610a98906140df565b600260975414156124785760405162461bcd60e51b8152600401610a9890614116565b600260975560005b82811015610e89573684848381811061249b5761249b613fe6565b90506020028101906124ad919061414d565b33600081815260ce602090815260408083205490519495509391926124d89290918591879101614292565b6040516020818303038152906040528051906020012090506124f9836126f4565b33600090815260cf602090815260408083208484529091529020805460ff1916600190811790915561252c9083906142c2565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281906125749088906142da565b60405180910390a4612595333060408601803590610e6a9060208901613b8c565b836001019350505050612480565b6033546001600160a01b03163314611ae15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a98565b6001600160a01b03811661268b5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610a98565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b600061270082806143cc565b905011612765576040805162461bcd60e51b815260206004820152602481019190915260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206e6f2073747261746567696573207365746064820152608401610a98565b60008160400135116127d75760405162461bcd60e51b8152602060048201526041602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a401610a98565b6f4b3b4ca85a86c47a098a223fffffffff8160400135111561284f5760405162461bcd60e51b815260206004820152603f602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608401610a98565b63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001661288660a0830160808401613df3565b63ffffffff16111561290b5760405162461bcd60e51b8152602060048201526054602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a401610a98565b7f000000000000000000000000000000000000000000000000000000000000000061293c60a0830160808401613df3565b6129469190614508565b63ffffffff16156129e65760405162461bcd60e51b815260206004820152606a602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c401610a98565b7f0000000000000000000000000000000000000000000000000000000000000000612a176080830160608401613df3565b612a219190614508565b63ffffffff1615612ac75760405162461bcd60e51b8152602060048201526070602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c401610a98565b612ad76080820160608301613df3565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612b0f9190613fcf565b11158015612b585750612b286080820160608301613df3565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612bd25760405162461bcd60e51b8152602060048201526051602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a401610a98565b612c0263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016426142c2565b612c126080830160608401613df3565b63ffffffff161115612c965760405162461bcd60e51b8152602060048201526053602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a401610a98565b6000805b612ca483806143cc565b9050811015612ec7576000612cb984806143cc565b83818110612cc957612cc9613fe6565b612cdf9260206040909202019081019150613b8c565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015612d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6e919061407a565b80612d9557506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b612e085760405162461bcd60e51b815260206004820152604a602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a401610a98565b806001600160a01b0316836001600160a01b031610612eb55760405162461bcd60e51b8152602060048201526069602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c401610a98565b9150612ec081614416565b9050612c9a565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052612f379085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613544565b50505050565b806060015115612f965760405162461bcd60e51b8152602060048201526030602482015260008051602061460c83398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608401610a98565b806040015163ffffffff16421015612ffd5760405162461bcd60e51b8152602060048201526036602482015260008051602061460c8339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608401610a98565b61300a60c083018361437b565b905061301960a084018461437b565b9050146130915760405162461bcd60e51b815260206004820152604c602482015260008051602061460c83398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a401610a98565b61309e60e08301836143cc565b90506130ad60c084018461437b565b9050146131235760405162461bcd60e51b815260206004820152604a602482015260008051602061460c83398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610a98565b805161314f906131396040850160208601613df3565b613146604086018661452b565b86606001613616565b60005b61315f60a084018461437b565b9050811015612ec7576131f9608084013561317d60a086018661437b565b8481811061318d5761318d613fe6565b90506020020160208101906131a29190613df3565b6131af60c087018761437b565b858181106131bf576131bf613fe6565b90506020028101906131d1919061452b565b6131de60e08901896143cc565b878181106131ee576131ee613fe6565b90506040020161378a565b61320281614416565b9050613152565b6040516001600160a01b038316602482015260448101829052612ec790849063a9059cbb60e01b90606401612f00565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b031615801561341057506001600160a01b03821615155b6134925760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610a98565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26134d5826125fd565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000613599826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138db9092919063ffffffff16565b805190915015612ec757808060200190518101906135b7919061407a565b612ec75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a98565b613621602083614572565b6001901b8463ffffffff16106136ab5760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a401610a98565b60006136b682610bec565b905061370184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff89166138f2565b6137825760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a401610a98565b505050505050565b613795602083614572565b6001901b8463ffffffff16106138135760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608401610a98565b600061381e82612089565b905061386984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff89166138f2565b6137825760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608401610a98565b60606138ea848460008561390a565b949350505050565b600083613900868585613a3b565b1495945050505050565b60608247101561396b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a98565b6001600160a01b0385163b6139c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a98565b600080866001600160a01b031685876040516139de91906145b2565b60006040518083038185875af1925050503d8060008114613a1b576040519150601f19603f3d011682016040523d82523d6000602084013e613a20565b606091505b5091509150613a30828286613b3e565b979650505050505050565b600060208451613a4b91906145c4565b15613ad25760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610a98565b8260205b85518111613b3557613ae96002856145c4565b613b0a57816000528086015160205260406000209150600284049350613b23565b8086015160005281602052604060002091506002840493505b613b2e6020826142c2565b9050613ad6565b50949350505050565b60608315613b4d575081611963565b825115613b5d5782518084602001fd5b8160405162461bcd60e51b8152600401610a9891906145d8565b6001600160a01b0381168114610aaa57600080fd5b600060208284031215613b9e57600080fd5b813561196381613b77565b8015158114610aaa57600080fd5b60008060408385031215613bca57600080fd5b8235613bd581613b77565b91506020830135613be581613ba9565b809150509250929050565b600060208284031215613c0257600080fd5b5035919050565b600060408284031215613c1b57600080fd5b50919050565b600060408284031215613c3357600080fd5b6119638383613c09565b60008060208385031215613c5057600080fd5b823567ffffffffffffffff80821115613c6857600080fd5b818501915085601f830112613c7c57600080fd5b813581811115613c8b57600080fd5b8660208260051b8501011115613ca057600080fd5b60209290920196919550909350505050565b803560028110613cc157600080fd5b919050565b803561ffff81168114613cc157600080fd5b600080600060808486031215613ced57600080fd5b613cf78585613c09565b9250613d0560408501613cb2565b9150613d1360608501613cc6565b90509250925092565b60006101008284031215613c1b57600080fd5b60008060408385031215613d4257600080fd5b823567ffffffffffffffff811115613d5957600080fd5b613d6585828601613d1c565b9250506020830135613be581613b77565b803563ffffffff81168114613cc157600080fd5b60008060408385031215613d9d57600080fd5b82359150613dad60208401613d76565b90509250929050565b600080600060808486031215613dcb57600080fd5b8335613dd681613b77565b9250613de58560208601613c09565b9150613d1360608501613cb2565b600060208284031215613e0557600080fd5b61196382613d76565b600060208284031215613e2057600080fd5b813560ff8116811461196357600080fd5b600060208284031215613e4357600080fd5b813567ffffffffffffffff811115613e5a57600080fd5b6138ea84828501613d1c565b60008060408385031215613e7957600080fd5b8235613e8481613b77565b946020939093013593505050565b600080600080600060a08688031215613eaa57600080fd5b8535613eb581613b77565b94506020860135613ec581613b77565b9350613ed360408701613d76565b9250613ee160608701613cb2565b949793965091946080013592915050565b8035613cc181613b77565b60008060408385031215613f1057600080fd5b8235613f1b81613b77565b91506020830135613be581613b77565b60008060008060008060c08789031215613f4457600080fd5b8635613f4f81613b77565b95506020870135613f5f81613b77565b9450604087013593506060870135613f7681613b77565b9250613f8460808801613d76565b9150613f9260a08801613cc6565b90509295509295509295565b600060208284031215613fb057600080fd5b61196382613cc6565b634e487b7160e01b600052601160045260246000fd5b600082821015613fe157613fe1613fb9565b500390565b634e487b7160e01b600052603260045260246000fd5b60008161400b5761400b613fb9565b506000190190565b60006020828403121561402557600080fd5b815161196381613b77565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561408c57600080fd5b815161196381613ba9565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008235609e1983360301811261416357600080fd5b9190910192915050565b818352600060208085019450826000805b868110156141d257823561419181613b77565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146141ba578384fd5b8986015250604097880197929092019160010161417e565b50959695505050505050565b60008135601e198336030181126141f457600080fd5b8201803567ffffffffffffffff81111561420d57600080fd5b8060061b360384131561421f57600080fd5b60a0855261423460a08601826020850161416d565b91505061424360208401613ef2565b6001600160a01b031660208501526040838101359085015261426760608401613d76565b63ffffffff16606085015261427e60808401613d76565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006142b960608301846141de565b95945050505050565b600082198211156142d5576142d5613fb9565b500190565b60208152600061196360208301846141de565b634e487b7160e01b600052602160045260246000fd5b6000823561431081613b77565b6001600160a01b0316825263ffffffff61432c60208501613d76565b16602083015250604001919050565b606081016002851061435d57634e487b7160e01b600052602160045260246000fd5b93815261ffff92909216602083015263ffffffff1660409091015290565b6000808335601e1984360301811261439257600080fd5b83018035915067ffffffffffffffff8211156143ad57600080fd5b6020019150600581901b36038213156143c557600080fd5b9250929050565b6000808335601e198436030181126143e357600080fd5b83018035915067ffffffffffffffff8211156143fe57600080fd5b6020019150600681901b36038213156143c557600080fd5b600060001982141561442a5761442a613fb9565b5060010190565b60208082526034908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6040820152733a103a3432903932bbb0b93239aab83230ba32b960611b606082015260800190565b600063ffffffff8083168185168083038211156144a4576144a4613fb9565b01949350505050565b600063ffffffff838116908316818110156144ca576144ca613fb9565b039392505050565b600063ffffffff8216806144e8576144e8613fb9565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061451f5761451f6144f2565b92169190910692915050565b6000808335601e1984360301811261454257600080fd5b83018035915067ffffffffffffffff82111561455d57600080fd5b6020019150368190038213156143c557600080fd5b600082614581576145816144f2565b500490565b60005b838110156145a1578181015183820152602001614589565b83811115612f375750506000910152565b60008251614163818460208701614586565b6000826145d3576145d36144f2565b500690565b60208152600082518060208401526145f7816040850160208701614586565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2052657761726473436f6f7264696e61746f722e5f76616c696461746552657761a26469706673582212200fe7e3de37588655e09adbecf2142757fac570b721a300aea035583bcc755c5964736f6c634300080c0033", } // RewardsCoordinatorABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/RewardsCoordinatorStorage/binding.go b/pkg/bindings/RewardsCoordinatorStorage/binding.go index 2e5ed3f4c..00f73eec0 100644 --- a/pkg/bindings/RewardsCoordinatorStorage/binding.go +++ b/pkg/bindings/RewardsCoordinatorStorage/binding.go @@ -31,8 +31,8 @@ var ( // IAVSDirectoryOperatorSet is an auto generated low-level Go binding around an user-defined struct. type IAVSDirectoryOperatorSet struct { - Avs common.Address - Id uint32 + Avs common.Address + OperatorSetId uint32 } // IRewardsCoordinatorDistributionRoot is an auto generated low-level Go binding around an user-defined struct. @@ -83,7 +83,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorStorageMetaData contains all meta data concerning the RewardsCoordinatorStorage contract. var RewardsCoordinatorStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", } // RewardsCoordinatorStorageABI is the input ABI used to generate the binding from. diff --git a/src/contracts/core/RewardsCoordinator.sol b/src/contracts/core/RewardsCoordinator.sol index de828b0aa..828d49b01 100644 --- a/src/contracts/core/RewardsCoordinator.sol +++ b/src/contracts/core/RewardsCoordinator.sol @@ -306,7 +306,7 @@ contract RewardsCoordinator is ); effectTimestamp = uint32(block.timestamp + OPERATOR_COMMISSION_ACTIVATION_DELAY); OperatorCommissionUpdate[] storage commissionHistory = - operatorCommissionUpdates[msg.sender][operatorSet.avs][operatorSet.id][rewardType]; + operatorCommissionUpdates[msg.sender][operatorSet.avs][operatorSet.operatorSetId][rewardType]; uint256 updateLength = commissionHistory.length; // If no updates or latest update is not for current effective timestamp, push a new commission update @@ -564,7 +564,7 @@ contract RewardsCoordinator is // if no value set, default to globalOperatorCommissionBips uint16 commissionBips = globalOperatorCommissionBips; OperatorCommissionUpdate[] memory commissionHistory = - operatorCommissionUpdates[operator][operatorSet.avs][operatorSet.id][rewardType]; + operatorCommissionUpdates[operator][operatorSet.avs][operatorSet.operatorSetId][rewardType]; for (uint256 i = commissionHistory.length; i > 0;) { if (commissionHistory[i - 1].effectTimestamp <= uint32(block.timestamp)) { @@ -619,7 +619,7 @@ contract RewardsCoordinator is IAVSDirectory.OperatorSet calldata operatorSet, RewardType rewardType ) external view returns (uint256) { - return operatorCommissionUpdates[operator][operatorSet.avs][operatorSet.id][rewardType].length; + return operatorCommissionUpdates[operator][operatorSet.avs][operatorSet.operatorSetId][rewardType].length; } /** From c0396caba2634a3f1d6454a26f020c653c287807 Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Tue, 6 Aug 2024 11:37:44 -0400 Subject: [PATCH 25/43] feat: track total members and sets (#649) * feat: track total members and sets * test: track total members and sets * fix: review changes * refactor: review changes * test: register multiple sets * test: deregister multiple sets * test: fuzz set creation --- src/contracts/core/AVSDirectory.sol | 6 + src/contracts/core/AVSDirectoryStorage.sol | 19 +- src/test/unit/AVSDirectoryUnit.t.sol | 250 ++++++++++++++++----- 3 files changed, 214 insertions(+), 61 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 6e3b509c1..bd4cfa9d8 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -73,6 +73,8 @@ contract AVSDirectory is isOperatorSet[msg.sender][operatorSetIds[i]] = true; emit OperatorSetCreated(OperatorSet({avs: msg.sender, operatorSetId: operatorSetIds[i]})); } + operatorSetCount += operatorSetIds.length; + avsOperatorSetCount[msg.sender] += operatorSetIds.length; } /** @@ -380,6 +382,8 @@ contract AVSDirectory is "AVSDirectory._registerOperatorToOperatorSets: operator already registered to operator set" ); + ++operatorSetMemberCount[avs][operatorSetIds[i]]; + // Mutate `isMember` to `true`. isMember[avs][operator][operatorSetIds[i]] = true; @@ -403,6 +407,8 @@ contract AVSDirectory is "AVSDirectory._deregisterOperatorFromOperatorSet: operator not registered for operator set" ); + --operatorSetMemberCount[avs][operatorSetIds[i]]; + // Mutate `isMember` to `false`. isMember[avs][operator][operatorSetIds[i]] = false; diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index 710b55442..5184cad14 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -34,18 +34,27 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { /// @notice Mapping: avs => operator => OperatorAVSRegistrationStatus struct mapping(address => mapping(address => OperatorAVSRegistrationStatus)) public avsOperatorStatus; - /// @notice Mapping: operator => salt => whether the salt has been used + /// @notice Mapping: operator => salt => Whether the salt has been used or not. mapping(address => mapping(bytes32 => bool)) public operatorSaltIsSpent; - /// @notice Mapping: avs => whether it is a an operator set AVS + /// @notice Mapping: avs => Whether it is a an operator set AVS or not. mapping(address => bool) public isOperatorSetAVS; - /// @notice Mapping: avs => operatorSetId => whether the operatorSet exists + /// @notice Mapping: avs => operatorSetId => Whether or not an operator set is valid. mapping(address => mapping(uint32 => bool)) public isOperatorSet; - /// @notice Mapping: avs = operator => operatorSetId => whether the operator is a member of the operatorSet + /// @notice Mapping: avs = operator => operatorSetId => Whether or not an operator is a member of an operator set. mapping(address => mapping(address => mapping(uint32 => bool))) public isMember; + /// @notice Mapping: avs => operatorSetId => Total operators within the given operator set. + mapping(address => mapping(uint32 => uint256)) public operatorSetMemberCount; + + /// @notice Mapping: avs => Total amount of operator sets created for a given AVS. + mapping(address => uint256) public avsOperatorSetCount; + + /// @notice Total amount of operators sets created. + uint256 public operatorSetCount; + constructor(IDelegationManager _delegation) { delegation = _delegation; } @@ -55,5 +64,5 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[43] private __gap; + uint256[40] private __gap; } diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 2d5aa5337..0fecdf558 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -194,7 +194,8 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { address operator = cheats.addr(operatorPk); (uint8 v, bytes32 r, bytes32 s) = cheats.sign( - operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), operatorSetIds, salt, expiry) + operatorPk, + avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), operatorSetIds, salt, expiry) ); // Set AVS as operator set avs @@ -203,7 +204,9 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { _registerOperatorWithBaseDetails(operator); avsDirectory.registerOperatorToOperatorSets( - operator, operatorSetIds, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + operator, + operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) ); } @@ -493,6 +496,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSet is AVSDirectoryUnit for (uint256 i; i < oids.length; ++i) { assertTrue(avsDirectory.isMember(address(this), operator, oids[i])); + assertEq(avsDirectory.operatorSetMemberCount(address(this), oids[i]), 1); } assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); @@ -530,11 +534,55 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSet is AVSDirectoryUnit assertTrue(avsDirectory.isMember(address(this), operator, operatorSetId)); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); + assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 1); + } + + function testFuzz_Correctness_MultipleSets( + uint256 operatorPk, + uint256 totalSets, + bytes32 salt, + uint256 expiry + ) public virtual { + avsDirectory.becomeOperatorSetAVS(); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + totalSets = bound(totalSets, 1, 32); + expiry = bound(expiry, 1, type(uint256).max); + + cheats.warp(0); + + uint32[] memory oids = new uint32[](totalSets); + + for (uint32 i = 1; i < totalSets + 1; ++i) { + _createOperatorSet(i); + oids[i - 1] = i; + } + + address operator = cheats.addr(operatorPk); + (uint8 v, bytes32 r, bytes32 s) = cheats.sign( + operatorPk, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), oids, salt, expiry) + ); + + _registerOperatorWithBaseDetails(operator); + + for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); + } + + avsDirectory.registerOperatorToOperatorSets( + operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) + ); + + for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { + assertTrue(avsDirectory.isMember(address(this), operator, operatorSetId)); + assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 1); + } + + assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); } } contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUnitTests { - function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); @@ -548,7 +596,7 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn cheats.prank(operator); cheats.expectRevert("AVSDirectory._deregisterOperatorFromOperatorSet: operator not registered for operator set"); - + avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, emptySig); } @@ -567,7 +615,12 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, emptySig); } - function testFuzz_forceDeregisterFromOperatorSets(uint256 operatorPk, uint32 operatorSetId, uint8 operatorSetsToAdd, bytes32 salt) public { + function testFuzz_forceDeregisterFromOperatorSets( + uint256 operatorPk, + uint32 operatorSetId, + uint8 operatorSetsToAdd, + bytes32 salt + ) public { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); operatorSetsToAdd = uint8(bound(operatorSetsToAdd, 1, type(uint8).max)); address operator = cheats.addr(operatorPk); @@ -581,14 +634,14 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn } // Register operator to operator sets - _registerOperatorToOperatorSets( - operatorPk, oids, salt, type(uint256).max - ); + _registerOperatorToOperatorSets(operatorPk, oids, salt, type(uint256).max); + + assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 1); // Deregister operator from operator sets ISignatureUtils.SignatureWithSaltAndExpiry memory emptySig; cheats.prank(operator); - for(uint i = 0; i < oids.length; i++) { + for (uint256 i = 0; i < oids.length; i++) { cheats.expectEmit(true, true, true, true, address(avsDirectory)); emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), oids[i])); } @@ -597,6 +650,8 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn for (uint32 i = 0; i < operatorSetsToAdd; i++) { assertFalse(avsDirectory.isMember(address(this), operator, oids[i]), "operator still in operator set"); } + + assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 0); } function testFuzz_revert_sigExpired(uint256 operatorPk, uint32 operatorSetId, bytes32 salt) public { @@ -608,8 +663,8 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn _createOperatorSet(operatorSetId); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = _createForceDeregSignature - (operatorPk, address(this), oids, 0, salt); + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = + _createForceDeregSignature(operatorPk, address(this), oids, 0, salt); cheats.warp(type(uint256).max); cheats.expectRevert("AVSDirectory.forceDeregisterFromOperatorSets: operator signature expired"); @@ -625,18 +680,22 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn // Register operator to operator sets _createOperatorSet(operatorSetId); - _registerOperatorToOperatorSets( - operatorPk, oids, salt, type(uint256).max - ); + _registerOperatorToOperatorSets(operatorPk, oids, salt, type(uint256).max); - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = _createForceDeregSignature - (operatorPk, address(this), oids, type(uint256).max, salt); + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = + _createForceDeregSignature(operatorPk, address(this), oids, type(uint256).max, salt); cheats.expectRevert("AVSDirectory.forceDeregisterFromOperatorSets: salt already spent"); avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, operatorSig); } - function testFuzz_forceDeregisterFromOperatorSets_onBehalf(uint256 operatorPk, uint32 operatorSetId, uint8 operatorSetsToAdd, bytes32 salt1, bytes32 salt2) public { + function testFuzz_forceDeregisterFromOperatorSets_onBehalf( + uint256 operatorPk, + uint32 operatorSetId, + uint8 operatorSetsToAdd, + bytes32 salt1, + bytes32 salt2 + ) public { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); operatorSetsToAdd = uint8(bound(operatorSetsToAdd, 1, type(uint8).max)); address operator = cheats.addr(operatorPk); @@ -650,15 +709,13 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn } // Register operator to operator sets - _registerOperatorToOperatorSets( - operatorPk, oids, salt1, type(uint256).max - ); + _registerOperatorToOperatorSets(operatorPk, oids, salt1, type(uint256).max); // Deregister operator from operator sets - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = _createForceDeregSignature - (operatorPk, address(this), oids, type(uint256).max, salt2); - - for (uint i = 0; i < oids.length; i++) { + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSig = + _createForceDeregSignature(operatorPk, address(this), oids, type(uint256).max, salt2); + + for (uint256 i = 0; i < oids.length; i++) { cheats.expectEmit(true, true, true, true, address(avsDirectory)); emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), oids[i])); } @@ -670,21 +727,25 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn } } - function _createForceDeregSignature(uint256 operatorPk, address avs, uint32[] memory oids, uint256 expiry, bytes32 salt) internal view returns (ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature) { + function _createForceDeregSignature( + uint256 operatorPk, + address avs, + uint32[] memory oids, + uint256 expiry, + bytes32 salt + ) internal view returns (ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature) { operatorSignature.expiry = expiry; - address operator = cheats.addr(operatorPk); operatorSignature.salt = salt; { bytes32 digestHash = avsDirectory.calculateOperatorSetForceDeregistrationTypehash(avs, oids, salt, expiry); (uint8 v, bytes32 r, bytes32 s) = cheats.sign(operatorPk, digestHash); operatorSignature.signature = abi.encodePacked(r, s, v); } - return operatorSignature; + return operatorSignature; } } contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirectoryUnitTests { - function testFuzz_revert_OperatorNotInOperatorSet(uint256 operatorPk, uint32 operatorSetId) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); @@ -710,6 +771,8 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector _registerOperatorToOperatorSet(operatorPk, operatorSetId, salt, expiry); + assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 1); + address operator = cheats.addr(operatorPk); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; @@ -719,26 +782,68 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); + assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 0); assertEq(avsDirectory.isMember(address(this), operator, operatorSetId), false); } + + function testFuzz_Correctness_MultipleSets( + uint256 operatorPk, + uint256 totalSets, + bytes32 salt, + uint256 expiry + ) public virtual { + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); + totalSets = bound(totalSets, 1, 32); + + uint32[] memory oids = new uint32[](totalSets); + + for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { + _createOperatorSet(operatorSetId); + oids[operatorSetId - 1] = operatorSetId; + } + + _registerOperatorToOperatorSets(operatorPk, oids, salt, expiry); + + for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { + assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 1); + } + + address operator = cheats.addr(operatorPk); + + for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { + cheats.expectEmit(true, false, false, false, address(avsDirectory)); + emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); + } + + avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); + + for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { + assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 0); + assertEq(avsDirectory.isMember(address(this), operator, operatorSetId), false); + } + } } contract AVSDirectoryUnitTests_createOperatorSet is AVSDirectoryUnitTests { - function test_createOperatorSet() public { - - uint32[] memory oids = new uint32[](2); - oids[0] = 1; - oids[1] = 2; + function testFuzz_createOperatorSet(uint256 totalSets) public { + totalSets = bound(totalSets, 1, 32); + + uint32[] memory oids = new uint32[](totalSets); - for(uint i = 0; i < oids.length; i++) { + for (uint32 i; i < totalSets; ++i) { + oids[i] = i + 1; cheats.expectEmit(true, true, true, true, address(avsDirectory)); - emit OperatorSetCreated(IAVSDirectory.OperatorSet({avs: address(this), operatorSetId: oids[i]})); + emit OperatorSetCreated(IAVSDirectory.OperatorSet({avs: address(this), operatorSetId: i + 1})); } avsDirectory.createOperatorSets(oids); - assertTrue(avsDirectory.isOperatorSet(address(this), oids[0])); - assertTrue(avsDirectory.isOperatorSet(address(this), oids[1])); + assertEq(avsDirectory.operatorSetCount(), totalSets); + assertEq(avsDirectory.avsOperatorSetCount(address(this)), totalSets); + + for (uint32 i = 1; i < totalSets + 1; ++i) { + assertTrue(avsDirectory.isOperatorSet(address(this), i)); + } } function test_revert_operatorSetExists() public { @@ -793,7 +898,9 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni operators[0] = operator; avsDirectory.becomeOperatorSetAVS(); - cheats.expectRevert("AVSDirectory.migrateOperatorsToOperatorSets: operator already migrated or not a legacy registered operator"); + cheats.expectRevert( + "AVSDirectory.migrateOperatorsToOperatorSets: operator already migrated or not a legacy registered operator" + ); avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); } @@ -817,7 +924,9 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); // Revert when trying to migrate operator again - cheats.expectRevert("AVSDirectory.migrateOperatorsToOperatorSets: operator already migrated or not a legacy registered operator"); + cheats.expectRevert( + "AVSDirectory.migrateOperatorsToOperatorSets: operator already migrated or not a legacy registered operator" + ); avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); } @@ -880,10 +989,13 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni _createOperatorSet(1); uint256 expiry = type(uint256).max; (uint8 v, bytes32 r, bytes32 s) = cheats.sign( - delegationSignerPrivateKey, avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), operatorSetIds[0], salt2, expiry) + delegationSignerPrivateKey, + avsDirectory.calculateOperatorSetRegistrationDigestHash(address(this), operatorSetIds[0], salt2, expiry) ); avsDirectory.registerOperatorToOperatorSets( - operator, operatorSetIds[0], ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt2, expiry) + operator, + operatorSetIds[0], + ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt2, expiry) ); // Revert @@ -891,7 +1003,7 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); } - function testFuzz_correctness(bytes32 salt) public { + function testFuzz_Correctness(bytes32 salt) public { // Register Operator to M2 address operator = cheats.addr(delegationSignerPrivateKey); _registerOperatorLegacyM2(delegationSignerPrivateKey, salt); @@ -911,7 +1023,9 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni cheats.expectEmit(true, true, true, true, address(avsDirectory)); emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), 1)); cheats.expectEmit(true, true, true, true, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated(operator, address(this), IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + emit OperatorAVSRegistrationStatusUpdated( + operator, address(this), IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); cheats.expectEmit(true, true, true, true, address(avsDirectory)); emit OperatorMigratedToOperatorSets(operator, address(this), operatorSetIds[0]); @@ -920,10 +1034,19 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni // Checks assertTrue(avsDirectory.isMember(address(this), operator, 1)); - assertTrue(avsDirectory.avsOperatorStatus(address(this), operator) == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + assertTrue( + avsDirectory.avsOperatorStatus(address(this), operator) + == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); + assertEq(avsDirectory.operatorSetMemberCount(address(this), 1), 1); } - function testFuzz_correctness_multiple(uint256 privateKey, uint8 numOperators, bytes32 salt, uint8 numOids) public { + function testFuzz_correctness_multiple( + uint256 privateKey, + uint8 numOperators, + bytes32 salt, + uint8 numOids + ) public { // Create Operator Set IDs uint32[] memory oids = new uint32[](numOids); for (uint32 i = 0; i < numOids; i++) { @@ -934,7 +1057,7 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni privateKey = bound(privateKey, 1, MAX_PRIVATE_KEY - numOperators); operators = new address[](numOperators); operatorSetIds = new uint32[][](numOperators); - for (uint i = 0; i < numOperators; i++) { + for (uint256 i = 0; i < numOperators; i++) { _registerOperatorLegacyM2(privateKey + i, salt); operators[i] = cheats.addr(privateKey + i); operatorSetIds[i] = oids; @@ -945,13 +1068,15 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni _createOperatorSets(oids); // Expect Emits - for (uint i = 0; i < numOperators; i++) { - for (uint j = 0; j < oids.length; j++) { + for (uint256 i = 0; i < numOperators; i++) { + for (uint256 j = 0; j < oids.length; j++) { cheats.expectEmit(true, true, true, true, address(avsDirectory)); emit OperatorAddedToOperatorSet(operators[i], IAVSDirectory.OperatorSet(address(this), oids[j])); } cheats.expectEmit(true, true, true, true, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated(operators[i], address(this), IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + emit OperatorAVSRegistrationStatusUpdated( + operators[i], address(this), IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); cheats.expectEmit(true, true, true, true, address(avsDirectory)); emit OperatorMigratedToOperatorSets(operators[i], address(this), operatorSetIds[i]); } @@ -960,11 +1085,14 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); // Checks - for (uint i = 0; i < numOperators; i++) { - for (uint j = 0; j < oids.length; j++) { + for (uint256 i = 0; i < numOperators; i++) { + for (uint256 j = 0; j < oids.length; j++) { assertTrue(avsDirectory.isMember(address(this), operators[i], oids[j])); } - assertTrue(avsDirectory.avsOperatorStatus(address(this), operators[i]) == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + assertTrue( + avsDirectory.avsOperatorStatus(address(this), operators[i]) + == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); } } @@ -1013,12 +1141,17 @@ contract AVSDirectoryUnitTests_legacyOperatorAVSRegistration is AVSDirectoryUnit avsDirectory.registerOperatorToAVS(operator, operatorSignature); cheats.expectEmit(true, true, true, true, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated(operator, defaultAVS, IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + emit OperatorAVSRegistrationStatusUpdated( + operator, defaultAVS, IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); cheats.prank(defaultAVS); avsDirectory.deregisterOperatorFromAVS(operator); - assertTrue(avsDirectory.avsOperatorStatus(defaultAVS, operator) == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED); + assertTrue( + avsDirectory.avsOperatorStatus(defaultAVS, operator) + == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED + ); } // @notice Tests that an avs who calls `updateAVSMetadataURI` will correctly see an `AVSMetadataURIUpdated` event emitted with their input @@ -1056,7 +1189,9 @@ contract AVSDirectoryUnitTests_legacyOperatorAVSRegistration is AVSDirectoryUnit _registerOperatorWithBaseDetails(operator); cheats.expectEmit(true, true, true, true, address(avsDirectory)); - emit OperatorAVSRegistrationStatusUpdated(operator, defaultAVS, IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED); + emit OperatorAVSRegistrationStatusUpdated( + operator, defaultAVS, IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED + ); uint256 expiry = type(uint256).max; @@ -1066,7 +1201,10 @@ contract AVSDirectoryUnitTests_legacyOperatorAVSRegistration is AVSDirectoryUnit avsDirectory.registerOperatorToAVS(operator, operatorSignature); - assertTrue(avsDirectory.avsOperatorStatus(defaultAVS, operator) == IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED); + assertTrue( + avsDirectory.avsOperatorStatus(defaultAVS, operator) + == IAVSDirectory.OperatorAVSRegistrationStatus.REGISTERED + ); } // @notice Verifies an operator registers successfull to avs and see an `OperatorAVSRegistrationStatusUpdated` event emitted From d6da053f89bd52d2ca7b6c6ac1a2f160f5e7b9f1 Mon Sep 17 00:00:00 2001 From: Yash Patil <40046473+ypatil12@users.noreply.github.com> Date: Thu, 8 Aug 2024 01:58:51 -0400 Subject: [PATCH 26/43] feat: operator set rewards (#663) * feat: operator set rewards * chore: forge fmt * feat: add operator set retroactive length & genesis timestamp * docs: add deprecation note and fix typo * build: bindings * feat: add tests * chore: bindings --------- Co-authored-by: clandestine.eth <96172957+0xClandestine@users.noreply.github.com> Co-authored-by: Michael Sun --- pkg/bindings/AVSDirectory/binding.go | 2 +- pkg/bindings/IAVSDirectory/binding.go | 69 +++ pkg/bindings/IRewardsCoordinator/binding.go | 197 +++++++- pkg/bindings/RewardsCoordinator/binding.go | 296 +++++++++++- .../RewardsCoordinatorStorage/binding.go | 290 +++++++++++- ...loy_RewardsCoordinator.holesky.config.json | 4 +- .../Deploy_Test_RewardsCoordinator.s.sol | 10 +- script/utils/ExistingDeploymentParser.sol | 8 + src/contracts/core/RewardsCoordinator.sol | 128 +++++- .../core/RewardsCoordinatorStorage.sol | 48 +- src/contracts/interfaces/IAVSDirectory.sol | 4 + .../interfaces/IRewardsCoordinator.sol | 56 ++- src/test/events/IRewardsCoordinatorEvents.sol | 8 + src/test/mocks/AVSDirectoryMock.sol | 83 ++++ src/test/unit/RewardsCoordinatorUnit.t.sol | 428 +++++++++++++++++- src/test/utils/EigenLayerUnitTestSetup.sol | 3 + 16 files changed, 1587 insertions(+), 47 deletions(-) create mode 100644 src/test/mocks/AVSDirectoryMock.sol diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 5f3e701fd..66c6794a9 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -45,7 +45,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b50604051620037e8380380620037e8833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161366a6200017e6000396000611fdb015260008181610540015281816109bc01526111ea015261366a6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c8063955e669611610125578063c825fe68116100ad578063ec76f4421161007c578063ec76f44214610562578063ef2dfa8d14610596578063f2fde38b146105a9578063f698da25146105bc578063fabc1cbc146105c457600080fd5b8063c825fe68146104c6578063d79aceab146104ed578063dce974b914610514578063df5cf7231461053b57600080fd5b8063a98fb355116100f4578063a98fb35514610472578063aec205c514610485578063afe02ed51461048d578063b2841d48146104a0578063c1a8e2c5146104b357600080fd5b8063955e6696146104265780639926ee7d14610439578063a1060c881461044c578063a364f4da1461045f57600080fd5b806349075da3116101a8578063715018a611610177578063715018a6146103915780637673e93a1461039957806384d76f7b146103bc578063886f1195146103ea5780638da5cb5b1461041557600080fd5b806349075da314610323578063595c6a671461035e5780635ac86ab7146103665780635c975abb1461038957600080fd5b806320606b70116101e457806320606b7014610264578063374823b51461029e5780633c4385d0146102dc5780633fee332d1461031057600080fd5b806310d67a2f14610216578063136439dd1461022b5780631794bb3c1461023e5780631e2199e214610251575b600080fd5b610229610224366004612bfb565b6105d7565b005b610229610239366004612c1f565b610693565b61022961024c366004612c38565b6107d2565b61022961025f366004612ddd565b6108fc565b61028b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6102cc6102ac366004612e58565b609960209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610295565b6102cc6102ea366004612e9d565b609c60209081526000938452604080852082529284528284209052825290205460ff1681565b61022961031e366004612ee4565b610c1c565b610351610331366004612f72565b609860209081526000928352604080842090915290825290205460ff1681565b6040516102959190612fc1565b610229610e66565b6102cc610374366004612fe9565b606654600160ff9092169190911b9081161490565b60665461028b565b610229610f2d565b6102cc6103a7366004612bfb565b609a6020526000908152604090205460ff1681565b6102cc6103ca36600461300c565b609b60209081526000928352604080842090915290825290205460ff1681565b6065546103fd906001600160a01b031681565b6040516001600160a01b039091168152602001610295565b6033546001600160a01b03166103fd565b61028b610434366004613041565b610f41565b6102296104473660046130a7565b610fa6565b61028b61045a3660046130f6565b611374565b61022961046d366004612bfb565b6113de565b61022961048036600461313c565b61151b565b610229611562565b61022961049b3660046131ad565b61162a565b61028b6104ae366004613041565b6117f7565b6102296104c13660046131ee565b611837565b61028b7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61028b7fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b61028b7f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b6103fd7f000000000000000000000000000000000000000000000000000000000000000081565b610229610570366004612c1f565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b6102296105a4366004613242565b61186c565b6102296105b7366004612bfb565b611c15565b61028b611c8b565b6102296105d2366004612c1f565b611c9a565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e91906132ad565b6001600160a01b0316336001600160a01b0316146106875760405162461bcd60e51b815260040161067e906132ca565b60405180910390fd5b61069081611df6565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ff9190613314565b61071b5760405162461bcd60e51b815260040161067e90613336565b606654818116146107945760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161067e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156107f25750600054600160ff909116105b8061080c5750303b15801561080c575060005460ff166001145b61086f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161067e565b6000805460ff191660011790558015610892576000805461ff0019166101001790555b61089c8383611eed565b6108a4611fd7565b6097556108b0846120a0565b80156108f6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b606654600090600190811614156109255760405162461bcd60e51b815260040161067e9061337e565b428260400151101561099d5760405162461bcd60e51b815260206004820152604760248201526000805160206135f583398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a40161067e565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a279190613314565b610aa65760405162461bcd60e51b815260206004820152605660248201526000805160206135f583398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a40161067e565b336000908152609a602052604090205460ff16610b2d5760405162461bcd60e51b815260206004820152604b60248201526000805160206135f583398151915260448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a40161067e565b6001600160a01b038516600090815260996020908152604080832085830151845290915290205460ff1615610bb85760405162461bcd60e51b815260206004820152603f60248201526000805160206135f583398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e7400606482015260840161067e565b610bd885610bd133878787602001518860400151610f41565b84516120f2565b6001600160a01b03851660009081526099602090815260408083208583015184529091529020805460ff19166001179055610c15338686866122ac565b5050505050565b60665460009060019081161415610c455760405162461bcd60e51b815260040161067e9061337e565b815151610cdd57336001600160a01b03871614610cd85760405162461bcd60e51b815260206004820152604560248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2063616c6c6572206d757374206265206f70656064820152643930ba37b960d91b608482015260a40161067e565b610e52565b4282604001511015610d685760405162461bcd60e51b815260206004820152604860248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a206f70657261746f72207369676e617475726560648201526708195e1c1a5c995960c21b608482015260a40161067e565b6001600160a01b038616600090815260996020908152604080832085830151845290915290205460ff1615610e07576040805162461bcd60e51b81526020600482015260248101919091527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2073616c7420616c7265616479207370656e74606482015260840161067e565b610e2086610bd1878787876020015188604001516117f7565b6001600160a01b03861660009081526099602090815260408083208583015184529091529020805460ff191660011790555b610e5e858786866125ab565b505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613314565b610eee5760405162461bcd60e51b815260040161067e90613336565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f356127d0565b610f3f60006120a0565b565b6000610f9c7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610f81969594939291906133f9565b6040516020818303038152906040528051906020012061282a565b9695505050505050565b60665460009060019081161415610fcf5760405162461bcd60e51b815260040161067e9061337e565b42826040015110156110375760405162461bcd60e51b815260206004820152603e602482015260008051602061361583398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161067e565b336000908152609a602052604090205460ff16156110ab5760405162461bcd60e51b815260206004820152603e602482015260008051602061361583398151915260448201527f56533a2041565320697320616e206f70657261746f7220736574204156530000606482015260840161067e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156110e5576110e5612fab565b14156111475760405162461bcd60e51b815260206004820152603f602482015260008051602061361583398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161067e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156111cb5760405162461bcd60e51b815260206004820152603660248201526000805160206136158339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161067e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112559190613314565b6112cb5760405162461bcd60e51b815260206004820152604d602482015260008051602061361583398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161067e565b6112e383610bd1853386602001518760400151611374565b6001600160a01b038316600081815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916113679190612fc1565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290526000906113d59060c001610f81565b95945050505050565b606654600090600190811614156114075760405162461bcd60e51b815260040161067e9061337e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561144157611441612fab565b146114b45760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161067e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161150f9190612fc1565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051611556929190613439565b60405180910390a25050565b336000908152609a602052604090205460ff16156115e85760405162461bcd60e51b815260206004820152603e60248201527f4156534469726563746f72792e6265636f6d654f70657261746f72536574415660448201527f533a20616c726561647920616e206f70657261746f7220736574204156530000606482015260840161067e565b336000818152609a6020526040808220805460ff19166001179055517f702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf9190a2565b60005b818110156117f257336000908152609b602052604081209084848481811061165757611657613468565b905060200201602081019061166c919061347e565b63ffffffff16815260208101919091526040016000205460ff16156116f95760405162461bcd60e51b815260206004820152603b60248201527f4156534469726563746f72792e6372656174654f70657261746f725365743a2060448201527f6f70657261746f722073657420616c7265616479206578697374730000000000606482015260840161067e565b336000908152609b6020526040812060019185858581811061171d5761171d613468565b9050602002016020810190611732919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280336001600160a01b031681526020018585858181106117b0576117b0613468565b90506020020160208101906117c5919061347e565b63ffffffff1690526040516117da9190613499565b60405180910390a16117eb816134d5565b905061162d565b505050565b6000610f9c7f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958787878787604051602001610f81969594939291906133f9565b606654600090600190811614156118605760405162461bcd60e51b815260040161067e9061337e565b6108f6338585856125ab565b606654600090600190811614156118955760405162461bcd60e51b815260040161067e9061337e565b336000908152609a602052604090205460ff1661192e5760405162461bcd60e51b815260206004820152604b60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a40161067e565b60005b84811015610e5e5760013360009081526098602052604081209088888581811061195d5761195d613468565b90506020020160208101906119729190612bfb565b6001600160a01b0316815260208101919091526040016000205460ff1660018111156119a0576119a0612fab565b14611a4c5760405162461bcd60e51b815260206004820152606a60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a206f70657261746f7220616c7265616479206d6960648201527f677261746564206f72206e6f742061206c656761637920726567697374657265608482015269321037b832b930ba37b960b11b60a482015260c40161067e565b611aa033878784818110611a6257611a62613468565b9050602002016020810190611a779190612bfb565b868685818110611a8957611a89613468565b9050602002810190611a9b91906134f0565b6122ac565b33600090815260986020526040812081888885818110611ac257611ac2613468565b9050602002016020810190611ad79190612bfb565b6001600160a01b031681526020810191909152604001600020805460ff191660018381811115611b0957611b09612fab565b021790555033868683818110611b2157611b21613468565b9050602002016020810190611b369190612bfb565b6001600160a01b03167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416000604051611b6f9190612fc1565b60405180910390a333868683818110611b8a57611b8a613468565b9050602002016020810190611b9f9190612bfb565b6001600160a01b03167f54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01868685818110611bdb57611bdb613468565b9050602002810190611bed91906134f0565b604051611bfb929190613539565b60405180910390a380611c0d816134d5565b915050611931565b611c1d6127d0565b6001600160a01b038116611c825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067e565b610690816120a0565b6000611c95611fd7565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1191906132ad565b6001600160a01b0316336001600160a01b031614611d415760405162461bcd60e51b815260040161067e906132ca565b606654198119606654191614611dbf5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161067e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107c7565b6001600160a01b038116611e845760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161067e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316158015611f0e57506001600160a01b03821615155b611f905760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161067e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611fd382611df6565b5050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612008575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561220c57604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906121329086908690600401613555565b602060405180830381865afa15801561214f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217391906135b2565b6001600160e01b031916146117f25760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161067e565b826001600160a01b03166122208383612871565b6001600160a01b0316146117f25760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161067e565b60005b81811015610c15576001600160a01b0385166000908152609b60205260408120908484848181106122e2576122e2613468565b90506020020160208101906122f7919061347e565b63ffffffff16815260208101919091526040016000205460ff1661238e5760405162461bcd60e51b815260206004820152604260248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a20696e76616c6964206f70657261746f722073606482015261195d60f21b608482015260a40161067e565b6001600160a01b038086166000908152609c602090815260408083209388168352929052908120908484848181106123c8576123c8613468565b90506020020160208101906123dd919061347e565b63ffffffff16815260208101919091526040016000205460ff16156124905760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a206f70657261746f7220616c7265616479207260648201527f65676973746572656420746f206f70657261746f722073657400000000000000608482015260a40161067e565b6001600160a01b038086166000908152609c6020908152604080832093881683529290529081206001918585858181106124cc576124cc613468565b90506020020160208101906124e1919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e6040518060400160405280886001600160a01b0316815260200186868681811061256957612569613468565b905060200201602081019061257e919061347e565b63ffffffff1690526040516125939190613499565b60405180910390a26125a4816134d5565b90506122af565b60005b81811015610c15576001600160a01b038086166000908152609c602090815260408083209388168352929052908120908484848181106125f0576125f0613468565b9050602002016020810190612605919061347e565b63ffffffff16815260208101919091526040016000205460ff166126b75760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f646572656769737465724f70657261746f7260448201527f46726f6d4f70657261746f725365743a206f70657261746f72206e6f7420726560648201527f676973746572656420666f72206f70657261746f722073657400000000000000608482015260a40161067e565b6001600160a01b038086166000908152609c602090815260408083209388168352929052908120818585858181106126f1576126f1613468565b9050602002016020810190612706919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe6040518060400160405280886001600160a01b0316815260200186868681811061278e5761278e613468565b90506020020160208101906127a3919061347e565b63ffffffff1690526040516127b89190613499565b60405180910390a26127c9816134d5565b90506125ae565b6033546001600160a01b03163314610f3f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b6000612834611fd7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60008060006128808585612895565b9150915061288d81612905565b509392505050565b6000808251604114156128cc5760208301516040840151606085015160001a6128c087828585612ac0565b945094505050506128fe565b8251604014156128f657602083015160408401516128eb868383612bad565b9350935050506128fe565b506000905060025b9250929050565b600081600481111561291957612919612fab565b14156129225750565b600181600481111561293657612936612fab565b14156129845760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161067e565b600281600481111561299857612998612fab565b14156129e65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161067e565b60038160048111156129fa576129fa612fab565b1415612a535760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161067e565b6004816004811115612a6757612a67612fab565b14156106905760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161067e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612af75750600090506003612ba4565b8460ff16601b14158015612b0f57508460ff16601c14155b15612b205750600090506004612ba4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612b74573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b9d57600060019250925050612ba4565b9150600090505b94509492505050565b6000806001600160ff1b03831681612bca60ff86901c601b6135dc565b9050612bd887828885612ac0565b935093505050935093915050565b6001600160a01b038116811461069057600080fd5b600060208284031215612c0d57600080fd5b8135612c1881612be6565b9392505050565b600060208284031215612c3157600080fd5b5035919050565b600080600060608486031215612c4d57600080fd5b8335612c5881612be6565b92506020840135612c6881612be6565b929592945050506040919091013590565b60008083601f840112612c8b57600080fd5b5081356001600160401b03811115612ca257600080fd5b6020830191508360208260051b85010111156128fe57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612cf557612cf5612cbd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d2357612d23612cbd565b604052919050565b600060608284031215612d3d57600080fd5b612d45612cd3565b905081356001600160401b0380821115612d5e57600080fd5b818401915084601f830112612d7257600080fd5b8135602082821115612d8657612d86612cbd565b612d98601f8301601f19168201612cfb565b92508183528681838601011115612dae57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b60008060008060608587031215612df357600080fd5b8435612dfe81612be6565b935060208501356001600160401b0380821115612e1a57600080fd5b612e2688838901612c79565b90955093506040870135915080821115612e3f57600080fd5b50612e4c87828801612d2b565b91505092959194509250565b60008060408385031215612e6b57600080fd5b8235612e7681612be6565b946020939093013593505050565b803563ffffffff81168114612e9857600080fd5b919050565b600080600060608486031215612eb257600080fd5b8335612ebd81612be6565b92506020840135612ecd81612be6565b9150612edb60408501612e84565b90509250925092565b600080600080600060808688031215612efc57600080fd5b8535612f0781612be6565b94506020860135612f1781612be6565b935060408601356001600160401b0380821115612f3357600080fd5b612f3f89838a01612c79565b90955093506060880135915080821115612f5857600080fd5b50612f6588828901612d2b565b9150509295509295909350565b60008060408385031215612f8557600080fd5b8235612f9081612be6565b91506020830135612fa081612be6565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b6020810160028310612fe357634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215612ffb57600080fd5b813560ff81168114612c1857600080fd5b6000806040838503121561301f57600080fd5b823561302a81612be6565b915061303860208401612e84565b90509250929050565b60008060008060006080868803121561305957600080fd5b853561306481612be6565b945060208601356001600160401b0381111561307f57600080fd5b61308b88828901612c79565b9699909850959660408101359660609091013595509350505050565b600080604083850312156130ba57600080fd5b82356130c581612be6565b915060208301356001600160401b038111156130e057600080fd5b6130ec85828601612d2b565b9150509250929050565b6000806000806080858703121561310c57600080fd5b843561311781612be6565b9350602085013561312781612be6565b93969395505050506040820135916060013590565b6000806020838503121561314f57600080fd5b82356001600160401b038082111561316657600080fd5b818501915085601f83011261317a57600080fd5b81358181111561318957600080fd5b86602082850101111561319b57600080fd5b60209290920196919550909350505050565b600080602083850312156131c057600080fd5b82356001600160401b038111156131d657600080fd5b6131e285828601612c79565b90969095509350505050565b60008060006040848603121561320357600080fd5b833561320e81612be6565b925060208401356001600160401b0381111561322957600080fd5b61323586828701612c79565b9497909650939450505050565b6000806000806040858703121561325857600080fd5b84356001600160401b038082111561326f57600080fd5b61327b88838901612c79565b9096509450602087013591508082111561329457600080fd5b506132a187828801612c79565b95989497509550505050565b6000602082840312156132bf57600080fd5b8151612c1881612be6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561332657600080fd5b81518015158114612c1857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b8183526000602080850194508260005b858110156133ee5763ffffffff6133db83612e84565b16875295820195908201906001016133c5565b509495945050505050565b8681526001600160a01b038616602082015260a06040820181905260009061342490830186886133b5565b60608301949094525060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561349057600080fd5b612c1882612e84565b81516001600160a01b0316815260209182015163ffffffff169181019190915260400190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156134e9576134e96134bf565b5060010190565b6000808335601e1984360301811261350757600080fd5b8301803591506001600160401b0382111561352157600080fd5b6020019150600581901b36038213156128fe57600080fd5b60208152600061354d6020830184866133b5565b949350505050565b82815260006020604081840152835180604085015260005b818110156135895785810183015185820160600152820161356d565b8181111561359b576000606083870101525b50601f01601f191692909201606001949350505050565b6000602082840312156135c457600080fd5b81516001600160e01b031981168114612c1857600080fd5b600082198211156135ef576135ef6134bf565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f4156534469726563746f72792e72656769737465724f70657261746f72546f41a264697066735822122063fbd7f23a7f01883d56cd6404863ff2529ad2cd773cd1eaa3d3a029dab146d364736f6c634300080c0033", + Bin: "0x60c06040523480156200001157600080fd5b50604051620037e8380380620037e8833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161366a6200017e6000396000611fdb015260008181610540015281816109bc01526111ea015261366a6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c8063955e669611610125578063c825fe68116100ad578063ec76f4421161007c578063ec76f44214610562578063ef2dfa8d14610596578063f2fde38b146105a9578063f698da25146105bc578063fabc1cbc146105c457600080fd5b8063c825fe68146104c6578063d79aceab146104ed578063dce974b914610514578063df5cf7231461053b57600080fd5b8063a98fb355116100f4578063a98fb35514610472578063aec205c514610485578063afe02ed51461048d578063b2841d48146104a0578063c1a8e2c5146104b357600080fd5b8063955e6696146104265780639926ee7d14610439578063a1060c881461044c578063a364f4da1461045f57600080fd5b806349075da3116101a8578063715018a611610177578063715018a6146103915780637673e93a1461039957806384d76f7b146103bc578063886f1195146103ea5780638da5cb5b1461041557600080fd5b806349075da314610323578063595c6a671461035e5780635ac86ab7146103665780635c975abb1461038957600080fd5b806320606b70116101e457806320606b7014610264578063374823b51461029e5780633c4385d0146102dc5780633fee332d1461031057600080fd5b806310d67a2f14610216578063136439dd1461022b5780631794bb3c1461023e5780631e2199e214610251575b600080fd5b610229610224366004612bfb565b6105d7565b005b610229610239366004612c1f565b610693565b61022961024c366004612c38565b6107d2565b61022961025f366004612ddd565b6108fc565b61028b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6102cc6102ac366004612e58565b609960209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610295565b6102cc6102ea366004612e9d565b609c60209081526000938452604080852082529284528284209052825290205460ff1681565b61022961031e366004612ee4565b610c1c565b610351610331366004612f72565b609860209081526000928352604080842090915290825290205460ff1681565b6040516102959190612fc1565b610229610e66565b6102cc610374366004612fe9565b606654600160ff9092169190911b9081161490565b60665461028b565b610229610f2d565b6102cc6103a7366004612bfb565b609a6020526000908152604090205460ff1681565b6102cc6103ca36600461300c565b609b60209081526000928352604080842090915290825290205460ff1681565b6065546103fd906001600160a01b031681565b6040516001600160a01b039091168152602001610295565b6033546001600160a01b03166103fd565b61028b610434366004613041565b610f41565b6102296104473660046130a7565b610fa6565b61028b61045a3660046130f6565b611374565b61022961046d366004612bfb565b6113de565b61022961048036600461313c565b61151b565b610229611562565b61022961049b3660046131ad565b61162a565b61028b6104ae366004613041565b6117f7565b6102296104c13660046131ee565b611837565b61028b7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61028b7fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b61028b7f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b6103fd7f000000000000000000000000000000000000000000000000000000000000000081565b610229610570366004612c1f565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b6102296105a4366004613242565b61186c565b6102296105b7366004612bfb565b611c15565b61028b611c8b565b6102296105d2366004612c1f565b611c9a565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e91906132ad565b6001600160a01b0316336001600160a01b0316146106875760405162461bcd60e51b815260040161067e906132ca565b60405180910390fd5b61069081611df6565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ff9190613314565b61071b5760405162461bcd60e51b815260040161067e90613336565b606654818116146107945760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161067e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156107f25750600054600160ff909116105b8061080c5750303b15801561080c575060005460ff166001145b61086f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161067e565b6000805460ff191660011790558015610892576000805461ff0019166101001790555b61089c8383611eed565b6108a4611fd7565b6097556108b0846120a0565b80156108f6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b606654600090600190811614156109255760405162461bcd60e51b815260040161067e9061337e565b428260400151101561099d5760405162461bcd60e51b815260206004820152604760248201526000805160206135f583398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a40161067e565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a279190613314565b610aa65760405162461bcd60e51b815260206004820152605660248201526000805160206135f583398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a40161067e565b336000908152609a602052604090205460ff16610b2d5760405162461bcd60e51b815260206004820152604b60248201526000805160206135f583398151915260448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a40161067e565b6001600160a01b038516600090815260996020908152604080832085830151845290915290205460ff1615610bb85760405162461bcd60e51b815260206004820152603f60248201526000805160206135f583398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e7400606482015260840161067e565b610bd885610bd133878787602001518860400151610f41565b84516120f2565b6001600160a01b03851660009081526099602090815260408083208583015184529091529020805460ff19166001179055610c15338686866122ac565b5050505050565b60665460009060019081161415610c455760405162461bcd60e51b815260040161067e9061337e565b815151610cdd57336001600160a01b03871614610cd85760405162461bcd60e51b815260206004820152604560248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2063616c6c6572206d757374206265206f70656064820152643930ba37b960d91b608482015260a40161067e565b610e52565b4282604001511015610d685760405162461bcd60e51b815260206004820152604860248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a206f70657261746f72207369676e617475726560648201526708195e1c1a5c995960c21b608482015260a40161067e565b6001600160a01b038616600090815260996020908152604080832085830151845290915290205460ff1615610e07576040805162461bcd60e51b81526020600482015260248101919091527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2073616c7420616c7265616479207370656e74606482015260840161067e565b610e2086610bd1878787876020015188604001516117f7565b6001600160a01b03861660009081526099602090815260408083208583015184529091529020805460ff191660011790555b610e5e858786866125ab565b505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613314565b610eee5760405162461bcd60e51b815260040161067e90613336565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f356127d0565b610f3f60006120a0565b565b6000610f9c7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610f81969594939291906133f9565b6040516020818303038152906040528051906020012061282a565b9695505050505050565b60665460009060019081161415610fcf5760405162461bcd60e51b815260040161067e9061337e565b42826040015110156110375760405162461bcd60e51b815260206004820152603e602482015260008051602061361583398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161067e565b336000908152609a602052604090205460ff16156110ab5760405162461bcd60e51b815260206004820152603e602482015260008051602061361583398151915260448201527f56533a2041565320697320616e206f70657261746f7220736574204156530000606482015260840161067e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156110e5576110e5612fab565b14156111475760405162461bcd60e51b815260206004820152603f602482015260008051602061361583398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161067e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156111cb5760405162461bcd60e51b815260206004820152603660248201526000805160206136158339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161067e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112559190613314565b6112cb5760405162461bcd60e51b815260206004820152604d602482015260008051602061361583398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161067e565b6112e383610bd1853386602001518760400151611374565b6001600160a01b038316600081815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916113679190612fc1565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290526000906113d59060c001610f81565b95945050505050565b606654600090600190811614156114075760405162461bcd60e51b815260040161067e9061337e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561144157611441612fab565b146114b45760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161067e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161150f9190612fc1565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051611556929190613439565b60405180910390a25050565b336000908152609a602052604090205460ff16156115e85760405162461bcd60e51b815260206004820152603e60248201527f4156534469726563746f72792e6265636f6d654f70657261746f72536574415660448201527f533a20616c726561647920616e206f70657261746f7220736574204156530000606482015260840161067e565b336000818152609a6020526040808220805460ff19166001179055517f702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf9190a2565b60005b818110156117f257336000908152609b602052604081209084848481811061165757611657613468565b905060200201602081019061166c919061347e565b63ffffffff16815260208101919091526040016000205460ff16156116f95760405162461bcd60e51b815260206004820152603b60248201527f4156534469726563746f72792e6372656174654f70657261746f725365743a2060448201527f6f70657261746f722073657420616c7265616479206578697374730000000000606482015260840161067e565b336000908152609b6020526040812060019185858581811061171d5761171d613468565b9050602002016020810190611732919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280336001600160a01b031681526020018585858181106117b0576117b0613468565b90506020020160208101906117c5919061347e565b63ffffffff1690526040516117da9190613499565b60405180910390a16117eb816134d5565b905061162d565b505050565b6000610f9c7f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958787878787604051602001610f81969594939291906133f9565b606654600090600190811614156118605760405162461bcd60e51b815260040161067e9061337e565b6108f6338585856125ab565b606654600090600190811614156118955760405162461bcd60e51b815260040161067e9061337e565b336000908152609a602052604090205460ff1661192e5760405162461bcd60e51b815260206004820152604b60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a40161067e565b60005b84811015610e5e5760013360009081526098602052604081209088888581811061195d5761195d613468565b90506020020160208101906119729190612bfb565b6001600160a01b0316815260208101919091526040016000205460ff1660018111156119a0576119a0612fab565b14611a4c5760405162461bcd60e51b815260206004820152606a60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a206f70657261746f7220616c7265616479206d6960648201527f677261746564206f72206e6f742061206c656761637920726567697374657265608482015269321037b832b930ba37b960b11b60a482015260c40161067e565b611aa033878784818110611a6257611a62613468565b9050602002016020810190611a779190612bfb565b868685818110611a8957611a89613468565b9050602002810190611a9b91906134f0565b6122ac565b33600090815260986020526040812081888885818110611ac257611ac2613468565b9050602002016020810190611ad79190612bfb565b6001600160a01b031681526020810191909152604001600020805460ff191660018381811115611b0957611b09612fab565b021790555033868683818110611b2157611b21613468565b9050602002016020810190611b369190612bfb565b6001600160a01b03167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416000604051611b6f9190612fc1565b60405180910390a333868683818110611b8a57611b8a613468565b9050602002016020810190611b9f9190612bfb565b6001600160a01b03167f54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01868685818110611bdb57611bdb613468565b9050602002810190611bed91906134f0565b604051611bfb929190613539565b60405180910390a380611c0d816134d5565b915050611931565b611c1d6127d0565b6001600160a01b038116611c825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067e565b610690816120a0565b6000611c95611fd7565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1191906132ad565b6001600160a01b0316336001600160a01b031614611d415760405162461bcd60e51b815260040161067e906132ca565b606654198119606654191614611dbf5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161067e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107c7565b6001600160a01b038116611e845760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161067e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316158015611f0e57506001600160a01b03821615155b611f905760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161067e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611fd382611df6565b5050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612008575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561220c57604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906121329086908690600401613555565b602060405180830381865afa15801561214f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217391906135b2565b6001600160e01b031916146117f25760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161067e565b826001600160a01b03166122208383612871565b6001600160a01b0316146117f25760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161067e565b60005b81811015610c15576001600160a01b0385166000908152609b60205260408120908484848181106122e2576122e2613468565b90506020020160208101906122f7919061347e565b63ffffffff16815260208101919091526040016000205460ff1661238e5760405162461bcd60e51b815260206004820152604260248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a20696e76616c6964206f70657261746f722073606482015261195d60f21b608482015260a40161067e565b6001600160a01b038086166000908152609c602090815260408083209388168352929052908120908484848181106123c8576123c8613468565b90506020020160208101906123dd919061347e565b63ffffffff16815260208101919091526040016000205460ff16156124905760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a206f70657261746f7220616c7265616479207260648201527f65676973746572656420746f206f70657261746f722073657400000000000000608482015260a40161067e565b6001600160a01b038086166000908152609c6020908152604080832093881683529290529081206001918585858181106124cc576124cc613468565b90506020020160208101906124e1919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e6040518060400160405280886001600160a01b0316815260200186868681811061256957612569613468565b905060200201602081019061257e919061347e565b63ffffffff1690526040516125939190613499565b60405180910390a26125a4816134d5565b90506122af565b60005b81811015610c15576001600160a01b038086166000908152609c602090815260408083209388168352929052908120908484848181106125f0576125f0613468565b9050602002016020810190612605919061347e565b63ffffffff16815260208101919091526040016000205460ff166126b75760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f646572656769737465724f70657261746f7260448201527f46726f6d4f70657261746f725365743a206f70657261746f72206e6f7420726560648201527f676973746572656420666f72206f70657261746f722073657400000000000000608482015260a40161067e565b6001600160a01b038086166000908152609c602090815260408083209388168352929052908120818585858181106126f1576126f1613468565b9050602002016020810190612706919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe6040518060400160405280886001600160a01b0316815260200186868681811061278e5761278e613468565b90506020020160208101906127a3919061347e565b63ffffffff1690526040516127b89190613499565b60405180910390a26127c9816134d5565b90506125ae565b6033546001600160a01b03163314610f3f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b6000612834611fd7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60008060006128808585612895565b9150915061288d81612905565b509392505050565b6000808251604114156128cc5760208301516040840151606085015160001a6128c087828585612ac0565b945094505050506128fe565b8251604014156128f657602083015160408401516128eb868383612bad565b9350935050506128fe565b506000905060025b9250929050565b600081600481111561291957612919612fab565b14156129225750565b600181600481111561293657612936612fab565b14156129845760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161067e565b600281600481111561299857612998612fab565b14156129e65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161067e565b60038160048111156129fa576129fa612fab565b1415612a535760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161067e565b6004816004811115612a6757612a67612fab565b14156106905760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161067e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612af75750600090506003612ba4565b8460ff16601b14158015612b0f57508460ff16601c14155b15612b205750600090506004612ba4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612b74573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b9d57600060019250925050612ba4565b9150600090505b94509492505050565b6000806001600160ff1b03831681612bca60ff86901c601b6135dc565b9050612bd887828885612ac0565b935093505050935093915050565b6001600160a01b038116811461069057600080fd5b600060208284031215612c0d57600080fd5b8135612c1881612be6565b9392505050565b600060208284031215612c3157600080fd5b5035919050565b600080600060608486031215612c4d57600080fd5b8335612c5881612be6565b92506020840135612c6881612be6565b929592945050506040919091013590565b60008083601f840112612c8b57600080fd5b5081356001600160401b03811115612ca257600080fd5b6020830191508360208260051b85010111156128fe57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612cf557612cf5612cbd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d2357612d23612cbd565b604052919050565b600060608284031215612d3d57600080fd5b612d45612cd3565b905081356001600160401b0380821115612d5e57600080fd5b818401915084601f830112612d7257600080fd5b8135602082821115612d8657612d86612cbd565b612d98601f8301601f19168201612cfb565b92508183528681838601011115612dae57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b60008060008060608587031215612df357600080fd5b8435612dfe81612be6565b935060208501356001600160401b0380821115612e1a57600080fd5b612e2688838901612c79565b90955093506040870135915080821115612e3f57600080fd5b50612e4c87828801612d2b565b91505092959194509250565b60008060408385031215612e6b57600080fd5b8235612e7681612be6565b946020939093013593505050565b803563ffffffff81168114612e9857600080fd5b919050565b600080600060608486031215612eb257600080fd5b8335612ebd81612be6565b92506020840135612ecd81612be6565b9150612edb60408501612e84565b90509250925092565b600080600080600060808688031215612efc57600080fd5b8535612f0781612be6565b94506020860135612f1781612be6565b935060408601356001600160401b0380821115612f3357600080fd5b612f3f89838a01612c79565b90955093506060880135915080821115612f5857600080fd5b50612f6588828901612d2b565b9150509295509295909350565b60008060408385031215612f8557600080fd5b8235612f9081612be6565b91506020830135612fa081612be6565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b6020810160028310612fe357634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215612ffb57600080fd5b813560ff81168114612c1857600080fd5b6000806040838503121561301f57600080fd5b823561302a81612be6565b915061303860208401612e84565b90509250929050565b60008060008060006080868803121561305957600080fd5b853561306481612be6565b945060208601356001600160401b0381111561307f57600080fd5b61308b88828901612c79565b9699909850959660408101359660609091013595509350505050565b600080604083850312156130ba57600080fd5b82356130c581612be6565b915060208301356001600160401b038111156130e057600080fd5b6130ec85828601612d2b565b9150509250929050565b6000806000806080858703121561310c57600080fd5b843561311781612be6565b9350602085013561312781612be6565b93969395505050506040820135916060013590565b6000806020838503121561314f57600080fd5b82356001600160401b038082111561316657600080fd5b818501915085601f83011261317a57600080fd5b81358181111561318957600080fd5b86602082850101111561319b57600080fd5b60209290920196919550909350505050565b600080602083850312156131c057600080fd5b82356001600160401b038111156131d657600080fd5b6131e285828601612c79565b90969095509350505050565b60008060006040848603121561320357600080fd5b833561320e81612be6565b925060208401356001600160401b0381111561322957600080fd5b61323586828701612c79565b9497909650939450505050565b6000806000806040858703121561325857600080fd5b84356001600160401b038082111561326f57600080fd5b61327b88838901612c79565b9096509450602087013591508082111561329457600080fd5b506132a187828801612c79565b95989497509550505050565b6000602082840312156132bf57600080fd5b8151612c1881612be6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561332657600080fd5b81518015158114612c1857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b8183526000602080850194508260005b858110156133ee5763ffffffff6133db83612e84565b16875295820195908201906001016133c5565b509495945050505050565b8681526001600160a01b038616602082015260a06040820181905260009061342490830186886133b5565b60608301949094525060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561349057600080fd5b612c1882612e84565b81516001600160a01b0316815260209182015163ffffffff169181019190915260400190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156134e9576134e96134bf565b5060010190565b6000808335601e1984360301811261350757600080fd5b8301803591506001600160401b0382111561352157600080fd5b6020019150600581901b36038213156128fe57600080fd5b60208152600061354d6020830184866133b5565b949350505050565b82815260006020604081840152835180604085015260005b818110156135895785810183015185820160600152820161356d565b8181111561359b576000606083870101525b50601f01601f191692909201606001949350505050565b6000602082840312156135c457600080fd5b81516001600160e01b031981168114612c1857600080fd5b600082198211156135ef576135ef6134bf565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220c31b87ef6dc7c9b42ff5cf7c149ed22c42cbf046e9e403a5ed3b542f5469155464736f6c634300080c0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IAVSDirectory/binding.go b/pkg/bindings/IAVSDirectory/binding.go index df3c6998f..0e2271d00 100644 --- a/pkg/bindings/IAVSDirectory/binding.go +++ b/pkg/bindings/IAVSDirectory/binding.go @@ -44,7 +44,11 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // IAVSDirectoryMetaData contains all meta data concerning the IAVSDirectory contract. var IAVSDirectoryMetaData = &bind.MetaData{ +<<<<<<< HEAD ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", +======= + ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", +>>>>>>> ad282d28 (build: bindings) } // IAVSDirectoryABI is the input ABI used to generate the binding from. @@ -410,6 +414,71 @@ func (_IAVSDirectory *IAVSDirectoryCallerSession) IsMember(avs common.Address, o return _IAVSDirectory.Contract.IsMember(&_IAVSDirectory.CallOpts, avs, operator, operatorSetId) } +<<<<<<< HEAD +======= +// IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. +// +// Solidity: function isOperatorSet(address avs, uint32 operatorSetId) view returns(bool) +func (_IAVSDirectory *IAVSDirectoryCaller) IsOperatorSet(opts *bind.CallOpts, avs common.Address, operatorSetId uint32) (bool, error) { + var out []interface{} + err := _IAVSDirectory.contract.Call(opts, &out, "isOperatorSet", avs, operatorSetId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. +// +// Solidity: function isOperatorSet(address avs, uint32 operatorSetId) view returns(bool) +func (_IAVSDirectory *IAVSDirectorySession) IsOperatorSet(avs common.Address, operatorSetId uint32) (bool, error) { + return _IAVSDirectory.Contract.IsOperatorSet(&_IAVSDirectory.CallOpts, avs, operatorSetId) +} + +// IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. +// +// Solidity: function isOperatorSet(address avs, uint32 operatorSetId) view returns(bool) +func (_IAVSDirectory *IAVSDirectoryCallerSession) IsOperatorSet(avs common.Address, operatorSetId uint32) (bool, error) { + return _IAVSDirectory.Contract.IsOperatorSet(&_IAVSDirectory.CallOpts, avs, operatorSetId) +} + +// IsOperatorSetAVS is a free data retrieval call binding the contract method 0x7673e93a. +// +// Solidity: function isOperatorSetAVS(address avs) view returns(bool) +func (_IAVSDirectory *IAVSDirectoryCaller) IsOperatorSetAVS(opts *bind.CallOpts, avs common.Address) (bool, error) { + var out []interface{} + err := _IAVSDirectory.contract.Call(opts, &out, "isOperatorSetAVS", avs) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOperatorSetAVS is a free data retrieval call binding the contract method 0x7673e93a. +// +// Solidity: function isOperatorSetAVS(address avs) view returns(bool) +func (_IAVSDirectory *IAVSDirectorySession) IsOperatorSetAVS(avs common.Address) (bool, error) { + return _IAVSDirectory.Contract.IsOperatorSetAVS(&_IAVSDirectory.CallOpts, avs) +} + +// IsOperatorSetAVS is a free data retrieval call binding the contract method 0x7673e93a. +// +// Solidity: function isOperatorSetAVS(address avs) view returns(bool) +func (_IAVSDirectory *IAVSDirectoryCallerSession) IsOperatorSetAVS(avs common.Address) (bool, error) { + return _IAVSDirectory.Contract.IsOperatorSetAVS(&_IAVSDirectory.CallOpts, avs) +} + +>>>>>>> ad282d28 (build: bindings) // OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5. // // Solidity: function operatorSaltIsSpent(address operator, bytes32 salt) view returns(bool) diff --git a/pkg/bindings/IRewardsCoordinator/binding.go b/pkg/bindings/IRewardsCoordinator/binding.go index e8177d3e8..c037f214f 100644 --- a/pkg/bindings/IRewardsCoordinator/binding.go +++ b/pkg/bindings/IRewardsCoordinator/binding.go @@ -49,6 +49,17 @@ type IRewardsCoordinatorEarnerTreeMerkleLeaf struct { EarnerTokenRoot [32]byte } +// IRewardsCoordinatorOperatorSetRewardsSubmission is an auto generated low-level Go binding around an user-defined struct. +type IRewardsCoordinatorOperatorSetRewardsSubmission struct { + RewardType uint8 + OperatorSetId uint32 + StrategiesAndMultipliers []IRewardsCoordinatorStrategyAndMultiplier + Token common.Address + Amount *big.Int + StartTimestamp uint32 + Duration uint32 +} + // IRewardsCoordinatorRewardsMerkleClaim is an auto generated low-level Go binding around an user-defined struct. type IRewardsCoordinatorRewardsMerkleClaim struct { RootIndex uint32 @@ -83,7 +94,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // IRewardsCoordinatorMetaData contains all meta data concerning the IRewardsCoordinator contract. var IRewardsCoordinatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardOperatorSetForRange\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.OperatorSetRewardsSubmission[]\",\"components\":[{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetRewardCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.OperatorSetRewardsSubmission\",\"components\":[{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", } // IRewardsCoordinatorABI is the input ABI used to generate the binding from. @@ -936,6 +947,27 @@ func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) ProcessClaim(c return _IRewardsCoordinator.Contract.ProcessClaim(&_IRewardsCoordinator.TransactOpts, claim, recipient) } +// RewardOperatorSetForRange is a paid mutator transaction binding the contract method 0x2c9c60cf. +// +// Solidity: function rewardOperatorSetForRange((uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns() +func (_IRewardsCoordinator *IRewardsCoordinatorTransactor) RewardOperatorSetForRange(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorOperatorSetRewardsSubmission) (*types.Transaction, error) { + return _IRewardsCoordinator.contract.Transact(opts, "rewardOperatorSetForRange", rewardsSubmissions) +} + +// RewardOperatorSetForRange is a paid mutator transaction binding the contract method 0x2c9c60cf. +// +// Solidity: function rewardOperatorSetForRange((uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns() +func (_IRewardsCoordinator *IRewardsCoordinatorSession) RewardOperatorSetForRange(rewardsSubmissions []IRewardsCoordinatorOperatorSetRewardsSubmission) (*types.Transaction, error) { + return _IRewardsCoordinator.Contract.RewardOperatorSetForRange(&_IRewardsCoordinator.TransactOpts, rewardsSubmissions) +} + +// RewardOperatorSetForRange is a paid mutator transaction binding the contract method 0x2c9c60cf. +// +// Solidity: function rewardOperatorSetForRange((uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns() +func (_IRewardsCoordinator *IRewardsCoordinatorTransactorSession) RewardOperatorSetForRange(rewardsSubmissions []IRewardsCoordinatorOperatorSetRewardsSubmission) (*types.Transaction, error) { + return _IRewardsCoordinator.Contract.RewardOperatorSetForRange(&_IRewardsCoordinator.TransactOpts, rewardsSubmissions) +} + // SetActivationDelay is a paid mutator transaction binding the contract method 0x58baaa3e. // // Solidity: function setActivationDelay(uint32 _activationDelay) returns() @@ -2141,6 +2173,169 @@ func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseOperatorCommission return event, nil } +// IRewardsCoordinatorOperatorSetRewardCreatedIterator is returned from FilterOperatorSetRewardCreated and is used to iterate over the raw logs and unpacked data for OperatorSetRewardCreated events raised by the IRewardsCoordinator contract. +type IRewardsCoordinatorOperatorSetRewardCreatedIterator struct { + Event *IRewardsCoordinatorOperatorSetRewardCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *IRewardsCoordinatorOperatorSetRewardCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(IRewardsCoordinatorOperatorSetRewardCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(IRewardsCoordinatorOperatorSetRewardCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *IRewardsCoordinatorOperatorSetRewardCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *IRewardsCoordinatorOperatorSetRewardCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// IRewardsCoordinatorOperatorSetRewardCreated represents a OperatorSetRewardCreated event raised by the IRewardsCoordinator contract. +type IRewardsCoordinatorOperatorSetRewardCreated struct { + Avs common.Address + SubmissionNonce *big.Int + RewardsSubmissionHash [32]byte + RewardsSubmission IRewardsCoordinatorOperatorSetRewardsSubmission + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorSetRewardCreated is a free log retrieval operation binding the contract event 0x29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b2. +// +// Solidity: event OperatorSetRewardCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, (uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission) +func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) FilterOperatorSetRewardCreated(opts *bind.FilterOpts, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*IRewardsCoordinatorOperatorSetRewardCreatedIterator, error) { + + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + var submissionNonceRule []interface{} + for _, submissionNonceItem := range submissionNonce { + submissionNonceRule = append(submissionNonceRule, submissionNonceItem) + } + var rewardsSubmissionHashRule []interface{} + for _, rewardsSubmissionHashItem := range rewardsSubmissionHash { + rewardsSubmissionHashRule = append(rewardsSubmissionHashRule, rewardsSubmissionHashItem) + } + + logs, sub, err := _IRewardsCoordinator.contract.FilterLogs(opts, "OperatorSetRewardCreated", avsRule, submissionNonceRule, rewardsSubmissionHashRule) + if err != nil { + return nil, err + } + return &IRewardsCoordinatorOperatorSetRewardCreatedIterator{contract: _IRewardsCoordinator.contract, event: "OperatorSetRewardCreated", logs: logs, sub: sub}, nil +} + +// WatchOperatorSetRewardCreated is a free log subscription operation binding the contract event 0x29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b2. +// +// Solidity: event OperatorSetRewardCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, (uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission) +func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) WatchOperatorSetRewardCreated(opts *bind.WatchOpts, sink chan<- *IRewardsCoordinatorOperatorSetRewardCreated, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error) { + + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + var submissionNonceRule []interface{} + for _, submissionNonceItem := range submissionNonce { + submissionNonceRule = append(submissionNonceRule, submissionNonceItem) + } + var rewardsSubmissionHashRule []interface{} + for _, rewardsSubmissionHashItem := range rewardsSubmissionHash { + rewardsSubmissionHashRule = append(rewardsSubmissionHashRule, rewardsSubmissionHashItem) + } + + logs, sub, err := _IRewardsCoordinator.contract.WatchLogs(opts, "OperatorSetRewardCreated", avsRule, submissionNonceRule, rewardsSubmissionHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(IRewardsCoordinatorOperatorSetRewardCreated) + if err := _IRewardsCoordinator.contract.UnpackLog(event, "OperatorSetRewardCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorSetRewardCreated is a log parse operation binding the contract event 0x29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b2. +// +// Solidity: event OperatorSetRewardCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, (uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission) +func (_IRewardsCoordinator *IRewardsCoordinatorFilterer) ParseOperatorSetRewardCreated(log types.Log) (*IRewardsCoordinatorOperatorSetRewardCreated, error) { + event := new(IRewardsCoordinatorOperatorSetRewardCreated) + if err := _IRewardsCoordinator.contract.UnpackLog(event, "OperatorSetRewardCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // IRewardsCoordinatorRewardsClaimedIterator is returned from FilterRewardsClaimed and is used to iterate over the raw logs and unpacked data for RewardsClaimed events raised by the IRewardsCoordinator contract. type IRewardsCoordinatorRewardsClaimedIterator struct { Event *IRewardsCoordinatorRewardsClaimed // Event containing the contract specifics and raw log diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go index 0494a010d..f63b4f494 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -49,6 +49,17 @@ type IRewardsCoordinatorEarnerTreeMerkleLeaf struct { EarnerTokenRoot [32]byte } +// IRewardsCoordinatorOperatorSetRewardsSubmission is an auto generated low-level Go binding around an user-defined struct. +type IRewardsCoordinatorOperatorSetRewardsSubmission struct { + RewardType uint8 + OperatorSetId uint32 + StrategiesAndMultipliers []IRewardsCoordinatorStrategyAndMultiplier + Token common.Address + Amount *big.Int + StartTimestamp uint32 + Duration uint32 +} + // IRewardsCoordinatorRewardsMerkleClaim is an auto generated low-level Go binding around an user-defined struct. type IRewardsCoordinatorRewardsMerkleClaim struct { RootIndex uint32 @@ -83,8 +94,8 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"__GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101806040523480156200001257600080fd5b5060405162004ac838038062004ac88339810160408190526200003591620002e4565b868686868686866200004885826200037e565b63ffffffff1615620000ed5760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000fc62015180866200037e565b63ffffffff16156200019d5760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e4565b6001600160a01b0396871661012052949095166101405263ffffffff92831660805290821660a052811660c05291821660e0521661010052620001df620001f2565b5050466101605250620003b09350505050565b600054610100900460ff16156200025c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e4565b60005460ff9081161015620002af576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620002c757600080fd5b50565b805163ffffffff81168114620002df57600080fd5b919050565b600080600080600080600060e0888a0312156200030057600080fd5b87516200030d81620002b1565b60208901519097506200032081620002b1565b95506200033060408901620002ca565b94506200034060608901620002ca565b93506200035060808901620002ca565b92506200036060a08901620002ca565b91506200037060c08901620002ca565b905092959891949750929550565b600063ffffffff80841680620003a457634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e0516101005161012051610140516101605161468162000447600039600061204f0152600081816104f70152612d01015260006107f40152600081816104210152612b3001526000818161034d0152612bdc0152600081816104d00152612adf01526000818161074001526128560152600081816106e60152818161290d01526129e801526146816000f3fe608060405234801561001057600080fd5b506004361061030b5760003560e01c80637adace911161019d578063c46db606116100e9578063f2fde38b116100a2578063f96abf2e1161007c578063f96abf2e14610844578063fabc1cbc14610857578063fbf1e2c11461086a578063fce36c7d1461087d57600080fd5b8063f2fde38b14610816578063f698da2514610829578063f8cd84481461083157600080fd5b8063c46db60614610775578063d4540a55146107a3578063de02e503146107b6578063e221b245146107c9578063e810ce21146107dc578063ea4d3c9b146107ef57600080fd5b80639104c31911610156578063a0169ddd11610130578063a0169ddd14610708578063bb7e451f1461071b578063bf21a8aa1461073b578063c336f19d1461076257600080fd5b80639104c319146106be5780639be3d4e4146106d95780639d45c281146106e157600080fd5b80637adace91146106225780637b8f8b0514610654578063863cb9a91461065c578063865c69531461066f578063886f11951461069a5780638da5cb5b146106ad57600080fd5b80633a8c07861161025c57806358baaa3e116102155780635c975abb116101ef5780635c975abb146105d15780635e9d8348146105d95780636d21117e146105ec578063715018a61461061a57600080fd5b806358baaa3e14610593578063595c6a67146105a65780635ac86ab7146105ae57600080fd5b80633a8c0786146105195780633c8fcf7c146105305780633ccc861d146105435780633efe1db6146105565780634d18cc35146105695780634d7a80d41461058057600080fd5b8063131433b4116102c95780632b9f64a4116102a35780632b9f64a41461047757806336af41fa146104b857806337838ed0146104cb57806339b70e38146104f257600080fd5b8063131433b41461041c578063136439dd14610443578063149bc8721461045657600080fd5b806218572c1461031057806304a0c50214610348578063092db007146103845780630e9a53cf146103ac5780630eb38345146103f457806310d67a2f14610409575b600080fd5b61033361031e366004613b8c565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161033f565b60cb5461039990600160e01b900461ffff1681565b60405161ffff909116815260200161033f565b6103b4610890565b604080518251815260208084015163ffffffff9081169183019190915283830151169181019190915260609182015115159181019190915260800161033f565b610407610402366004613bb7565b61096f565b005b610407610417366004613b8c565b6109f1565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610407610451366004613bf0565b610aad565b610469610464366004613c21565b610bec565b60405190815260200161033f565b6104a0610485366004613b8c565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161033f565b6104076104c6366004613c3d565b610c62565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b6104a07f000000000000000000000000000000000000000000000000000000000000000081565b60cb5461036f90600160a01b900463ffffffff1681565b61036f61053e366004613cd8565b610e94565b610407610551366004613d2f565b611125565b610407610564366004613d8a565b6114e7565b60cb5461036f90600160c01b900463ffffffff1681565b61039961058e366004613db6565b6117b8565b6104076105a1366004613df3565b61196a565b61040761197b565b6103336105bc366004613e0e565b606654600160ff9092169190911b9081161490565b606654610469565b6103336105e7366004613e31565b611a42565b6103336105fa366004613e66565b60cf60209081526000928352604080842090915290825290205460ff1681565b610407611acf565b610635610630366004613e92565b611ae3565b6040805161ffff909316835263ffffffff90911660208301520161033f565b60ca54610469565b61040761066a366004613b8c565b611b4b565b61046961067d366004613efd565b60cd60209081526000928352604080842090915290825290205481565b6065546104a0906001600160a01b031681565b6033546001600160a01b03166104a0565b6104a073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103b4611b5c565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610407610716366004613b8c565b611bfa565b610469610729366004613b8c565b60ce6020526000908152604090205481565b61036f7f000000000000000000000000000000000000000000000000000000000000000081565b610469610770366004613db6565b611c59565b610333610783366004613e66565b60d060209081526000928352604080842090915290825290205460ff1681565b6104076107b1366004613f2b565b611d0f565b6103b46107c4366004613bf0565b611e57565b6104076107d7366004613f9e565b611ee9565b61036f6107ea366004613bf0565b611efa565b6104a07f000000000000000000000000000000000000000000000000000000000000000081565b610407610824366004613b8c565b611fd5565b61046961204b565b61046961083f366004613c21565b612089565b610407610852366004613df3565b61209a565b610407610865366004613bf0565b6122d0565b60cb546104a0906001600160a01b031681565b61040761088b366004613c3d565b61242c565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b801561096b57600060ca6108cd600184613fcf565b815481106108dd576108dd613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff16158015606083018190529192509061094d5750806040015163ffffffff164210155b156109585792915050565b508061096381613ffc565b9150506108b8565b5090565b6109776125a3565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a689190614013565b6001600160a01b0316336001600160a01b031614610aa15760405162461bcd60e51b8152600401610a9890614030565b60405180910390fd5b610aaa816125fd565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b19919061407a565b610b355760405162461bcd60e51b8152600401610a9890614097565b60665481811614610bae5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610a98565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610bfc6020840184613b8c565b8360200135604051602001610c459392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460019060029081161415610c8b5760405162461bcd60e51b8152600401610a98906140df565b33600090815260d1602052604090205460ff16610d2a5760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a401610a98565b60026097541415610d4d5760405162461bcd60e51b8152600401610a9890614116565b600260975560005b82811015610e895736848483818110610d7057610d70613fe6565b9050602002810190610d82919061414d565b33600081815260ce60209081526040808320549051949550939192610dad9290918591879101614292565b604051602081830303815290604052805190602001209050610dce836126f4565b33600090815260d0602090815260408083208484529091529020805460ff19166001908117909155610e019083906142c2565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf27048290610e499088906142da565b60405180910390a4610e7b333060408601803590610e6a9060208901613b8c565b6001600160a01b0316929190612ecc565b836001019350505050610d55565b505060016097555050565b600061271061ffff83161115610f205760405162461bcd60e51b815260206004820152604560248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72436f60448201527f6d6d697373696f6e426970733a20636f6d6d697373696f6e4269707320746f6f606482015264040d0d2ced60db1b608482015260a401610a98565b610f2d62093a80426142c2565b33600090815260d26020908152604082209293509091908290610f5290880188613b8c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000866020016020810190610f879190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000856001811115610fb557610fb56142ed565b6001811115610fc657610fc66142ed565b815260208101919091526040016000208054909150801580611021575063ffffffff831682610ff6600184613fcf565b8154811061100657611006613fe6565b60009182526020909120015462010000900463ffffffff1614155b15611084576040805180820190915261ffff808616825263ffffffff808616602080850191825286546001810188556000888152919091209451940180549151909216620100000265ffffffffffff1990911693909216929092171790556110c1565b8382611091600184613fcf565b815481106110a1576110a1613fe6565b6000918252602090912001805461ffff191661ffff929092169190911790555b856040516110cf9190614303565b6040518091039020336001600160a01b03167f811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba8787876040516111149392919061433b565b60405180910390a350509392505050565b6066546002906004908116141561114e5760405162461bcd60e51b8152600401610a98906140df565b600260975414156111715760405162461bcd60e51b8152600401610a9890614116565b6002609755600060ca6111876020860186613df3565b63ffffffff168154811061119d5761119d613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015290506111fe8482612f3d565b60006112106080860160608701613b8c565b6001600160a01b03808216600090815260cc602052604090205491925016806112365750805b336001600160a01b038216146112b45760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608401610a98565b60005b6112c460a088018861437b565b90508110156114d957366112db60e08901896143cc565b838181106112eb576112eb613fe6565b6001600160a01b038716600090815260cd60209081526040808320930294909401945092909150829061132090850185613b8c565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808260200135116113da5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a401610a98565b60006113ea826020850135613fcf565b6001600160a01b038716600090815260cd602090815260408220929350850180359291906114189087613b8c565b6001600160a01b031681526020808201929092526040016000209190915561145a908a90839061144a90870187613b8c565b6001600160a01b03169190613209565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061149e6020890189613b8c565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050806114d290614416565b90506112b7565b505060016097555050505050565b606654600390600890811614156115105760405162461bcd60e51b8152600401610a98906140df565b60cb546001600160a01b0316331461153a5760405162461bcd60e51b8152600401610a9890614431565b60cb5463ffffffff600160c01b9091048116908316116115d65760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a401610a98565b428263ffffffff161061166f5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a401610a98565b60ca5460cb5460009061168f90600160a01b900463ffffffff1642614485565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b60cb546001600160a01b038416600090815260d26020908152604082209192600160e01b900461ffff1691839182906117f390880188613b8c565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008660200160208101906118289190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000856001811115611856576118566142ed565b6001811115611867576118676142ed565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156118db576000848152602090819020604080518082019091529084015461ffff8116825262010000900463ffffffff1681830152825260019092019101611895565b5050825192935050505b801561195d5763ffffffff4216826118fe600184613fcf565b8151811061190e5761190e613fe6565b60200260200101516020015163ffffffff16116119545781611931600183613fcf565b8151811061194157611941613fe6565b602002602001015160000151925061195d565b600019016118e5565b50909150505b9392505050565b6119726125a3565b610aaa81613239565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156119c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e7919061407a565b611a035760405162461bcd60e51b8152600401610a9890614097565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000611ac78260ca611a576020830183613df3565b63ffffffff1681548110611a6d57611a6d613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152612f3d565b506001919050565b611ad76125a3565b611ae160006132aa565b565b60d26020528460005260406000206020528360005260406000206020528260005260406000206020528160005260406000208181548110611b2357600080fd5b60009182526020909120015461ffff8116955062010000900463ffffffff1693508592505050565b611b536125a3565b610aaa816132fc565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8054611b9090600190613fcf565b81548110611ba057611ba0613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b6001600160a01b038316600090815260d2602090815260408220908290611c8290860186613b8c565b6001600160a01b03166001600160a01b031681526020019081526020016000206000846020016020810190611cb79190613df3565b63ffffffff1663ffffffff1681526020019081526020016000206000836001811115611ce557611ce56142ed565b6001811115611cf657611cf66142ed565b8152602081019190915260400160002054949350505050565b600054610100900460ff1615808015611d2f5750600054600160ff909116105b80611d495750303b158015611d49575060005460ff166001145b611dac5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a98565b6000805460ff191660011790558015611dcf576000805461ff0019166101001790555b611dd7613358565b60c955611de486866133ef565b611ded876132aa565b611df6846132fc565b611dff83613239565b611e08826134d9565b8015611e4e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8281548110611e8e57611e8e613fe6565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b611ef16125a3565b610aaa816134d9565b60ca546000905b63ffffffff811615611f66578260ca611f1b6001846144ad565b63ffffffff1681548110611f3157611f31613fe6565b9060005260206000209060020201600001541415611f54576119636001826144ad565b80611f5e816144d2565b915050611f01565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608401610a98565b611fdd6125a3565b6001600160a01b0381166120425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a98565b610aaa816132aa565b60007f000000000000000000000000000000000000000000000000000000000000000046141561207c575060c95490565b612084613358565b905090565b60006001610bfc6020840184613b8c565b606654600390600890811614156120c35760405162461bcd60e51b8152600401610a98906140df565b60cb546001600160a01b031633146120ed5760405162461bcd60e51b8152600401610a9890614431565b60ca5463ffffffff83161061215e5760405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608401610a98565b600060ca8363ffffffff168154811061217957612179613fe6565b906000526020600020906002020190508060010160089054906101000a900460ff16156122065760405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608401610a98565b6001810154600160201b900463ffffffff1642106122855760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608401610a98565b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612323573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123479190614013565b6001600160a01b0316336001600160a01b0316146123775760405162461bcd60e51b8152600401610a9890614030565b6066541981196066541916146123f55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610a98565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610be1565b606654600090600190811614156124555760405162461bcd60e51b8152600401610a98906140df565b600260975414156124785760405162461bcd60e51b8152600401610a9890614116565b600260975560005b82811015610e89573684848381811061249b5761249b613fe6565b90506020028101906124ad919061414d565b33600081815260ce602090815260408083205490519495509391926124d89290918591879101614292565b6040516020818303038152906040528051906020012090506124f9836126f4565b33600090815260cf602090815260408083208484529091529020805460ff1916600190811790915561252c9083906142c2565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e6281906125749088906142da565b60405180910390a4612595333060408601803590610e6a9060208901613b8c565b836001019350505050612480565b6033546001600160a01b03163314611ae15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a98565b6001600160a01b03811661268b5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610a98565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b600061270082806143cc565b905011612765576040805162461bcd60e51b815260206004820152602481019190915260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206e6f2073747261746567696573207365746064820152608401610a98565b60008160400135116127d75760405162461bcd60e51b8152602060048201526041602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a401610a98565b6f4b3b4ca85a86c47a098a223fffffffff8160400135111561284f5760405162461bcd60e51b815260206004820152603f602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608401610a98565b63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001661288660a0830160808401613df3565b63ffffffff16111561290b5760405162461bcd60e51b8152602060048201526054602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a401610a98565b7f000000000000000000000000000000000000000000000000000000000000000061293c60a0830160808401613df3565b6129469190614508565b63ffffffff16156129e65760405162461bcd60e51b815260206004820152606a602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c401610a98565b7f0000000000000000000000000000000000000000000000000000000000000000612a176080830160608401613df3565b612a219190614508565b63ffffffff1615612ac75760405162461bcd60e51b8152602060048201526070602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c401610a98565b612ad76080820160608301613df3565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1642612b0f9190613fcf565b11158015612b585750612b286080820160608301613df3565b63ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff1611155b612bd25760405162461bcd60e51b8152602060048201526051602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a401610a98565b612c0263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016426142c2565b612c126080830160608401613df3565b63ffffffff161115612c965760405162461bcd60e51b8152602060048201526053602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a401610a98565b6000805b612ca483806143cc565b9050811015612ec7576000612cb984806143cc565b83818110612cc957612cc9613fe6565b612cdf9260206040909202019081019150613b8c565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015612d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6e919061407a565b80612d9557506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b612e085760405162461bcd60e51b815260206004820152604a602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a401610a98565b806001600160a01b0316836001600160a01b031610612eb55760405162461bcd60e51b8152602060048201526069602482015260008051602061462c83398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c401610a98565b9150612ec081614416565b9050612c9a565b505050565b6040516001600160a01b0380851660248301528316604482015260648101829052612f379085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613544565b50505050565b806060015115612f965760405162461bcd60e51b8152602060048201526030602482015260008051602061460c83398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608401610a98565b806040015163ffffffff16421015612ffd5760405162461bcd60e51b8152602060048201526036602482015260008051602061460c8339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608401610a98565b61300a60c083018361437b565b905061301960a084018461437b565b9050146130915760405162461bcd60e51b815260206004820152604c602482015260008051602061460c83398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a401610a98565b61309e60e08301836143cc565b90506130ad60c084018461437b565b9050146131235760405162461bcd60e51b815260206004820152604a602482015260008051602061460c83398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610a98565b805161314f906131396040850160208601613df3565b613146604086018661452b565b86606001613616565b60005b61315f60a084018461437b565b9050811015612ec7576131f9608084013561317d60a086018661437b565b8481811061318d5761318d613fe6565b90506020020160208101906131a29190613df3565b6131af60c087018761437b565b858181106131bf576131bf613fe6565b90506020028101906131d1919061452b565b6131de60e08901896143cc565b878181106131ee576131ee613fe6565b90506040020161378a565b61320281614416565b9050613152565b6040516001600160a01b038316602482015260448101829052612ec790849063a9059cbb60e01b90606401612f00565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b031615801561341057506001600160a01b03821615155b6134925760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610a98565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26134d5826125fd565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b6000613599826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138db9092919063ffffffff16565b805190915015612ec757808060200190518101906135b7919061407a565b612ec75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a98565b613621602083614572565b6001901b8463ffffffff16106136ab5760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a401610a98565b60006136b682610bec565b905061370184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff89166138f2565b6137825760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a401610a98565b505050505050565b613795602083614572565b6001901b8463ffffffff16106138135760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608401610a98565b600061381e82612089565b905061386984848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff89166138f2565b6137825760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608401610a98565b60606138ea848460008561390a565b949350505050565b600083613900868585613a3b565b1495945050505050565b60608247101561396b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a98565b6001600160a01b0385163b6139c25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a98565b600080866001600160a01b031685876040516139de91906145b2565b60006040518083038185875af1925050503d8060008114613a1b576040519150601f19603f3d011682016040523d82523d6000602084013e613a20565b606091505b5091509150613a30828286613b3e565b979650505050505050565b600060208451613a4b91906145c4565b15613ad25760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610a98565b8260205b85518111613b3557613ae96002856145c4565b613b0a57816000528086015160205260406000209150600284049350613b23565b8086015160005281602052604060002091506002840493505b613b2e6020826142c2565b9050613ad6565b50949350505050565b60608315613b4d575081611963565b825115613b5d5782518084602001fd5b8160405162461bcd60e51b8152600401610a9891906145d8565b6001600160a01b0381168114610aaa57600080fd5b600060208284031215613b9e57600080fd5b813561196381613b77565b8015158114610aaa57600080fd5b60008060408385031215613bca57600080fd5b8235613bd581613b77565b91506020830135613be581613ba9565b809150509250929050565b600060208284031215613c0257600080fd5b5035919050565b600060408284031215613c1b57600080fd5b50919050565b600060408284031215613c3357600080fd5b6119638383613c09565b60008060208385031215613c5057600080fd5b823567ffffffffffffffff80821115613c6857600080fd5b818501915085601f830112613c7c57600080fd5b813581811115613c8b57600080fd5b8660208260051b8501011115613ca057600080fd5b60209290920196919550909350505050565b803560028110613cc157600080fd5b919050565b803561ffff81168114613cc157600080fd5b600080600060808486031215613ced57600080fd5b613cf78585613c09565b9250613d0560408501613cb2565b9150613d1360608501613cc6565b90509250925092565b60006101008284031215613c1b57600080fd5b60008060408385031215613d4257600080fd5b823567ffffffffffffffff811115613d5957600080fd5b613d6585828601613d1c565b9250506020830135613be581613b77565b803563ffffffff81168114613cc157600080fd5b60008060408385031215613d9d57600080fd5b82359150613dad60208401613d76565b90509250929050565b600080600060808486031215613dcb57600080fd5b8335613dd681613b77565b9250613de58560208601613c09565b9150613d1360608501613cb2565b600060208284031215613e0557600080fd5b61196382613d76565b600060208284031215613e2057600080fd5b813560ff8116811461196357600080fd5b600060208284031215613e4357600080fd5b813567ffffffffffffffff811115613e5a57600080fd5b6138ea84828501613d1c565b60008060408385031215613e7957600080fd5b8235613e8481613b77565b946020939093013593505050565b600080600080600060a08688031215613eaa57600080fd5b8535613eb581613b77565b94506020860135613ec581613b77565b9350613ed360408701613d76565b9250613ee160608701613cb2565b949793965091946080013592915050565b8035613cc181613b77565b60008060408385031215613f1057600080fd5b8235613f1b81613b77565b91506020830135613be581613b77565b60008060008060008060c08789031215613f4457600080fd5b8635613f4f81613b77565b95506020870135613f5f81613b77565b9450604087013593506060870135613f7681613b77565b9250613f8460808801613d76565b9150613f9260a08801613cc6565b90509295509295509295565b600060208284031215613fb057600080fd5b61196382613cc6565b634e487b7160e01b600052601160045260246000fd5b600082821015613fe157613fe1613fb9565b500390565b634e487b7160e01b600052603260045260246000fd5b60008161400b5761400b613fb9565b506000190190565b60006020828403121561402557600080fd5b815161196381613b77565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561408c57600080fd5b815161196381613ba9565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008235609e1983360301811261416357600080fd5b9190910192915050565b818352600060208085019450826000805b868110156141d257823561419181613b77565b6001600160a01b03168852828401356bffffffffffffffffffffffff81168082146141ba578384fd5b8986015250604097880197929092019160010161417e565b50959695505050505050565b60008135601e198336030181126141f457600080fd5b8201803567ffffffffffffffff81111561420d57600080fd5b8060061b360384131561421f57600080fd5b60a0855261423460a08601826020850161416d565b91505061424360208401613ef2565b6001600160a01b031660208501526040838101359085015261426760608401613d76565b63ffffffff16606085015261427e60808401613d76565b63ffffffff81166080860152509392505050565b60018060a01b03841681528260208201526060604082015260006142b960608301846141de565b95945050505050565b600082198211156142d5576142d5613fb9565b500190565b60208152600061196360208301846141de565b634e487b7160e01b600052602160045260246000fd5b6000823561431081613b77565b6001600160a01b0316825263ffffffff61432c60208501613d76565b16602083015250604001919050565b606081016002851061435d57634e487b7160e01b600052602160045260246000fd5b93815261ffff92909216602083015263ffffffff1660409091015290565b6000808335601e1984360301811261439257600080fd5b83018035915067ffffffffffffffff8211156143ad57600080fd5b6020019150600581901b36038213156143c557600080fd5b9250929050565b6000808335601e198436030181126143e357600080fd5b83018035915067ffffffffffffffff8211156143fe57600080fd5b6020019150600681901b36038213156143c557600080fd5b600060001982141561442a5761442a613fb9565b5060010190565b60208082526034908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6040820152733a103a3432903932bbb0b93239aab83230ba32b960611b606082015260800190565b600063ffffffff8083168185168083038211156144a4576144a4613fb9565b01949350505050565b600063ffffffff838116908316818110156144ca576144ca613fb9565b039392505050565b600063ffffffff8216806144e8576144e8613fb9565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff8084168061451f5761451f6144f2565b92169190910692915050565b6000808335601e1984360301811261454257600080fd5b83018035915067ffffffffffffffff82111561455d57600080fd5b6020019150368190038213156143c557600080fd5b600082614581576145816144f2565b500490565b60005b838110156145a1578181015183820152602001614589565b83811115612f375750506000910152565b60008251614163818460208701614586565b6000826145d3576145d36144f2565b500690565b60208152600082518060208401526145f7816040850160208701614586565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2052657761726473436f6f7264696e61746f722e5f76616c696461746552657761a26469706673582212200fe7e3de37588655e09adbecf2142757fac570b721a300aea035583bcc755c5964736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_avsDirectory\",\"type\":\"address\",\"internalType\":\"contractIAVSDirectory\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_OPERATOR_SET_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsDirectory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSDirectory\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardOperatorSetForRange\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.OperatorSetRewardsSubmission[]\",\"components\":[{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetRewardCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.OperatorSetRewardsSubmission\",\"components\":[{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x6101e06040523480156200001257600080fd5b506040516200511f3803806200511f8339810160408190526200003591620003c0565b898989898989898989896200004b878462000497565b63ffffffff1615620000f05760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000ff620151808862000497565b63ffffffff1615620001a05760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e7565b620001ac878362000497565b63ffffffff1615620002635760405162461bcd60e51b815260206004820152606d60248201527f52657761726473436f6f7264696e61746f723a204f50455241544f525f53455460448201527f5f47454e455349535f524557415244535f54494d455354414d50206d7573742060648201527f62652061206d756c7469706c65206f662043414c43554c4154494f4e5f494e5460848201526c455256414c5f5345434f4e445360981b60a482015260c401620000e7565b6001600160a01b03998a166101605297891661018052959097166101a05263ffffffff93841660805291831660a052821661010052811660c05292831660e0528216610120521661014052620002b8620002ce565b5050466101c05250620004c99650505050505050565b600054610100900460ff1615620003385760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e7565b60005460ff90811610156200038b576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620003a357600080fd5b50565b805163ffffffff81168114620003bb57600080fd5b919050565b6000806000806000806000806000806101408b8d031215620003e157600080fd5b8a51620003ee816200038d565b60208c0151909a5062000401816200038d565b60408c015190995062000414816200038d565b97506200042460608c01620003a6565b96506200043460808c01620003a6565b95506200044460a08c01620003a6565b94506200045460c08c01620003a6565b93506200046460e08c01620003a6565b9250620004756101008c01620003a6565b9150620004866101208c01620003a6565b90509295989b9194979a5092959850565b600063ffffffff80841680620004bd57634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051614b896200059660003960006124e80152600081816106970152610e1c01526000818161059d01526130d9015260006108e801526000818161053c0152610f930152600081816108750152610fb4015260008181610576015261124701526000818161048d01526112680152600081816103b90152612fd601526000818161080d0152612cda0152600081816107b301528181612d8a0152612e540152614b896000f3fe608060405234801561001057600080fd5b50600436106103775760003560e01c8063715018a6116101d3578063c46db60611610104578063f2fde38b116100a2578063f96abf2e1161007c578063f96abf2e14610938578063fabc1cbc1461094b578063fbf1e2c11461095e578063fce36c7d1461097157600080fd5b8063f2fde38b1461090a578063f698da251461091d578063f8cd84481461092557600080fd5b8063de02e503116100de578063de02e503146108aa578063e221b245146108bd578063e810ce21146108d0578063ea4d3c9b146108e357600080fd5b8063c46db60614610842578063d11e9ae514610870578063d4540a551461089757600080fd5b80639104c31911610171578063a0169ddd1161014b578063a0169ddd146107d5578063bb7e451f146107e8578063bf21a8aa14610808578063c336f19d1461082f57600080fd5b80639104c3191461078b5780639be3d4e4146107a65780639d45c281146107ae57600080fd5b8063863cb9a9116101ad578063863cb9a914610729578063865c69531461073c578063886f1195146107675780638da5cb5b1461077a57600080fd5b8063715018a6146106e75780637adace91146106ef5780637b8f8b051461072157600080fd5b806339b70e38116102ad57806358baaa3e1161024b5780635c975abb116102255780635c975abb146106775780635e9d83481461067f5780636b3aa72e146106925780636d21117e146106b957600080fd5b806358baaa3e14610639578063595c6a671461064c5780635ac86ab71461065457600080fd5b80633ccc861d116102875780633ccc861d146105e95780633efe1db6146105fc5780634d18cc351461060f5780634d7a80d41461062657600080fd5b806339b70e38146105985780633a8c0786146105bf5780633c8fcf7c146105d657600080fd5b8063136439dd1161031a5780632c9c60cf116102f45780632c9c60cf146105245780633486e32e1461053757806336af41fa1461055e57806337838ed01461057157600080fd5b8063136439dd146104af578063149bc872146104c25780632b9f64a4146104e357600080fd5b80630e9a53cf116103565780630e9a53cf146104185780630eb383451461046057806310d67a2f14610475578063131433b41461048857600080fd5b806218572c1461037c57806304a0c502146103b4578063092db007146103f0575b600080fd5b61039f61038a366004613f70565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ab565b60cb5461040590600160e01b900461ffff1681565b60405161ffff90911681526020016103ab565b610420610984565b604080518251815260208084015163ffffffff908116918301919091528383015116918101919091526060918201511515918101919091526080016103ab565b61047361046e366004613f9b565b610a63565b005b610473610483366004613f70565b610ae5565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736104bd366004613fd4565b610ba1565b6104d56104d0366004614005565b610ce0565b6040519081526020016103ab565b61050c6104f1366004613f70565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ab565b61047361053236600461406d565b610d56565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61047361056c36600461406d565b61109e565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103db90600160a01b900463ffffffff1681565b6103db6105e43660046140d5565b611336565b6104736105f736600461412c565b6115c4565b61047361060a366004614187565b611986565b60cb546103db90600160c01b900463ffffffff1681565b6104056106343660046141b3565b611c57565b6104736106473660046141f0565b611e06565b610473611e17565b61039f61066236600461420b565b606654600160ff9092169190911b9081161490565b6066546104d5565b61039f61068d36600461422e565b611ede565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b61039f6106c7366004614263565b60cf60209081526000928352604080842090915290825290205460ff1681565b610473611f6b565b6107026106fd36600461428f565b611f7f565b6040805161ffff909316835263ffffffff9091166020830152016103ab565b60ca546104d5565b610473610737366004613f70565b611fe7565b6104d561074a3660046142ef565b60cd60209081526000928352604080842090915290825290205481565b60655461050c906001600160a01b031681565b6033546001600160a01b031661050c565b61050c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610420611ff8565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736107e3366004613f70565b612096565b6104d56107f6366004613f70565b60ce6020526000908152604090205481565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104d561083d3660046141b3565b6120f5565b61039f610850366004614263565b60d060209081526000928352604080842090915290825290205460ff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736108a536600461431d565b6121a8565b6104206108b8366004613fd4565b6122f0565b6104736108cb366004614390565b612382565b6103db6108de366004613fd4565b612393565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b610473610918366004613f70565b61246e565b6104d56124e4565b6104d5610933366004614005565b612522565b6104736109463660046141f0565b612533565b610473610959366004613fd4565b612769565b60cb5461050c906001600160a01b031681565b61047361097f36600461406d565b6128c5565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b8015610a5f57600060ca6109c16001846143c1565b815481106109d1576109d16143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a415750806040015163ffffffff164210155b15610a4c5792915050565b5080610a57816143ee565b9150506109ac565b5090565b610a6b612a42565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190614405565b6001600160a01b0316336001600160a01b031614610b955760405162461bcd60e51b8152600401610b8c90614422565b60405180910390fd5b610b9e81612a9c565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d919061446c565b610c295760405162461bcd60e51b8152600401610b8c90614489565b60665481811614610ca25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610b8c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610cf06020840184613f70565b8360200135604051602001610d399392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460049060109081161415610d7f5760405162461bcd60e51b8152600401610b8c906144d1565b60026097541415610da25760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b828110156110935736848483818110610dc557610dc56143d8565b9050602002810190610dd7919061453f565b33600081815260ce60209081526040808320549051949550939192610e0292909185918791016146fc565b6040516020818303038152906040528051906020012090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166384d76f7b33856020016020810190610e5d91906141f0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015263ffffffff166024820152604401602060405180830381865afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed0919061446c565b610f4c5760405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e7265776172644f70657261746f60448201527f72536574466f7252616e67653a20696e76616c6964206f70657261746f7253656064820152601d60fa1b608482015260a401610b8c565b610fd8610f5c604085018561472c565b610f6c6080870160608801613f70565b6080870135610f8160c0890160a08a016141f0565b610f9160e08a0160c08b016141f0565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b93565b33600090815260cf602090815260408083208484529091529020805460ff1916600190811790915561100b908390614776565b33600081815260ce602052604090819020929092559051829184917f29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b29061105390889061478e565b60405180910390a46110853330608086018035906110749060608901613f70565b6001600160a01b03169291906132ab565b836001019350505050610daa565b505060016097555050565b606654600190600290811614156110c75760405162461bcd60e51b8152600401610b8c906144d1565b33600090815260d1602052604090205460ff166111665760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a401610b8c565b600260975414156111895760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b8281101561109357368484838181106111ac576111ac6143d8565b90506020028101906111be91906147a1565b33600081815260ce602090815260408083205490519495509391926111e99290918591879101614836565b60408051601f198184030181529190528051602090910120905061128c611210848061472c565b6112206040870160208801613f70565b60408701356112356080890160608a016141f0565b61124560a08a0160808b016141f0565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b93565b33600090815260d0602090815260408083208484529091529020805460ff191660019081179091556112bf908390614776565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf2704829061130790889061485d565b60405180910390a46113283330604086018035906110749060208901613f70565b836001019350505050611191565b600061271061ffff831611156113c25760405162461bcd60e51b815260206004820152604560248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72436f60448201527f6d6d697373696f6e426970733a20636f6d6d697373696f6e4269707320746f6f606482015264040d0d2ced60db1b608482015260a401610b8c565b6113cf62093a8042614776565b33600090815260d360209081526040822092935090919082906113f490880188613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020600086602001602081019061142991906141f0565b63ffffffff1663ffffffff16815260200190815260200160002060008560008111156114575761145761455f565b80156114655761146561455f565b8152602081019190915260400160002080549091508015806114c0575063ffffffff8316826114956001846143c1565b815481106114a5576114a56143d8565b60009182526020909120015462010000900463ffffffff1614155b15611523576040805180820190915261ffff808616825263ffffffff808616602080850191825286546001810188556000888152919091209451940180549151909216620100000265ffffffffffff199091169390921692909217179055611560565b83826115306001846143c1565b81548110611540576115406143d8565b6000918252602090912001805461ffff191661ffff929092169190911790555b8560405161156e9190614870565b6040518091039020336001600160a01b03167f811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba8787876040516115b3939291906148a8565b60405180910390a350509392505050565b606654600290600490811614156115ed5760405162461bcd60e51b8152600401610b8c906144d1565b600260975414156116105760405162461bcd60e51b8152600401610b8c90614508565b6002609755600060ca61162660208601866141f0565b63ffffffff168154811061163c5761163c6143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061169d848261331c565b60006116af6080860160608701613f70565b6001600160a01b03808216600090815260cc602052604090205491925016806116d55750805b336001600160a01b038216146117535760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608401610b8c565b60005b61176360a08801886148d4565b9050811015611978573661177a60e089018961472c565b8381811061178a5761178a6143d8565b6001600160a01b038716600090815260cd6020908152604080832093029490940194509290915082906117bf90850185613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808260200135116118795760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a401610b8c565b60006118898260208501356143c1565b6001600160a01b038716600090815260cd602090815260408220929350850180359291906118b79087613f70565b6001600160a01b03168152602080820192909252604001600020919091556118f9908a9083906118e990870187613f70565b6001600160a01b031691906135ed565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061193d6020890189613f70565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050806119719061491e565b9050611756565b505060016097555050505050565b606654600390600890811614156119af5760405162461bcd60e51b8152600401610b8c906144d1565b60cb546001600160a01b031633146119d95760405162461bcd60e51b8152600401610b8c90614939565b60cb5463ffffffff600160c01b909104811690831611611a755760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a401610b8c565b428263ffffffff1610611b0e5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a401610b8c565b60ca5460cb54600090611b2e90600160a01b900463ffffffff164261498d565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b60cb546001600160a01b038416600090815260d36020908152604082209192600160e01b900461ffff169183918290611c9290880188613f70565b6001600160a01b03166001600160a01b031681526020019081526020016000206000866020016020810190611cc791906141f0565b63ffffffff1663ffffffff1681526020019081526020016000206000856000811115611cf557611cf561455f565b8015611d0357611d0361455f565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611d77576000848152602090819020604080518082019091529084015461ffff8116825262010000900463ffffffff1681830152825260019092019101611d31565b5050825192935050505b8015611df95763ffffffff421682611d9a6001846143c1565b81518110611daa57611daa6143d8565b60200260200101516020015163ffffffff1611611df05781611dcd6001836143c1565b81518110611ddd57611ddd6143d8565b6020026020010151600001519250611df9565b60001901611d81565b50909150505b9392505050565b611e0e612a42565b610b9e8161361d565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e83919061446c565b611e9f5760405162461bcd60e51b8152600401610b8c90614489565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000611f638260ca611ef360208301836141f0565b63ffffffff1681548110611f0957611f096143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015261331c565b506001919050565b611f73612a42565b611f7d600061368e565b565b60d36020528460005260406000206020528360005260406000206020528260005260406000206020528160005260406000208181548110611fbf57600080fd5b60009182526020909120015461ffff8116955062010000900463ffffffff1693508592505050565b611fef612a42565b610b9e816136e0565b60408051608081018252600080825260208201819052918101829052606081019190915260ca805461202c906001906143c1565b8154811061203c5761203c6143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b6001600160a01b038316600090815260d360209081526040822090829061211e90860186613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020600084602001602081019061215391906141f0565b63ffffffff1663ffffffff16815260200190815260200160002060008360008111156121815761218161455f565b801561218f5761218f61455f565b8152602081019190915260400160002054949350505050565b600054610100900460ff16158080156121c85750600054600160ff909116105b806121e25750303b1580156121e2575060005460ff166001145b6122455760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b8c565b6000805460ff191660011790558015612268576000805461ff0019166101001790555b61227061373c565b60c95561227d86866137d3565b6122868761368e565b61228f846136e0565b6122988361361d565b6122a1826138bd565b80156122e7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8281548110612327576123276143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b61238a612a42565b610b9e816138bd565b60ca546000905b63ffffffff8116156123ff578260ca6123b46001846149b5565b63ffffffff16815481106123ca576123ca6143d8565b90600052602060002090600202016000015414156123ed57611dff6001826149b5565b806123f7816149da565b91505061239a565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608401610b8c565b612476612a42565b6001600160a01b0381166124db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b8c565b610b9e8161368e565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612515575060c95490565b61251d61373c565b905090565b60006001610cf06020840184613f70565b6066546003906008908116141561255c5760405162461bcd60e51b8152600401610b8c906144d1565b60cb546001600160a01b031633146125865760405162461bcd60e51b8152600401610b8c90614939565b60ca5463ffffffff8316106125f75760405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608401610b8c565b600060ca8363ffffffff1681548110612612576126126143d8565b906000526020600020906002020190508060010160089054906101000a900460ff161561269f5760405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608401610b8c565b6001810154600160201b900463ffffffff16421061271e5760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608401610b8c565b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e09190614405565b6001600160a01b0316336001600160a01b0316146128105760405162461bcd60e51b8152600401610b8c90614422565b60665419811960665419161461288e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610b8c565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610cd5565b606654600090600190811614156128ee5760405162461bcd60e51b8152600401610b8c906144d1565b600260975414156129115760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b828110156110935736848483818110612934576129346143d8565b905060200281019061294691906147a1565b33600081815260ce602090815260408083205490519495509391926129719290918591879101614836565b60408051601f1981840301815291905280516020909101209050612998611210848061472c565b33600090815260cf602090815260408083208484529091529020805460ff191660019081179091556129cb908390614776565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612a1390889061485d565b60405180910390a4612a343330604086018035906110749060208901613f70565b836001019350505050612919565b6033546001600160a01b03163314611f7d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b8c565b6001600160a01b038116612b2a5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610b8c565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b86612bf6576040805162461bcd60e51b8152602060048201526024810191909152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206e6f2073747261746567696573207365746064820152608401610b8c565b60008511612c645760405162461bcd60e51b81526020600482015260416024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a401610b8c565b6f4b3b4ca85a86c47a098a223fffffffff851115612cd85760405162461bcd60e51b815260206004820152603f6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608401610b8c565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168363ffffffff161115612d855760405162461bcd60e51b81526020600482015260546024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a401610b8c565b612daf7f000000000000000000000000000000000000000000000000000000000000000084614a10565b63ffffffff1615612e4f5760405162461bcd60e51b815260206004820152606a6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c401610b8c565b612e797f000000000000000000000000000000000000000000000000000000000000000085614a10565b63ffffffff1615612f1f5760405162461bcd60e51b81526020600482015260706024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c401610b8c565b8363ffffffff168263ffffffff1642612f3891906143c1565b11158015612f5257508363ffffffff168163ffffffff1611155b612fcc5760405162461bcd60e51b81526020600482015260516024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a401610b8c565b612ffc63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614776565b8463ffffffff1611156130815760405162461bcd60e51b81526020600482015260536024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a401610b8c565b6000805b8881101561329f5760008a8a838181106130a1576130a16143d8565b6130b79260206040909202019081019150613f70565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613122573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613146919061446c565b8061316d57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6131e05760405162461bcd60e51b815260206004820152604a6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a401610b8c565b806001600160a01b0316836001600160a01b03161061328d5760405162461bcd60e51b81526020600482015260696024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c401610b8c565b91506132988161491e565b9050613085565b50505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526133169085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613928565b50505050565b8060600151156133755760405162461bcd60e51b81526020600482015260306024820152600080516020614b1483398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608401610b8c565b806040015163ffffffff164210156133dc5760405162461bcd60e51b81526020600482015260366024820152600080516020614b148339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608401610b8c565b6133e960c08301836148d4565b90506133f860a08401846148d4565b9050146134705760405162461bcd60e51b815260206004820152604c6024820152600080516020614b1483398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a401610b8c565b61347d60e083018361472c565b905061348c60c08401846148d4565b9050146135025760405162461bcd60e51b815260206004820152604a6024820152600080516020614b1483398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610b8c565b805161352e9061351860408501602086016141f0565b6135256040860186614a33565b866060016139fa565b60005b61353e60a08401846148d4565b90508110156135e8576135d8608084013561355c60a08601866148d4565b8481811061356c5761356c6143d8565b905060200201602081019061358191906141f0565b61358e60c08701876148d4565b8581811061359e5761359e6143d8565b90506020028101906135b09190614a33565b6135bd60e089018961472c565b878181106135cd576135cd6143d8565b905060400201613b6e565b6135e18161491e565b9050613531565b505050565b6040516001600160a01b0383166024820152604481018290526135e890849063a9059cbb60e01b906064016132df565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b03161580156137f457506001600160a01b03821615155b6138765760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610b8c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26138b982612a9c565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b600061397d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613cbf9092919063ffffffff16565b8051909150156135e8578080602001905181019061399b919061446c565b6135e85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b8c565b613a05602083614a7a565b6001901b8463ffffffff1610613a8f5760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a401610b8c565b6000613a9a82610ce0565b9050613ae584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916613cd6565b613b665760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a401610b8c565b505050505050565b613b79602083614a7a565b6001901b8463ffffffff1610613bf75760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608401610b8c565b6000613c0282612522565b9050613c4d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916613cd6565b613b665760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608401610b8c565b6060613cce8484600085613cee565b949350505050565b600083613ce4868585613e1f565b1495945050505050565b606082471015613d4f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b8c565b6001600160a01b0385163b613da65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b8c565b600080866001600160a01b03168587604051613dc29190614aba565b60006040518083038185875af1925050503d8060008114613dff576040519150601f19603f3d011682016040523d82523d6000602084013e613e04565b606091505b5091509150613e14828286613f22565b979650505050505050565b600060208451613e2f9190614acc565b15613eb65760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610b8c565b8260205b85518111613f1957613ecd600285614acc565b613eee57816000528086015160205260406000209150600284049350613f07565b8086015160005281602052604060002091506002840493505b613f12602082614776565b9050613eba565b50949350505050565b60608315613f31575081611dff565b825115613f415782518084602001fd5b8160405162461bcd60e51b8152600401610b8c9190614ae0565b6001600160a01b0381168114610b9e57600080fd5b600060208284031215613f8257600080fd5b8135611dff81613f5b565b8015158114610b9e57600080fd5b60008060408385031215613fae57600080fd5b8235613fb981613f5b565b91506020830135613fc981613f8d565b809150509250929050565b600060208284031215613fe657600080fd5b5035919050565b600060408284031215613fff57600080fd5b50919050565b60006040828403121561401757600080fd5b611dff8383613fed565b60008083601f84011261403357600080fd5b50813567ffffffffffffffff81111561404b57600080fd5b6020830191508360208260051b850101111561406657600080fd5b9250929050565b6000806020838503121561408057600080fd5b823567ffffffffffffffff81111561409757600080fd5b6140a385828601614021565b90969095509350505050565b8035600181106140be57600080fd5b919050565b803561ffff811681146140be57600080fd5b6000806000608084860312156140ea57600080fd5b6140f48585613fed565b9250614102604085016140af565b9150614110606085016140c3565b90509250925092565b60006101008284031215613fff57600080fd5b6000806040838503121561413f57600080fd5b823567ffffffffffffffff81111561415657600080fd5b61416285828601614119565b9250506020830135613fc981613f5b565b803563ffffffff811681146140be57600080fd5b6000806040838503121561419a57600080fd5b823591506141aa60208401614173565b90509250929050565b6000806000608084860312156141c857600080fd5b83356141d381613f5b565b92506141e28560208601613fed565b9150614110606085016140af565b60006020828403121561420257600080fd5b611dff82614173565b60006020828403121561421d57600080fd5b813560ff81168114611dff57600080fd5b60006020828403121561424057600080fd5b813567ffffffffffffffff81111561425757600080fd5b613cce84828501614119565b6000806040838503121561427657600080fd5b823561428181613f5b565b946020939093013593505050565b600080600080600060a086880312156142a757600080fd5b85356142b281613f5b565b945060208601356142c281613f5b565b93506142d060408701614173565b92506142de606087016140af565b949793965091946080013592915050565b6000806040838503121561430257600080fd5b823561430d81613f5b565b91506020830135613fc981613f5b565b60008060008060008060c0878903121561433657600080fd5b863561434181613f5b565b9550602087013561435181613f5b565b945060408701359350606087013561436881613f5b565b925061437660808801614173565b915061438460a088016140c3565b90509295509295509295565b6000602082840312156143a257600080fd5b611dff826140c3565b634e487b7160e01b600052601160045260246000fd5b6000828210156143d3576143d36143ab565b500390565b634e487b7160e01b600052603260045260246000fd5b6000816143fd576143fd6143ab565b506000190190565b60006020828403121561441757600080fd5b8151611dff81613f5b565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561447e57600080fd5b8151611dff81613f8d565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000823560de1983360301811261455557600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b6001811061459357634e487b7160e01b600052602160045260246000fd5b9052565b6000808335601e198436030181126145ae57600080fd5b830160208101925035905067ffffffffffffffff8111156145ce57600080fd5b8060061b360383131561406657600080fd5b818352600060208085019450826000805b8681101561464557823561460481613f5b565b6001600160a01b03168852828401356bffffffffffffffffffffffff811680821461462d578384fd5b898601525060409788019792909201916001016145f1565b50959695505050505050565b6146638261465e836140af565b614575565b600061467160208301614173565b63ffffffff808216602086015261468b6040850185614597565b925060e060408701526146a260e0870184836145e0565b92505060608401356146b381613f5b565b6001600160a01b0316606086015260808481013590860152806146d860a08601614173565b1660a0860152806146eb60c08601614173565b1660c0860152508091505092915050565b60018060a01b03841681528260208201526060604082015260006147236060830184614651565b95945050505050565b6000808335601e1984360301811261474357600080fd5b83018035915067ffffffffffffffff82111561475e57600080fd5b6020019150600681901b360382131561406657600080fd5b60008219821115614789576147896143ab565b500190565b602081526000611dff6020830184614651565b60008235609e1983360301811261455557600080fd5b60006147c38283614597565b60a085526147d560a0860182846145e0565b91505060208301356147e681613f5b565b6001600160a01b031660208501526040838101359085015261480a60608401614173565b63ffffffff80821660608701528061482460808701614173565b16608087015250508091505092915050565b60018060a01b038416815282602082015260606040820152600061472360608301846147b7565b602081526000611dff60208301846147b7565b6000823561487d81613f5b565b6001600160a01b0316825263ffffffff61489960208501614173565b16602083015250604001919050565b606081016148b68286614575565b61ffff8416602083015263ffffffff83166040830152949350505050565b6000808335601e198436030181126148eb57600080fd5b83018035915067ffffffffffffffff82111561490657600080fd5b6020019150600581901b360382131561406657600080fd5b6000600019821415614932576149326143ab565b5060010190565b60208082526034908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6040820152733a103a3432903932bbb0b93239aab83230ba32b960611b606082015260800190565b600063ffffffff8083168185168083038211156149ac576149ac6143ab565b01949350505050565b600063ffffffff838116908316818110156149d2576149d26143ab565b039392505050565b600063ffffffff8216806149f0576149f06143ab565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff80841680614a2757614a276149fa565b92169190910692915050565b6000808335601e19843603018112614a4a57600080fd5b83018035915067ffffffffffffffff821115614a6557600080fd5b60200191503681900382131561406657600080fd5b600082614a8957614a896149fa565b500490565b60005b83811015614aa9578181015183820152602001614a91565b838111156133165750506000910152565b60008251614555818460208701614a8e565b600082614adb57614adb6149fa565b500690565b6020815260008251806020840152614aff816040850160208701614a8e565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2052657761726473436f6f7264696e61746f722e5f76616c696461746552657761a264697066735822122023c7b0bd649c687da84f858145f7866b17ec2461ddb5db854c7f28d8a8847b6564736f6c634300080c0033", } // RewardsCoordinatorABI is the input ABI used to generate the binding from. @@ -96,7 +107,7 @@ var RewardsCoordinatorABI = RewardsCoordinatorMetaData.ABI var RewardsCoordinatorBin = RewardsCoordinatorMetaData.Bin // DeployRewardsCoordinator deploys a new Ethereum contract, binding an instance of RewardsCoordinator to it. -func DeployRewardsCoordinator(auth *bind.TransactOpts, backend bind.ContractBackend, _delegationManager common.Address, _strategyManager common.Address, _CALCULATION_INTERVAL_SECONDS uint32, _MAX_REWARDS_DURATION uint32, _MAX_RETROACTIVE_LENGTH uint32, _MAX_FUTURE_LENGTH uint32, __GENESIS_REWARDS_TIMESTAMP uint32) (common.Address, *types.Transaction, *RewardsCoordinator, error) { +func DeployRewardsCoordinator(auth *bind.TransactOpts, backend bind.ContractBackend, _delegationManager common.Address, _strategyManager common.Address, _avsDirectory common.Address, _CALCULATION_INTERVAL_SECONDS uint32, _MAX_REWARDS_DURATION uint32, _MAX_RETROACTIVE_LENGTH uint32, _MAX_FUTURE_LENGTH uint32, _GENESIS_REWARDS_TIMESTAMP uint32, _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP uint32, _OPERATOR_SET_MAX_RETROACTIVE_LENGTH uint32) (common.Address, *types.Transaction, *RewardsCoordinator, error) { parsed, err := RewardsCoordinatorMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -105,7 +116,7 @@ func DeployRewardsCoordinator(auth *bind.TransactOpts, backend bind.ContractBack return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RewardsCoordinatorBin), backend, _delegationManager, _strategyManager, _CALCULATION_INTERVAL_SECONDS, _MAX_REWARDS_DURATION, _MAX_RETROACTIVE_LENGTH, _MAX_FUTURE_LENGTH, __GENESIS_REWARDS_TIMESTAMP) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(RewardsCoordinatorBin), backend, _delegationManager, _strategyManager, _avsDirectory, _CALCULATION_INTERVAL_SECONDS, _MAX_REWARDS_DURATION, _MAX_RETROACTIVE_LENGTH, _MAX_FUTURE_LENGTH, _GENESIS_REWARDS_TIMESTAMP, _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, _OPERATOR_SET_MAX_RETROACTIVE_LENGTH) if err != nil { return common.Address{}, nil, nil, err } @@ -409,6 +420,68 @@ func (_RewardsCoordinator *RewardsCoordinatorCallerSession) MAXREWARDSDURATION() return _RewardsCoordinator.Contract.MAXREWARDSDURATION(&_RewardsCoordinator.CallOpts) } +// OPERATORSETGENESISREWARDSTIMESTAMP is a free data retrieval call binding the contract method 0xd11e9ae5. +// +// Solidity: function OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP() view returns(uint32) +func (_RewardsCoordinator *RewardsCoordinatorCaller) OPERATORSETGENESISREWARDSTIMESTAMP(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _RewardsCoordinator.contract.Call(opts, &out, "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// OPERATORSETGENESISREWARDSTIMESTAMP is a free data retrieval call binding the contract method 0xd11e9ae5. +// +// Solidity: function OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP() view returns(uint32) +func (_RewardsCoordinator *RewardsCoordinatorSession) OPERATORSETGENESISREWARDSTIMESTAMP() (uint32, error) { + return _RewardsCoordinator.Contract.OPERATORSETGENESISREWARDSTIMESTAMP(&_RewardsCoordinator.CallOpts) +} + +// OPERATORSETGENESISREWARDSTIMESTAMP is a free data retrieval call binding the contract method 0xd11e9ae5. +// +// Solidity: function OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP() view returns(uint32) +func (_RewardsCoordinator *RewardsCoordinatorCallerSession) OPERATORSETGENESISREWARDSTIMESTAMP() (uint32, error) { + return _RewardsCoordinator.Contract.OPERATORSETGENESISREWARDSTIMESTAMP(&_RewardsCoordinator.CallOpts) +} + +// OPERATORSETMAXRETROACTIVELENGTH is a free data retrieval call binding the contract method 0x3486e32e. +// +// Solidity: function OPERATOR_SET_MAX_RETROACTIVE_LENGTH() view returns(uint32) +func (_RewardsCoordinator *RewardsCoordinatorCaller) OPERATORSETMAXRETROACTIVELENGTH(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _RewardsCoordinator.contract.Call(opts, &out, "OPERATOR_SET_MAX_RETROACTIVE_LENGTH") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// OPERATORSETMAXRETROACTIVELENGTH is a free data retrieval call binding the contract method 0x3486e32e. +// +// Solidity: function OPERATOR_SET_MAX_RETROACTIVE_LENGTH() view returns(uint32) +func (_RewardsCoordinator *RewardsCoordinatorSession) OPERATORSETMAXRETROACTIVELENGTH() (uint32, error) { + return _RewardsCoordinator.Contract.OPERATORSETMAXRETROACTIVELENGTH(&_RewardsCoordinator.CallOpts) +} + +// OPERATORSETMAXRETROACTIVELENGTH is a free data retrieval call binding the contract method 0x3486e32e. +// +// Solidity: function OPERATOR_SET_MAX_RETROACTIVE_LENGTH() view returns(uint32) +func (_RewardsCoordinator *RewardsCoordinatorCallerSession) OPERATORSETMAXRETROACTIVELENGTH() (uint32, error) { + return _RewardsCoordinator.Contract.OPERATORSETMAXRETROACTIVELENGTH(&_RewardsCoordinator.CallOpts) +} + // ActivationDelay is a free data retrieval call binding the contract method 0x3a8c0786. // // Solidity: function activationDelay() view returns(uint32) @@ -440,6 +513,37 @@ func (_RewardsCoordinator *RewardsCoordinatorCallerSession) ActivationDelay() (u return _RewardsCoordinator.Contract.ActivationDelay(&_RewardsCoordinator.CallOpts) } +// AvsDirectory is a free data retrieval call binding the contract method 0x6b3aa72e. +// +// Solidity: function avsDirectory() view returns(address) +func (_RewardsCoordinator *RewardsCoordinatorCaller) AvsDirectory(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _RewardsCoordinator.contract.Call(opts, &out, "avsDirectory") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// AvsDirectory is a free data retrieval call binding the contract method 0x6b3aa72e. +// +// Solidity: function avsDirectory() view returns(address) +func (_RewardsCoordinator *RewardsCoordinatorSession) AvsDirectory() (common.Address, error) { + return _RewardsCoordinator.Contract.AvsDirectory(&_RewardsCoordinator.CallOpts) +} + +// AvsDirectory is a free data retrieval call binding the contract method 0x6b3aa72e. +// +// Solidity: function avsDirectory() view returns(address) +func (_RewardsCoordinator *RewardsCoordinatorCallerSession) AvsDirectory() (common.Address, error) { + return _RewardsCoordinator.Contract.AvsDirectory(&_RewardsCoordinator.CallOpts) +} + // BeaconChainETHStrategy is a free data retrieval call binding the contract method 0x9104c319. // // Solidity: function beaconChainETHStrategy() view returns(address) @@ -1490,6 +1594,27 @@ func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) RenounceOwnershi return _RewardsCoordinator.Contract.RenounceOwnership(&_RewardsCoordinator.TransactOpts) } +// RewardOperatorSetForRange is a paid mutator transaction binding the contract method 0x2c9c60cf. +// +// Solidity: function rewardOperatorSetForRange((uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns() +func (_RewardsCoordinator *RewardsCoordinatorTransactor) RewardOperatorSetForRange(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorOperatorSetRewardsSubmission) (*types.Transaction, error) { + return _RewardsCoordinator.contract.Transact(opts, "rewardOperatorSetForRange", rewardsSubmissions) +} + +// RewardOperatorSetForRange is a paid mutator transaction binding the contract method 0x2c9c60cf. +// +// Solidity: function rewardOperatorSetForRange((uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns() +func (_RewardsCoordinator *RewardsCoordinatorSession) RewardOperatorSetForRange(rewardsSubmissions []IRewardsCoordinatorOperatorSetRewardsSubmission) (*types.Transaction, error) { + return _RewardsCoordinator.Contract.RewardOperatorSetForRange(&_RewardsCoordinator.TransactOpts, rewardsSubmissions) +} + +// RewardOperatorSetForRange is a paid mutator transaction binding the contract method 0x2c9c60cf. +// +// Solidity: function rewardOperatorSetForRange((uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns() +func (_RewardsCoordinator *RewardsCoordinatorTransactorSession) RewardOperatorSetForRange(rewardsSubmissions []IRewardsCoordinatorOperatorSetRewardsSubmission) (*types.Transaction, error) { + return _RewardsCoordinator.Contract.RewardOperatorSetForRange(&_RewardsCoordinator.TransactOpts, rewardsSubmissions) +} + // SetActivationDelay is a paid mutator transaction binding the contract method 0x58baaa3e. // // Solidity: function setActivationDelay(uint32 _activationDelay) returns() @@ -2892,6 +3017,169 @@ func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOperatorCommissionUp return event, nil } +// RewardsCoordinatorOperatorSetRewardCreatedIterator is returned from FilterOperatorSetRewardCreated and is used to iterate over the raw logs and unpacked data for OperatorSetRewardCreated events raised by the RewardsCoordinator contract. +type RewardsCoordinatorOperatorSetRewardCreatedIterator struct { + Event *RewardsCoordinatorOperatorSetRewardCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *RewardsCoordinatorOperatorSetRewardCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(RewardsCoordinatorOperatorSetRewardCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(RewardsCoordinatorOperatorSetRewardCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *RewardsCoordinatorOperatorSetRewardCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *RewardsCoordinatorOperatorSetRewardCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// RewardsCoordinatorOperatorSetRewardCreated represents a OperatorSetRewardCreated event raised by the RewardsCoordinator contract. +type RewardsCoordinatorOperatorSetRewardCreated struct { + Avs common.Address + SubmissionNonce *big.Int + RewardsSubmissionHash [32]byte + RewardsSubmission IRewardsCoordinatorOperatorSetRewardsSubmission + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorSetRewardCreated is a free log retrieval operation binding the contract event 0x29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b2. +// +// Solidity: event OperatorSetRewardCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, (uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission) +func (_RewardsCoordinator *RewardsCoordinatorFilterer) FilterOperatorSetRewardCreated(opts *bind.FilterOpts, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorOperatorSetRewardCreatedIterator, error) { + + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + var submissionNonceRule []interface{} + for _, submissionNonceItem := range submissionNonce { + submissionNonceRule = append(submissionNonceRule, submissionNonceItem) + } + var rewardsSubmissionHashRule []interface{} + for _, rewardsSubmissionHashItem := range rewardsSubmissionHash { + rewardsSubmissionHashRule = append(rewardsSubmissionHashRule, rewardsSubmissionHashItem) + } + + logs, sub, err := _RewardsCoordinator.contract.FilterLogs(opts, "OperatorSetRewardCreated", avsRule, submissionNonceRule, rewardsSubmissionHashRule) + if err != nil { + return nil, err + } + return &RewardsCoordinatorOperatorSetRewardCreatedIterator{contract: _RewardsCoordinator.contract, event: "OperatorSetRewardCreated", logs: logs, sub: sub}, nil +} + +// WatchOperatorSetRewardCreated is a free log subscription operation binding the contract event 0x29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b2. +// +// Solidity: event OperatorSetRewardCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, (uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission) +func (_RewardsCoordinator *RewardsCoordinatorFilterer) WatchOperatorSetRewardCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorOperatorSetRewardCreated, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error) { + + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + var submissionNonceRule []interface{} + for _, submissionNonceItem := range submissionNonce { + submissionNonceRule = append(submissionNonceRule, submissionNonceItem) + } + var rewardsSubmissionHashRule []interface{} + for _, rewardsSubmissionHashItem := range rewardsSubmissionHash { + rewardsSubmissionHashRule = append(rewardsSubmissionHashRule, rewardsSubmissionHashItem) + } + + logs, sub, err := _RewardsCoordinator.contract.WatchLogs(opts, "OperatorSetRewardCreated", avsRule, submissionNonceRule, rewardsSubmissionHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(RewardsCoordinatorOperatorSetRewardCreated) + if err := _RewardsCoordinator.contract.UnpackLog(event, "OperatorSetRewardCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorSetRewardCreated is a log parse operation binding the contract event 0x29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b2. +// +// Solidity: event OperatorSetRewardCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, (uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission) +func (_RewardsCoordinator *RewardsCoordinatorFilterer) ParseOperatorSetRewardCreated(log types.Log) (*RewardsCoordinatorOperatorSetRewardCreated, error) { + event := new(RewardsCoordinatorOperatorSetRewardCreated) + if err := _RewardsCoordinator.contract.UnpackLog(event, "OperatorSetRewardCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // RewardsCoordinatorOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the RewardsCoordinator contract. type RewardsCoordinatorOwnershipTransferredIterator struct { Event *RewardsCoordinatorOwnershipTransferred // Event containing the contract specifics and raw log diff --git a/pkg/bindings/RewardsCoordinatorStorage/binding.go b/pkg/bindings/RewardsCoordinatorStorage/binding.go index 00f73eec0..904f3c1ab 100644 --- a/pkg/bindings/RewardsCoordinatorStorage/binding.go +++ b/pkg/bindings/RewardsCoordinatorStorage/binding.go @@ -49,6 +49,17 @@ type IRewardsCoordinatorEarnerTreeMerkleLeaf struct { EarnerTokenRoot [32]byte } +// IRewardsCoordinatorOperatorSetRewardsSubmission is an auto generated low-level Go binding around an user-defined struct. +type IRewardsCoordinatorOperatorSetRewardsSubmission struct { + RewardType uint8 + OperatorSetId uint32 + StrategiesAndMultipliers []IRewardsCoordinatorStrategyAndMultiplier + Token common.Address + Amount *big.Int + StartTimestamp uint32 + Duration uint32 +} + // IRewardsCoordinatorRewardsMerkleClaim is an auto generated low-level Go binding around an user-defined struct. type IRewardsCoordinatorRewardsMerkleClaim struct { RootIndex uint32 @@ -83,7 +94,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorStorageMetaData contains all meta data concerning the RewardsCoordinatorStorage contract. var RewardsCoordinatorStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsDirectory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSDirectory\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmission\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardOperatorSetForRange\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.OperatorSetRewardsSubmission[]\",\"components\":[{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetRewardCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.OperatorSetRewardsSubmission\",\"components\":[{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", } // RewardsCoordinatorStorageABI is the input ABI used to generate the binding from. @@ -387,6 +398,68 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) MAXREW return _RewardsCoordinatorStorage.Contract.MAXREWARDSDURATION(&_RewardsCoordinatorStorage.CallOpts) } +// OPERATORSETGENESISREWARDSTIMESTAMP is a free data retrieval call binding the contract method 0xd11e9ae5. +// +// Solidity: function OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP() view returns(uint32) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) OPERATORSETGENESISREWARDSTIMESTAMP(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _RewardsCoordinatorStorage.contract.Call(opts, &out, "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// OPERATORSETGENESISREWARDSTIMESTAMP is a free data retrieval call binding the contract method 0xd11e9ae5. +// +// Solidity: function OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP() view returns(uint32) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) OPERATORSETGENESISREWARDSTIMESTAMP() (uint32, error) { + return _RewardsCoordinatorStorage.Contract.OPERATORSETGENESISREWARDSTIMESTAMP(&_RewardsCoordinatorStorage.CallOpts) +} + +// OPERATORSETGENESISREWARDSTIMESTAMP is a free data retrieval call binding the contract method 0xd11e9ae5. +// +// Solidity: function OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP() view returns(uint32) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) OPERATORSETGENESISREWARDSTIMESTAMP() (uint32, error) { + return _RewardsCoordinatorStorage.Contract.OPERATORSETGENESISREWARDSTIMESTAMP(&_RewardsCoordinatorStorage.CallOpts) +} + +// OPERATORSETMAXRETROACTIVELENGTH is a free data retrieval call binding the contract method 0x3486e32e. +// +// Solidity: function OPERATOR_SET_MAX_RETROACTIVE_LENGTH() view returns(uint32) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) OPERATORSETMAXRETROACTIVELENGTH(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _RewardsCoordinatorStorage.contract.Call(opts, &out, "OPERATOR_SET_MAX_RETROACTIVE_LENGTH") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// OPERATORSETMAXRETROACTIVELENGTH is a free data retrieval call binding the contract method 0x3486e32e. +// +// Solidity: function OPERATOR_SET_MAX_RETROACTIVE_LENGTH() view returns(uint32) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) OPERATORSETMAXRETROACTIVELENGTH() (uint32, error) { + return _RewardsCoordinatorStorage.Contract.OPERATORSETMAXRETROACTIVELENGTH(&_RewardsCoordinatorStorage.CallOpts) +} + +// OPERATORSETMAXRETROACTIVELENGTH is a free data retrieval call binding the contract method 0x3486e32e. +// +// Solidity: function OPERATOR_SET_MAX_RETROACTIVE_LENGTH() view returns(uint32) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) OPERATORSETMAXRETROACTIVELENGTH() (uint32, error) { + return _RewardsCoordinatorStorage.Contract.OPERATORSETMAXRETROACTIVELENGTH(&_RewardsCoordinatorStorage.CallOpts) +} + // ActivationDelay is a free data retrieval call binding the contract method 0x3a8c0786. // // Solidity: function activationDelay() view returns(uint32) @@ -418,6 +491,37 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) Activa return _RewardsCoordinatorStorage.Contract.ActivationDelay(&_RewardsCoordinatorStorage.CallOpts) } +// AvsDirectory is a free data retrieval call binding the contract method 0x6b3aa72e. +// +// Solidity: function avsDirectory() view returns(address) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCaller) AvsDirectory(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _RewardsCoordinatorStorage.contract.Call(opts, &out, "avsDirectory") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// AvsDirectory is a free data retrieval call binding the contract method 0x6b3aa72e. +// +// Solidity: function avsDirectory() view returns(address) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) AvsDirectory() (common.Address, error) { + return _RewardsCoordinatorStorage.Contract.AvsDirectory(&_RewardsCoordinatorStorage.CallOpts) +} + +// AvsDirectory is a free data retrieval call binding the contract method 0x6b3aa72e. +// +// Solidity: function avsDirectory() view returns(address) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageCallerSession) AvsDirectory() (common.Address, error) { + return _RewardsCoordinatorStorage.Contract.AvsDirectory(&_RewardsCoordinatorStorage.CallOpts) +} + // CalculateEarnerLeafHash is a free data retrieval call binding the contract method 0x149bc872. // // Solidity: function calculateEarnerLeafHash((address,bytes32) leaf) pure returns(bytes32) @@ -1167,6 +1271,27 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) Pr return _RewardsCoordinatorStorage.Contract.ProcessClaim(&_RewardsCoordinatorStorage.TransactOpts, claim, recipient) } +// RewardOperatorSetForRange is a paid mutator transaction binding the contract method 0x2c9c60cf. +// +// Solidity: function rewardOperatorSetForRange((uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns() +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactor) RewardOperatorSetForRange(opts *bind.TransactOpts, rewardsSubmissions []IRewardsCoordinatorOperatorSetRewardsSubmission) (*types.Transaction, error) { + return _RewardsCoordinatorStorage.contract.Transact(opts, "rewardOperatorSetForRange", rewardsSubmissions) +} + +// RewardOperatorSetForRange is a paid mutator transaction binding the contract method 0x2c9c60cf. +// +// Solidity: function rewardOperatorSetForRange((uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns() +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageSession) RewardOperatorSetForRange(rewardsSubmissions []IRewardsCoordinatorOperatorSetRewardsSubmission) (*types.Transaction, error) { + return _RewardsCoordinatorStorage.Contract.RewardOperatorSetForRange(&_RewardsCoordinatorStorage.TransactOpts, rewardsSubmissions) +} + +// RewardOperatorSetForRange is a paid mutator transaction binding the contract method 0x2c9c60cf. +// +// Solidity: function rewardOperatorSetForRange((uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32)[] rewardsSubmissions) returns() +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageTransactorSession) RewardOperatorSetForRange(rewardsSubmissions []IRewardsCoordinatorOperatorSetRewardsSubmission) (*types.Transaction, error) { + return _RewardsCoordinatorStorage.Contract.RewardOperatorSetForRange(&_RewardsCoordinatorStorage.TransactOpts, rewardsSubmissions) +} + // SetActivationDelay is a paid mutator transaction binding the contract method 0x58baaa3e. // // Solidity: function setActivationDelay(uint32 _activationDelay) returns() @@ -2372,6 +2497,169 @@ func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseOperat return event, nil } +// RewardsCoordinatorStorageOperatorSetRewardCreatedIterator is returned from FilterOperatorSetRewardCreated and is used to iterate over the raw logs and unpacked data for OperatorSetRewardCreated events raised by the RewardsCoordinatorStorage contract. +type RewardsCoordinatorStorageOperatorSetRewardCreatedIterator struct { + Event *RewardsCoordinatorStorageOperatorSetRewardCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *RewardsCoordinatorStorageOperatorSetRewardCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(RewardsCoordinatorStorageOperatorSetRewardCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(RewardsCoordinatorStorageOperatorSetRewardCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *RewardsCoordinatorStorageOperatorSetRewardCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *RewardsCoordinatorStorageOperatorSetRewardCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// RewardsCoordinatorStorageOperatorSetRewardCreated represents a OperatorSetRewardCreated event raised by the RewardsCoordinatorStorage contract. +type RewardsCoordinatorStorageOperatorSetRewardCreated struct { + Avs common.Address + SubmissionNonce *big.Int + RewardsSubmissionHash [32]byte + RewardsSubmission IRewardsCoordinatorOperatorSetRewardsSubmission + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOperatorSetRewardCreated is a free log retrieval operation binding the contract event 0x29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b2. +// +// Solidity: event OperatorSetRewardCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, (uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) FilterOperatorSetRewardCreated(opts *bind.FilterOpts, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (*RewardsCoordinatorStorageOperatorSetRewardCreatedIterator, error) { + + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + var submissionNonceRule []interface{} + for _, submissionNonceItem := range submissionNonce { + submissionNonceRule = append(submissionNonceRule, submissionNonceItem) + } + var rewardsSubmissionHashRule []interface{} + for _, rewardsSubmissionHashItem := range rewardsSubmissionHash { + rewardsSubmissionHashRule = append(rewardsSubmissionHashRule, rewardsSubmissionHashItem) + } + + logs, sub, err := _RewardsCoordinatorStorage.contract.FilterLogs(opts, "OperatorSetRewardCreated", avsRule, submissionNonceRule, rewardsSubmissionHashRule) + if err != nil { + return nil, err + } + return &RewardsCoordinatorStorageOperatorSetRewardCreatedIterator{contract: _RewardsCoordinatorStorage.contract, event: "OperatorSetRewardCreated", logs: logs, sub: sub}, nil +} + +// WatchOperatorSetRewardCreated is a free log subscription operation binding the contract event 0x29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b2. +// +// Solidity: event OperatorSetRewardCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, (uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) WatchOperatorSetRewardCreated(opts *bind.WatchOpts, sink chan<- *RewardsCoordinatorStorageOperatorSetRewardCreated, avs []common.Address, submissionNonce []*big.Int, rewardsSubmissionHash [][32]byte) (event.Subscription, error) { + + var avsRule []interface{} + for _, avsItem := range avs { + avsRule = append(avsRule, avsItem) + } + var submissionNonceRule []interface{} + for _, submissionNonceItem := range submissionNonce { + submissionNonceRule = append(submissionNonceRule, submissionNonceItem) + } + var rewardsSubmissionHashRule []interface{} + for _, rewardsSubmissionHashItem := range rewardsSubmissionHash { + rewardsSubmissionHashRule = append(rewardsSubmissionHashRule, rewardsSubmissionHashItem) + } + + logs, sub, err := _RewardsCoordinatorStorage.contract.WatchLogs(opts, "OperatorSetRewardCreated", avsRule, submissionNonceRule, rewardsSubmissionHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(RewardsCoordinatorStorageOperatorSetRewardCreated) + if err := _RewardsCoordinatorStorage.contract.UnpackLog(event, "OperatorSetRewardCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOperatorSetRewardCreated is a log parse operation binding the contract event 0x29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b2. +// +// Solidity: event OperatorSetRewardCreated(address indexed avs, uint256 indexed submissionNonce, bytes32 indexed rewardsSubmissionHash, (uint8,uint32,(address,uint96)[],address,uint256,uint32,uint32) rewardsSubmission) +func (_RewardsCoordinatorStorage *RewardsCoordinatorStorageFilterer) ParseOperatorSetRewardCreated(log types.Log) (*RewardsCoordinatorStorageOperatorSetRewardCreated, error) { + event := new(RewardsCoordinatorStorageOperatorSetRewardCreated) + if err := _RewardsCoordinatorStorage.contract.UnpackLog(event, "OperatorSetRewardCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // RewardsCoordinatorStorageRewardsClaimedIterator is returned from FilterRewardsClaimed and is used to iterate over the raw logs and unpacked data for RewardsClaimed events raised by the RewardsCoordinatorStorage contract. type RewardsCoordinatorStorageRewardsClaimedIterator struct { Event *RewardsCoordinatorStorageRewardsClaimed // Event containing the contract specifics and raw log diff --git a/script/configs/holesky/Deploy_RewardsCoordinator.holesky.config.json b/script/configs/holesky/Deploy_RewardsCoordinator.holesky.config.json index 93a1ee271..d012c178d 100644 --- a/script/configs/holesky/Deploy_RewardsCoordinator.holesky.config.json +++ b/script/configs/holesky/Deploy_RewardsCoordinator.holesky.config.json @@ -33,7 +33,9 @@ "rewards_updater_address": "0x18a0f92Ad9645385E8A8f3db7d0f6CF7aBBb0aD4", "activation_delay": 7200, "calculation_interval_seconds": 604800, - "global_operator_commission_bips": 1000 + "global_operator_commission_bips": 1000, + "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1719964800, + "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000 }, "avsDirectory": { "init_paused_status": 0 diff --git a/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol b/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol index 74fce373b..855122a1f 100644 --- a/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol +++ b/script/deploy/holesky/Deploy_Test_RewardsCoordinator.s.sol @@ -46,11 +46,14 @@ contract Deploy_Test_RewardsCoordinator is ExistingDeploymentParser { rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManager, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); rewardsCoordinator = RewardsCoordinator( address( @@ -79,11 +82,14 @@ contract Deploy_Test_RewardsCoordinator is ExistingDeploymentParser { rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManager, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); eigenLayerProxyAdmin.upgrade( diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol index a16bde6af..a8bd3a0e7 100644 --- a/script/utils/ExistingDeploymentParser.sol +++ b/script/utils/ExistingDeploymentParser.sol @@ -120,6 +120,8 @@ contract ExistingDeploymentParser is Script, Test { uint32 REWARDS_COORDINATOR_ACTIVATION_DELAY; uint32 REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS; uint32 REWARDS_COORDINATOR_GLOBAL_OPERATOR_COMMISSION_BIPS; + uint32 REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; + uint32 REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH; // EigenPodManager uint256 EIGENPOD_MANAGER_INIT_PAUSED_STATUS; uint64 EIGENPOD_MANAGER_DENEB_FORK_TIMESTAMP; @@ -326,6 +328,12 @@ contract ExistingDeploymentParser is Script, Test { REWARDS_COORDINATOR_GLOBAL_OPERATOR_COMMISSION_BIPS = uint32( stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.global_operator_commission_bips") ); + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP = uint32( + stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP") + ); + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH = uint32( + stdJson.readUint(initialDeploymentData, ".rewardsCoordinator.OPERATOR_SET_MAX_RETROACTIVE_LENGTH") + ); // AVSDirectory AVS_DIRECTORY_INIT_PAUSED_STATUS = stdJson.readUint(initialDeploymentData, ".avsDirectory.init_paused_status"); // EigenPodManager diff --git a/src/contracts/core/RewardsCoordinator.sol b/src/contracts/core/RewardsCoordinator.sol index 828d49b01..fc3e13094 100644 --- a/src/contracts/core/RewardsCoordinator.sol +++ b/src/contracts/core/RewardsCoordinator.sol @@ -47,6 +47,8 @@ contract RewardsCoordinator is uint8 internal constant PAUSED_PROCESS_CLAIM = 2; /// @dev Index for flag that pauses submitRoots and disableRoot uint8 internal constant PAUSED_SUBMIT_DISABLE_ROOTS = 3; + /// @dev Index for flag that pauses calling rewardOperatorSetForRange + uint8 internal constant PAUSED_REWARD_OPERATOR_SET = 4; /// @dev Salt for the earner leaf, meant to distinguish from tokenLeaf since they have the same sized data uint8 internal constant EARNER_LEAF_SALT = 0; @@ -73,20 +75,26 @@ contract RewardsCoordinator is constructor( IDelegationManager _delegationManager, IStrategyManager _strategyManager, + IAVSDirectory _avsDirectory, uint32 _CALCULATION_INTERVAL_SECONDS, uint32 _MAX_REWARDS_DURATION, uint32 _MAX_RETROACTIVE_LENGTH, uint32 _MAX_FUTURE_LENGTH, - uint32 __GENESIS_REWARDS_TIMESTAMP + uint32 _GENESIS_REWARDS_TIMESTAMP, + uint32 _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + uint32 _OPERATOR_SET_MAX_RETROACTIVE_LENGTH ) RewardsCoordinatorStorage( _delegationManager, _strategyManager, + _avsDirectory, _CALCULATION_INTERVAL_SECONDS, _MAX_REWARDS_DURATION, _MAX_RETROACTIVE_LENGTH, _MAX_FUTURE_LENGTH, - __GENESIS_REWARDS_TIMESTAMP + _GENESIS_REWARDS_TIMESTAMP, + _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + _OPERATOR_SET_MAX_RETROACTIVE_LENGTH ) { _disableInitializers(); @@ -120,7 +128,9 @@ contract RewardsCoordinator is */ /** - * @notice Creates a new rewards submission on behalf of an AVS, to be split amongst the + * @notice Legacy interface to be DEPRECATED in future releases. See rewardOperatorSetForRange + * for a more updated interface. + * Creates a new rewards submission on behalf of an AVS, to be split amongst the * set of stakers delegated to operators who are registered to the `avs` * @param rewardsSubmissions The rewards submissions being created * @dev Expected to be called by the ServiceManager of the AVS on behalf of which the submission is being made @@ -140,7 +150,15 @@ contract RewardsCoordinator is uint256 nonce = submissionNonce[msg.sender]; bytes32 rewardsSubmissionHash = keccak256(abi.encode(msg.sender, nonce, rewardsSubmission)); - _validateRewardsSubmission(rewardsSubmission); + _validateRewardsSubmission( + rewardsSubmission.strategiesAndMultipliers, + rewardsSubmission.token, + rewardsSubmission.amount, + rewardsSubmission.startTimestamp, + rewardsSubmission.duration, + MAX_RETROACTIVE_LENGTH, + GENESIS_REWARDS_TIMESTAMP + ); isAVSRewardsSubmissionHash[msg.sender][rewardsSubmissionHash] = true; submissionNonce[msg.sender] = nonce + 1; @@ -171,7 +189,15 @@ contract RewardsCoordinator is uint256 nonce = submissionNonce[msg.sender]; bytes32 rewardsSubmissionForAllHash = keccak256(abi.encode(msg.sender, nonce, rewardsSubmission)); - _validateRewardsSubmission(rewardsSubmission); + _validateRewardsSubmission( + rewardsSubmission.strategiesAndMultipliers, + rewardsSubmission.token, + rewardsSubmission.amount, + rewardsSubmission.startTimestamp, + rewardsSubmission.duration, + MAX_RETROACTIVE_LENGTH, + GENESIS_REWARDS_TIMESTAMP + ); isRewardsSubmissionForAllHash[msg.sender][rewardsSubmissionForAllHash] = true; submissionNonce[msg.sender] = nonce + 1; @@ -185,6 +211,55 @@ contract RewardsCoordinator is } } + /** + * @notice Creates a new rewards submission on behalf of an AVS for a given operatorSet, + * to be split amongst the set of stakers delegated to operators who are + * registered to the msg.sender AVS and the given operatorSetId + * + * @param rewardsSubmissions The operatorSet rewards submission being created for + * + * @dev msg.sender is the AVS in the operatorSet the rewards submission is being made to + * @dev AVSs set their reward type depending on what metric they want rewards + * distributed proportional to + * @dev The tokens in the rewards submissions are sent to the `RewardsCoordinator` contract + * @dev Strategies of each rewards submission must be in ascending order of addresses to check for duplicates + */ + function rewardOperatorSetForRange(OperatorSetRewardsSubmission[] calldata rewardsSubmissions) + external + onlyWhenNotPaused(PAUSED_REWARD_OPERATOR_SET) + nonReentrant + { + for (uint256 i = 0; i < rewardsSubmissions.length;) { + OperatorSetRewardsSubmission calldata rewardsSubmission = rewardsSubmissions[i]; + uint256 nonce = submissionNonce[msg.sender]; + bytes32 rewardsSubmissionHash = keccak256(abi.encode(msg.sender, nonce, rewardsSubmission)); + + require( + avsDirectory.isOperatorSet(msg.sender, rewardsSubmission.operatorSetId), + "RewardsCoordinator.rewardOperatorSetForRange: invalid operatorSet" + ); + _validateRewardsSubmission( + rewardsSubmission.strategiesAndMultipliers, + rewardsSubmission.token, + rewardsSubmission.amount, + rewardsSubmission.startTimestamp, + rewardsSubmission.duration, + OPERATOR_SET_MAX_RETROACTIVE_LENGTH, + OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP + ); + + isAVSRewardsSubmissionHash[msg.sender][rewardsSubmissionHash] = true; + submissionNonce[msg.sender] = nonce + 1; + + emit OperatorSetRewardCreated(msg.sender, nonce, rewardsSubmissionHash, rewardsSubmission); + rewardsSubmission.token.safeTransferFrom(msg.sender, address(this), rewardsSubmission.amount); + + unchecked { + ++i; + } + } + } + /** * @notice Claim rewards against a given root (read from _distributionRoots[claim.rootIndex]). * Earnings are cumulative so earners don't have to claim against all distribution roots they have earnings for, @@ -367,44 +442,49 @@ contract RewardsCoordinator is */ /** - * @notice Validate a RewardsSubmission. Called from both `createAVSRewardsSubmission` and `createRewardsForAllSubmission` + * @notice Validate a RewardsSubmission. Called from `createAVSRewardsSubmission`, `createRewardsForAllSubmission`, + * and `rewardOperatorSetForRange` + * + * @dev The callee must specify the `retroactiveLength` and `genesisRewardsTimestamp` as those values + * are different depending on the rewards submission type. */ - function _validateRewardsSubmission(RewardsSubmission calldata rewardsSubmission) internal view { - require( - rewardsSubmission.strategiesAndMultipliers.length > 0, - "RewardsCoordinator._validateRewardsSubmission: no strategies set" - ); - require(rewardsSubmission.amount > 0, "RewardsCoordinator._validateRewardsSubmission: amount cannot be 0"); - require( - rewardsSubmission.amount <= MAX_REWARDS_AMOUNT, - "RewardsCoordinator._validateRewardsSubmission: amount too large" - ); + function _validateRewardsSubmission( + StrategyAndMultiplier[] calldata strategiesAndMultipliers, + IERC20 token, + uint256 amount, + uint32 startTimestamp, + uint32 duration, + uint32 maxRetroactiveLength, + uint32 genesisRewardsTimestamp + ) internal view { + require(strategiesAndMultipliers.length > 0, "RewardsCoordinator._validateRewardsSubmission: no strategies set"); + require(amount > 0, "RewardsCoordinator._validateRewardsSubmission: amount cannot be 0"); + require(amount <= MAX_REWARDS_AMOUNT, "RewardsCoordinator._validateRewardsSubmission: amount too large"); require( - rewardsSubmission.duration <= MAX_REWARDS_DURATION, + duration <= MAX_REWARDS_DURATION, "RewardsCoordinator._validateRewardsSubmission: duration exceeds MAX_REWARDS_DURATION" ); require( - rewardsSubmission.duration % CALCULATION_INTERVAL_SECONDS == 0, + duration % CALCULATION_INTERVAL_SECONDS == 0, "RewardsCoordinator._validateRewardsSubmission: duration must be a multiple of CALCULATION_INTERVAL_SECONDS" ); require( - rewardsSubmission.startTimestamp % CALCULATION_INTERVAL_SECONDS == 0, + startTimestamp % CALCULATION_INTERVAL_SECONDS == 0, "RewardsCoordinator._validateRewardsSubmission: startTimestamp must be a multiple of CALCULATION_INTERVAL_SECONDS" ); require( - block.timestamp - MAX_RETROACTIVE_LENGTH <= rewardsSubmission.startTimestamp - && GENESIS_REWARDS_TIMESTAMP <= rewardsSubmission.startTimestamp, + block.timestamp - maxRetroactiveLength <= startTimestamp && genesisRewardsTimestamp <= startTimestamp, "RewardsCoordinator._validateRewardsSubmission: startTimestamp too far in the past" ); require( - rewardsSubmission.startTimestamp <= block.timestamp + MAX_FUTURE_LENGTH, + startTimestamp <= block.timestamp + MAX_FUTURE_LENGTH, "RewardsCoordinator._validateRewardsSubmission: startTimestamp too far in the future" ); // Require rewardsSubmission is for whitelisted strategy or beaconChainETHStrategy address currAddress = address(0); - for (uint256 i = 0; i < rewardsSubmission.strategiesAndMultipliers.length; ++i) { - IStrategy strategy = rewardsSubmission.strategiesAndMultipliers[i].strategy; + for (uint256 i = 0; i < strategiesAndMultipliers.length; ++i) { + IStrategy strategy = strategiesAndMultipliers[i].strategy; require( strategyManager.strategyIsWhitelistedForDeposit(strategy) || strategy == beaconChainETHStrategy, "RewardsCoordinator._validateRewardsSubmission: invalid strategy considered" diff --git a/src/contracts/core/RewardsCoordinatorStorage.sol b/src/contracts/core/RewardsCoordinatorStorage.sol index 5e30606fd..0ca246bca 100644 --- a/src/contracts/core/RewardsCoordinatorStorage.sol +++ b/src/contracts/core/RewardsCoordinatorStorage.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.12; import "../interfaces/IStrategyManager.sol"; import "../interfaces/IDelegationManager.sol"; +import "../interfaces/IAVSDirectory.sol"; import "../interfaces/IRewardsCoordinator.sol"; /** @@ -18,26 +19,38 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { * */ + // Constants for all reward types /// @notice The interval in seconds at which the calculation for rewards distribution is done. - /// @dev RewardsSubmission durations must be multiples of this interval. This is going to be configured to 1 week + /// @dev ALL RewardsSubmission durations must be multiples of this interval. This is going to be configured to 1 week uint32 public immutable CALCULATION_INTERVAL_SECONDS; - /// @notice The maximum amount of time (seconds) that a rewards submission can span over + /// @notice The maximum amount of time (seconds) that ALL rewards submission can span over uint32 public immutable MAX_REWARDS_DURATION; - /// @notice max amount of time (seconds) that a rewards submission can start in the past - uint32 public immutable MAX_RETROACTIVE_LENGTH; - /// @notice max amount of time (seconds) that a rewards submission can start in the future + /// @notice max amount of time (seconds) that ALL rewards submission can start in the future uint32 public immutable MAX_FUTURE_LENGTH; - /// @notice absolute min timestamp (seconds) that a rewards submission can start at - uint32 public immutable GENESIS_REWARDS_TIMESTAMP; /// @notice The cadence at which a snapshot is taken offchain for calculating rewards distributions uint32 internal constant SNAPSHOT_CADENCE = 1 days; + // V1 Rewards Constants + /// @notice absolute min timestamp (seconds) that a V1 rewards submission can start at + uint32 public immutable GENESIS_REWARDS_TIMESTAMP; + /// @notice max amount of time (seconds) that a V1 rewards submission can start in the past + uint32 public immutable MAX_RETROACTIVE_LENGTH; + + // OperatorSet Rewards Constants + /// @notice absolute min timestamp (seconds) that an operatorSet rewards submission can start at + uint32 public immutable OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; + /// @notice max of time (seconds) that an operatorSet rewards submission can start in the past + uint32 public immutable OPERATOR_SET_MAX_RETROACTIVE_LENGTH; + /// @notice The DelegationManager contract for EigenLayer IDelegationManager public immutable delegationManager; /// @notice The StrategyManager contract for EigenLayer IStrategyManager public immutable strategyManager; + /// @notice The AVSDirectory contract for EigenLayer + IAVSDirectory public immutable avsDirectory; + /** * * STORAGE @@ -77,12 +90,19 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { /// @notice Used for unique rewardsSubmissionHashes per AVS and for RewardsForAllSubmitters mapping(address => uint256) public submissionNonce; + /// @notice Mapping: avs => avsRewardsSubmissionHash => bool to check if rewards submission hash has been submitted mapping(address => mapping(bytes32 => bool)) public isAVSRewardsSubmissionHash; + /// @notice Mapping: avs => rewardsSubmissionForALlHash => bool to check if rewards submission hash for all has been submitted mapping(address => mapping(bytes32 => bool)) public isRewardsSubmissionForAllHash; + /// @notice Mapping: address => bool to check if the address is permissioned to call createRewardsForAllSubmission mapping(address => bool) public isRewardsForAllSubmitter; + + /// @notice Mapping: avs => rewardsSubmissionHash => bool to check if operatorSet rewards submission hash has been submitted + mapping(address => mapping(bytes32 => bool)) isOperatorSetRewardsSubmissionHash; + /// @notice Mapping: operator => avs => operatorSetId => OperatorCommissionUpdate history mapping(address => mapping(address => mapping(uint32 => mapping(RewardType => OperatorCommissionUpdate[])))) public operatorCommissionUpdates; @@ -90,11 +110,14 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { constructor( IDelegationManager _delegationManager, IStrategyManager _strategyManager, + IAVSDirectory _avsDirectory, uint32 _CALCULATION_INTERVAL_SECONDS, uint32 _MAX_REWARDS_DURATION, uint32 _MAX_RETROACTIVE_LENGTH, uint32 _MAX_FUTURE_LENGTH, - uint32 _GENESIS_REWARDS_TIMESTAMP + uint32 _GENESIS_REWARDS_TIMESTAMP, + uint32 _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + uint32 _OPERATOR_SET_MAX_RETROACTIVE_LENGTH ) { require( _GENESIS_REWARDS_TIMESTAMP % _CALCULATION_INTERVAL_SECONDS == 0, @@ -104,13 +127,20 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { _CALCULATION_INTERVAL_SECONDS % SNAPSHOT_CADENCE == 0, "RewardsCoordinator: CALCULATION_INTERVAL_SECONDS must be a multiple of SNAPSHOT_CADENCE" ); + require( + _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP % _CALCULATION_INTERVAL_SECONDS == 0, + "RewardsCoordinator: OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP must be a multiple of CALCULATION_INTERVAL_SECONDS" + ); delegationManager = _delegationManager; strategyManager = _strategyManager; + avsDirectory = _avsDirectory; CALCULATION_INTERVAL_SECONDS = _CALCULATION_INTERVAL_SECONDS; MAX_REWARDS_DURATION = _MAX_REWARDS_DURATION; MAX_RETROACTIVE_LENGTH = _MAX_RETROACTIVE_LENGTH; MAX_FUTURE_LENGTH = _MAX_FUTURE_LENGTH; GENESIS_REWARDS_TIMESTAMP = _GENESIS_REWARDS_TIMESTAMP; + OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP = _OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; + OPERATOR_SET_MAX_RETROACTIVE_LENGTH = _OPERATOR_SET_MAX_RETROACTIVE_LENGTH; } /** @@ -118,5 +148,5 @@ abstract contract RewardsCoordinatorStorage is IRewardsCoordinator { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[39] private __gap; + uint256[38] private __gap; } diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index 5e91d1d7b..ca66898c9 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -176,6 +176,10 @@ interface IAVSDirectory is ISignatureUtils { function isMember(address avs, address operator, uint32 operatorSetId) external view returns (bool); + function isOperatorSetAVS(address avs) external view returns (bool); + + function isOperatorSet(address avs, uint32 operatorSetId) external view returns (bool); + /** * @notice Calculates the digest hash to be signed by an operator to register with an AVS. * diff --git a/src/contracts/interfaces/IRewardsCoordinator.sol b/src/contracts/interfaces/IRewardsCoordinator.sol index 3f1f0eae2..fed8bb87e 100644 --- a/src/contracts/interfaces/IRewardsCoordinator.sol +++ b/src/contracts/interfaces/IRewardsCoordinator.sol @@ -19,8 +19,7 @@ interface IRewardsCoordinator { /// @notice Reward type enum RewardType { - DELEGATED_STAKE, - UNIFORM + DELEGATED_STAKE } /** @@ -67,6 +66,22 @@ interface IRewardsCoordinator { uint32 startTimestamp; uint32 duration; } + /** + * @notice OperatorSetRewardsSubmission struct submitted by AVSs when making rewards to operatorSets + * @notice The retroactive range applies from RewardsSubmission + * @param RewardType The type of reward to be distributed for. + * @param operatorSetId The operatorSetId to distribute rewards to + * @param strategiesAndMultipliers The strategies and their relative weights + * cannot have duplicate strategies and need to be sorted in ascending address order + * @param token The rewards token to be distributed + * @param amount The total amount of tokens to be distributed + * @param startTimestamp The timestamp (seconds) at which the submission range is considered for distribution + * could start in the past or in the future but within a valid range. See the diagram above. + * @param duration The duration of the submission range in seconds. Must be <= MAX_REWARDS_DURATION + * @dev The sliding window from `RewardsSubmission` applies to `OperatorSetRewardsSubmission`, with + * using `OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP` instead of `GENESIS_REWARDS_TIMESTAMP` and + * `OPERATOR_SET_MAX_RETROACTIVE_LENGTH` instead of `MAX_RETROACTIVE_LENGTH` + */ struct OperatorSetRewardsSubmission { RewardType rewardType; @@ -160,6 +175,15 @@ interface IRewardsCoordinator { bytes32 indexed rewardsSubmissionHash, RewardsSubmission rewardsSubmission ); + + /// @notice emitted when an AVS creates a valid OperatorSetRewardsSubmission + event OperatorSetRewardCreated( + address indexed avs, + uint256 indexed submissionNonce, + bytes32 indexed rewardsSubmissionHash, + OperatorSetRewardsSubmission rewardsSubmission + ); + /// @notice emitted when a valid RewardsSubmission is created for all stakers by a valid submitter event RewardsSubmissionForAllCreated( address indexed submitter, @@ -167,13 +191,18 @@ interface IRewardsCoordinator { bytes32 indexed rewardsSubmissionHash, RewardsSubmission rewardsSubmission ); + /// @notice rewardsUpdater is responsible for submiting DistributionRoots, only owner can set rewardsUpdater event RewardsUpdaterSet(address indexed oldRewardsUpdater, address indexed newRewardsUpdater); + event RewardsForAllSubmitterSet( address indexed rewardsForAllSubmitter, bool indexed oldValue, bool indexed newValue ); + event ActivationDelaySet(uint32 oldActivationDelay, uint32 newActivationDelay); + event GlobalCommissionBipsSet(uint16 oldGlobalCommissionBips, uint16 newGlobalCommissionBips); + /// @notice emitted when an operator commission is set for a specific OperatorSet and RewardType event OperatorCommissionUpdated( address indexed operator, @@ -182,7 +211,9 @@ interface IRewardsCoordinator { uint16 newCommissionBips, uint32 effectTimestamp ); + event ClaimerForSet(address indexed earner, address indexed oldClaimer, address indexed claimer); + /// @notice rootIndex is the specific array index of the newly created root in the storage array event DistributionRootSubmitted( uint32 indexed rootIndex, @@ -190,7 +221,9 @@ interface IRewardsCoordinator { uint32 indexed rewardsCalculationEndTimestamp, uint32 activatedAt ); + event DistributionRootDisabled(uint32 indexed rootIndex); + /// @notice root is one of the submitted distribution roots that was claimed against event RewardsClaimed( bytes32 root, @@ -287,7 +320,9 @@ interface IRewardsCoordinator { */ /** - * @notice Creates a new rewards submission on behalf of an AVS, to be split amongst the + * @notice Legacy interface to be DEPRECATED in future releases. See rewardOperatorSetForRange + * for a more updated interface. + * Creates a new rewards submission on behalf of an AVS, to be split amongst the * set of stakers delegated to operators who are registered to the `avs` * @param rewardsSubmissions The rewards submissions being created * @dev Expected to be called by the ServiceManager of the AVS on behalf of which the submission is being made @@ -299,6 +334,21 @@ interface IRewardsCoordinator { */ function createAVSRewardsSubmission(RewardsSubmission[] calldata rewardsSubmissions) external; + /** + * @notice Creates a new rewards submission on behalf of an AVS for a given operatorSet, + * to be split amongst the set of stakers delegated to operators who are + * registered to the msg.sender AVS and the given operatorSetId + * + * @param rewardsSubmissions The operatorSet rewards submission being created for + * + * @dev msg.sender is the AVS in the operatorSet the rewards submission is being made to + * @dev AVSs set their reward type depending on what metric they want rewards + * distributed proportional to + * @dev The tokens in the rewards submissions are sent to the `RewardsCoordinator` contract + * @dev Strategies of each rewards submission must be in ascending order of addresses to check for duplicates + */ + function rewardOperatorSetForRange(OperatorSetRewardsSubmission[] calldata rewardsSubmissions) external; + /** * @notice similar to `createAVSRewardsSubmission` except the rewards are split amongst *all* stakers * rather than just those delegated to operators who are registered to a single avs and is diff --git a/src/test/events/IRewardsCoordinatorEvents.sol b/src/test/events/IRewardsCoordinatorEvents.sol index 67e427a30..c6a744820 100644 --- a/src/test/events/IRewardsCoordinatorEvents.sol +++ b/src/test/events/IRewardsCoordinatorEvents.sol @@ -55,6 +55,14 @@ interface IRewardsCoordinatorEvents { IERC20 token, uint256 claimedAmount ); + /// @notice emitted when an AVS creates a valid OperatorSetRewardsSubmission + event OperatorSetRewardCreated( + address indexed avs, + uint256 indexed submissionNonce, + bytes32 indexed rewardsSubmissionHash, + IRewardsCoordinator.OperatorSetRewardsSubmission rewardsSubmission + ); + diff --git a/src/test/mocks/AVSDirectoryMock.sol b/src/test/mocks/AVSDirectoryMock.sol new file mode 100644 index 000000000..8361d2944 --- /dev/null +++ b/src/test/mocks/AVSDirectoryMock.sol @@ -0,0 +1,83 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.9; + +import "forge-std/Test.sol"; +import "../../contracts/interfaces/IAVSDirectory.sol"; + +contract AVSDirectoryMock is IAVSDirectory, Test { + function createOperatorSets(uint32[] calldata operatorSetIds) external {} + + function becomeOperatorSetAVS() external {} + + function migrateOperatorsToOperatorSets( + address[] calldata operators, + uint32[][] calldata operatorSetIds + ) external {} + + function registerOperatorToOperatorSets( + address operator, + uint32[] calldata operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external {} + + function deregisterOperatorFromOperatorSets(address operator, uint32[] calldata operatorSetIds) external {} + + function forceDeregisterFromOperatorSets( + address operator, + address avs, + uint32[] calldata operatorSetIds, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external {} + + function registerOperatorToAVS( + address operator, + ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + ) external {} + + function deregisterOperatorFromAVS(address operator) external {} + + function updateAVSMetadataURI(string calldata metadataURI) external {} + + function cancelSalt(bytes32 salt) external {} + + function operatorSaltIsSpent(address operator, bytes32 salt) external view returns (bool) {} + + function isMember(address avs, address operator, uint32 operatorSetId) external view returns (bool) {} + + function isOperatorSetAVS(address avs) external view returns (bool) {} + + function isOperatorSet(address avs, uint32 operatorSetId) external view returns (bool) { + return true; + } + + function calculateOperatorAVSRegistrationDigestHash( + address operator, + address avs, + bytes32 salt, + uint256 expiry + ) external view returns (bytes32) {} + + function calculateOperatorSetRegistrationDigestHash( + address avs, + uint32[] calldata operatorSetIds, + bytes32 salt, + uint256 expiry + ) external view returns (bytes32) {} + + function calculateOperatorSetForceDeregistrationTypehash( + address avs, + uint32[] calldata operatorSetIds, + bytes32 salt, + uint256 expiry + ) external view returns (bytes32) {} + + /// @notice Getter function for the current EIP-712 domain separator for this contract. + /// @dev The domain separator will change in the event of a fork that changes the ChainID. + function domainSeparator() external view returns (bytes32) {} + + /// @notice The EIP-712 typehash for the Registration struct used by the contract. + function OPERATOR_AVS_REGISTRATION_TYPEHASH() external view returns (bytes32) {} + + /// @notice The EIP-712 typehash for the OperatorSetRegistration struct used by the contract. + function OPERATOR_SET_REGISTRATION_TYPEHASH() external view returns (bytes32) {} +} \ No newline at end of file diff --git a/src/test/unit/RewardsCoordinatorUnit.t.sol b/src/test/unit/RewardsCoordinatorUnit.t.sol index 7a9f73ef7..9bf2a8806 100644 --- a/src/test/unit/RewardsCoordinatorUnit.t.sol +++ b/src/test/unit/RewardsCoordinatorUnit.t.sol @@ -55,6 +55,12 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin /// @notice absolute min timestamp that a rewards can start at uint32 GENESIS_REWARDS_TIMESTAMP = 1712188800; + /// @notice Lower bound start range is ~1 month into the past, multiple of CALCULATION_INTERVAL_SECONDS + uint32 OPERATOR_SET_MAX_RETROACTIVE_LENGTH = 28 days; + /// @notice absolute min timestamp (seconds) that an operatorSet rewards submission can start at + uint32 OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP = 1720656000; + + /// @notice Delay in timestamp before a posted root can be claimed against uint32 activationDelay = 7 days; /// @notice The activation delay until an updated operator's commission bips takes effect @@ -80,6 +86,9 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin /// @dev Index for flag that pauses submitRoots uint8 internal constant PAUSED_SUBMIT_DISABLE_ROOTS = 3; + /// @dev Index for flag that pauses calling rewardOperatorSetForRange + uint8 internal constant PAUSED_REWARD_OPERATOR_SET = 4; + // RewardsCoordinator entities address rewardsUpdater = address(1000); address defaultAVS = address(1001); @@ -94,11 +103,14 @@ contract RewardsCoordinatorUnitTests is EigenLayerUnitTestSetup, IRewardsCoordin rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManagerMock, strategyManagerMock, + avsDirectoryMock, CALCULATION_INTERVAL_SECONDS, MAX_REWARDS_DURATION, MAX_RETROACTIVE_LENGTH, MAX_FUTURE_LENGTH, - GENESIS_REWARDS_TIMESTAMP + GENESIS_REWARDS_TIMESTAMP, + OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); rewardsCoordinator = RewardsCoordinator( address( @@ -2324,3 +2336,417 @@ contract RewardsCoordinatorUnitTests_operatorCommission is RewardsCoordinatorUni ); } } + +contract RewardsCoordinatorUnitTests_rewardOperatorSetForRange is RewardsCoordinatorUnitTests { + uint32 defaultOperatorSetId = 0; + uint32 validDuration = 2 weeks; + uint32 validStartTimestamp = OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; + + function test_Revert_WhenPaused() public { + cheats.prank(pauser); + rewardsCoordinator.pause(2 ** PAUSED_REWARD_OPERATOR_SET); + + cheats.expectRevert("Pausable: index is paused"); + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions; + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_WhenReentrancy() public { + uint256 amount = 1e38-1; + Reenterer reenterer = new Reenterer(); + + reenterer.prepareReturnData(abi.encode(amount)); + + address targetToUse = address(rewardsCoordinator); + uint256 msgValueToUse = 0; + + _deployMockRewardTokens(address(this), 1); + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(reenterer)), + amount: amount, + startTimestamp: uint32(block.timestamp), + duration: 0 + }); + + bytes memory calldataToUse = abi.encodeWithSelector(RewardsCoordinator.createAVSRewardsSubmission.selector, rewardsSubmissions); + reenterer.prepare(targetToUse, msgValueToUse, calldataToUse, bytes("ReentrancyGuard: reentrant call")); + + cheats.expectRevert(); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_EmptyStratsAndMultipliers() public { + IRewardsCoordinator.StrategyAndMultiplier[] memory emptyStratsAndMultipliers; + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: emptyStratsAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(block.timestamp), + duration: 0 + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: no strategies set"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_ZeroAmount() public { + uint256 amount = 0; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: amount, + startTimestamp: uint32(block.timestamp), + duration: 0 + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: amount cannot be 0"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_AmountTooLarge() public { + uint256 amount = 1e38; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: amount, + startTimestamp: uint32(block.timestamp), + duration: 0 + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: amount too large"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_DurationTooLarge() public { + uint32 duration = MAX_REWARDS_DURATION + 1; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(block.timestamp), + duration: duration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: duration exceeds MAX_REWARDS_DURATION"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_DurationInvalidMultiple(uint256 duration) public { + uint256 duration = CALCULATION_INTERVAL_SECONDS - 1; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(block.timestamp), + duration: uint32(duration) + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: duration must be a multiple of CALCULATION_INTERVAL_SECONDS"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_InvalidStartTimestamp() public { + uint32 startTimestamp = OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP + 1; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: startTimestamp, + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: startTimestamp must be a multiple of CALCULATION_INTERVAL_SECONDS"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_StartTimestampPriorToGenesis() public { + uint256 startTimestamp = OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP - CALCULATION_INTERVAL_SECONDS; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(startTimestamp), + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: startTimestamp too far in the past"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + /// @notice Warps block timestamp & attemps to go make a reward to genesis + function test_Revert_StartTimestampGoesFarBack() public { + /// Warp to a timestamp past max retroactive length + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP + OPERATOR_SET_MAX_RETROACTIVE_LENGTH + CALCULATION_INTERVAL_SECONDS); + uint256 startTimestamp = OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(startTimestamp), + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: startTimestamp too far in the past"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_StartTimestampTooFarInFuture() public { + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP); + + uint256 startTimestamp = OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP + MAX_FUTURE_LENGTH + CALCULATION_INTERVAL_SECONDS; + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: uint32(startTimestamp), + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: startTimestamp too far in the future"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_InvalidStrategyConsidered() public { + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP); + defaultStrategyAndMultipliers[0].strategy = IStrategy(address(999)); + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: validStartTimestamp, + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: invalid strategy considered"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function test_Revert_StrategiesNotOrdered() public { + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP); + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + IRewardsCoordinator.StrategyAndMultiplier[] + memory dupStratsAndMultipliers = new IRewardsCoordinator.StrategyAndMultiplier[](2); + dupStratsAndMultipliers[0] = defaultStrategyAndMultipliers[0]; + dupStratsAndMultipliers[1] = defaultStrategyAndMultipliers[0]; + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: dupStratsAndMultipliers, + token: IERC20(address(this)), + amount: 1, + startTimestamp: validStartTimestamp, + duration: validDuration + }); + + cheats.prank(defaultAVS); + cheats.expectRevert("RewardsCoordinator._validateRewardsSubmission: strategies must be in ascending order to handle duplicates"); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + } + + function testFuzz_RewardOperatorSetForRange_SingleSubmission( + uint256 startTimestamp, + uint256 duration, + uint256 amount + ) public { + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP); + + // 1. Bound fuzz inputs to valid ranges and amounts + IERC20 rewardToken = new ERC20PresetFixedSupply("dog wif hat", "MOCK1", mockTokenInitialSupply, defaultAVS); + amount = bound(amount, 1, mockTokenInitialSupply); + duration = bound(duration, 0, MAX_REWARDS_DURATION); + duration = duration - (duration % CALCULATION_INTERVAL_SECONDS); + startTimestamp = bound( + startTimestamp, + uint256(_maxTimestamp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - OPERATOR_SET_MAX_RETROACTIVE_LENGTH)) + + CALCULATION_INTERVAL_SECONDS - + 1, + block.timestamp + uint256(MAX_FUTURE_LENGTH) + ); + startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS); + + // 2. Create rewards submission input param + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](1); + rewardsSubmissions[0] = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: rewardToken, + amount: amount, + startTimestamp: uint32(startTimestamp), + duration: uint32(duration) + }); + + // 3. call createAVSRewardsSubmission() with expected event emitted + uint256 avsBalanceBefore = rewardToken.balanceOf(defaultAVS); + uint256 rewardsCoordinatorBalanceBefore = rewardToken.balanceOf(address(rewardsCoordinator)); + + cheats.startPrank(defaultAVS); + rewardToken.approve(address(rewardsCoordinator), amount); + uint256 currSubmissionNonce = rewardsCoordinator.submissionNonce(defaultAVS); + bytes32 rewardsSubmissionHash = keccak256(abi.encode(defaultAVS, currSubmissionNonce, rewardsSubmissions[0])); + + cheats.expectEmit(true, true, true, true, address(rewardsCoordinator)); + emit OperatorSetRewardCreated(defaultAVS, currSubmissionNonce, rewardsSubmissionHash, rewardsSubmissions[0]); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + cheats.stopPrank(); + + assertTrue(rewardsCoordinator.isAVSRewardsSubmissionHash(defaultAVS, rewardsSubmissionHash), "rewards submission hash not submitted"); + assertEq(currSubmissionNonce + 1, rewardsCoordinator.submissionNonce(defaultAVS), "submission nonce not incremented"); + assertEq( + avsBalanceBefore - amount, + rewardToken.balanceOf(defaultAVS), + "AVS balance not decremented by amount of rewards submission" + ); + assertEq( + rewardsCoordinatorBalanceBefore + amount, + rewardToken.balanceOf(address(rewardsCoordinator)), + "RewardsCoordinator balance not incremented by amount of rewards submission" + ); + } + + /** + * @notice test multiple rewards submissions asserting for the following + * - correct event emitted + * - submission nonce incrementation by numSubmissions, and rewards submission hashes being set in storage. + * - rewards submission hash being set in storage + * - token balances before and after of avs and rewardsCoordinator + */ + function testFuzz_RewardOperatorSetForRange_MultipleSubmissions( + uint256 startTimestamp, + uint256 duration, + uint256 amount, + uint256 numSubmissions + ) public { + cheats.assume(2 <= numSubmissions && numSubmissions <= 10); + cheats.warp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP); + + IRewardsCoordinator.OperatorSetRewardsSubmission[] memory rewardsSubmissions = new IRewardsCoordinator.OperatorSetRewardsSubmission[](numSubmissions); + bytes32[] memory rewardsSubmissionHashes = new bytes32[](numSubmissions); + uint256 startSubmissionNonce = rewardsCoordinator.submissionNonce(defaultAVS); + _deployMockRewardTokens(defaultAVS, numSubmissions); + + uint256[] memory avsBalancesBefore = _getBalanceForTokens(rewardTokens, defaultAVS); + uint256[] memory rewardsCoordinatorBalancesBefore = _getBalanceForTokens( + rewardTokens, + address(rewardsCoordinator) + ); + uint256[] memory amounts = new uint256[](numSubmissions); + + // Create multiple rewards submissions and their expected event + for (uint256 i = 0; i < numSubmissions; ++i) { + // 1. Bound fuzz inputs to valid ranges and amounts using randSeed for each + amount = bound(amount + i, 1, mockTokenInitialSupply); + amounts[i] = amount; + duration = bound(duration + i, 0, MAX_REWARDS_DURATION); + duration = duration - (duration % CALCULATION_INTERVAL_SECONDS); + startTimestamp = bound( + startTimestamp + i, + uint256(_maxTimestamp(OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, uint32(block.timestamp) - OPERATOR_SET_MAX_RETROACTIVE_LENGTH)) + + CALCULATION_INTERVAL_SECONDS - + 1, + block.timestamp + uint256(MAX_FUTURE_LENGTH) + ); + startTimestamp = startTimestamp - (startTimestamp % CALCULATION_INTERVAL_SECONDS); + + // 2. Create rewards submission input param + IRewardsCoordinator.OperatorSetRewardsSubmission memory rewardsSubmission = IRewardsCoordinator.OperatorSetRewardsSubmission({ + rewardType: IRewardsCoordinator.RewardType.DELEGATED_STAKE, + operatorSetId: defaultOperatorSetId, + strategiesAndMultipliers: defaultStrategyAndMultipliers, + token: rewardTokens[i], + amount: amounts[i], + startTimestamp: uint32(startTimestamp), + duration: uint32(duration) + }); + rewardsSubmissions[i] = rewardsSubmission; + + // 3. expected event emitted for this rewardsSubmission + rewardsSubmissionHashes[i] = keccak256(abi.encode(defaultAVS, startSubmissionNonce + i, rewardsSubmissions[i])); + cheats.expectEmit(true, true, true, true, address(rewardsCoordinator)); + emit OperatorSetRewardCreated(defaultAVS, startSubmissionNonce + i, rewardsSubmissionHashes[i], rewardsSubmissions[i]); + } + + // 4. call createAVSRewardsSubmission() + cheats.prank(defaultAVS); + rewardsCoordinator.rewardOperatorSetForRange(rewardsSubmissions); + + // 5. Check for submissionNonce() and rewardsSubmissionHashes being set + assertEq( + startSubmissionNonce + numSubmissions, + rewardsCoordinator.submissionNonce(defaultAVS), + "submission nonce not incremented properly" + ); + + for (uint256 i = 0; i < numSubmissions; ++i) { + assertTrue( + rewardsCoordinator.isAVSRewardsSubmissionHash(defaultAVS, rewardsSubmissionHashes[i]), + "rewards submission hash not submitted" + ); + assertEq( + avsBalancesBefore[i] - amounts[i], + rewardTokens[i].balanceOf(defaultAVS), + "AVS balance not decremented by amount of rewards submission" + ); + assertEq( + rewardsCoordinatorBalancesBefore[i] + amounts[i], + rewardTokens[i].balanceOf(address(rewardsCoordinator)), + "RewardsCoordinator balance not incremented by amount of rewards submission" + ); + } + } +} \ No newline at end of file diff --git a/src/test/utils/EigenLayerUnitTestSetup.sol b/src/test/utils/EigenLayerUnitTestSetup.sol index a273d2ecb..68cd6d4c3 100644 --- a/src/test/utils/EigenLayerUnitTestSetup.sol +++ b/src/test/utils/EigenLayerUnitTestSetup.sol @@ -5,6 +5,7 @@ import "src/test/mocks/StrategyManagerMock.sol"; import "src/test/mocks/DelegationManagerMock.sol"; import "src/test/mocks/SlasherMock.sol"; import "src/test/mocks/EigenPodManagerMock.sol"; +import "src/test/mocks/AVSDirectoryMock.sol"; import "src/test/utils/EigenLayerUnitTestBase.sol"; abstract contract EigenLayerUnitTestSetup is EigenLayerUnitTestBase { @@ -13,6 +14,7 @@ abstract contract EigenLayerUnitTestSetup is EigenLayerUnitTestBase { DelegationManagerMock public delegationManagerMock; SlasherMock public slasherMock; EigenPodManagerMock public eigenPodManagerMock; + AVSDirectoryMock public avsDirectoryMock; function setUp() public virtual override { EigenLayerUnitTestBase.setUp(); @@ -20,6 +22,7 @@ abstract contract EigenLayerUnitTestSetup is EigenLayerUnitTestBase { delegationManagerMock = new DelegationManagerMock(); slasherMock = new SlasherMock(); eigenPodManagerMock = new EigenPodManagerMock(); + avsDirectoryMock = new AVSDirectoryMock(); addressIsExcludedFromFuzzedInputs[address(0)] = true; addressIsExcludedFromFuzzedInputs[address(strategyManagerMock)] = true; From 3decaeab8aeaf94a437d06e5b6c7ae03cb0995f6 Mon Sep 17 00:00:00 2001 From: Yash Patil <40046473+ypatil12@users.noreply.github.com> Date: Thu, 8 Aug 2024 14:16:04 -0400 Subject: [PATCH 27/43] feat: remove storage (#667) --- pkg/bindings/AVSDirectory/binding.go | 35 +++++++++++++++++++-- pkg/bindings/AVSDirectoryStorage/binding.go | 33 ++++++++++++++++++- pkg/bindings/IAVSDirectory/binding.go | 7 ----- src/contracts/core/AVSDirectory.sol | 2 -- src/contracts/core/AVSDirectoryStorage.sol | 6 ---- src/test/unit/AVSDirectoryUnit.t.sol | 3 -- 6 files changed, 65 insertions(+), 21 deletions(-) diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 66c6794a9..7fe175b3e 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -44,8 +44,8 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b50604051620037e8380380620037e8833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161366a6200017e6000396000611fdb015260008181610540015281816109bc01526111ea015261366a6000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c8063955e669611610125578063c825fe68116100ad578063ec76f4421161007c578063ec76f44214610562578063ef2dfa8d14610596578063f2fde38b146105a9578063f698da25146105bc578063fabc1cbc146105c457600080fd5b8063c825fe68146104c6578063d79aceab146104ed578063dce974b914610514578063df5cf7231461053b57600080fd5b8063a98fb355116100f4578063a98fb35514610472578063aec205c514610485578063afe02ed51461048d578063b2841d48146104a0578063c1a8e2c5146104b357600080fd5b8063955e6696146104265780639926ee7d14610439578063a1060c881461044c578063a364f4da1461045f57600080fd5b806349075da3116101a8578063715018a611610177578063715018a6146103915780637673e93a1461039957806384d76f7b146103bc578063886f1195146103ea5780638da5cb5b1461041557600080fd5b806349075da314610323578063595c6a671461035e5780635ac86ab7146103665780635c975abb1461038957600080fd5b806320606b70116101e457806320606b7014610264578063374823b51461029e5780633c4385d0146102dc5780633fee332d1461031057600080fd5b806310d67a2f14610216578063136439dd1461022b5780631794bb3c1461023e5780631e2199e214610251575b600080fd5b610229610224366004612bfb565b6105d7565b005b610229610239366004612c1f565b610693565b61022961024c366004612c38565b6107d2565b61022961025f366004612ddd565b6108fc565b61028b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6102cc6102ac366004612e58565b609960209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610295565b6102cc6102ea366004612e9d565b609c60209081526000938452604080852082529284528284209052825290205460ff1681565b61022961031e366004612ee4565b610c1c565b610351610331366004612f72565b609860209081526000928352604080842090915290825290205460ff1681565b6040516102959190612fc1565b610229610e66565b6102cc610374366004612fe9565b606654600160ff9092169190911b9081161490565b60665461028b565b610229610f2d565b6102cc6103a7366004612bfb565b609a6020526000908152604090205460ff1681565b6102cc6103ca36600461300c565b609b60209081526000928352604080842090915290825290205460ff1681565b6065546103fd906001600160a01b031681565b6040516001600160a01b039091168152602001610295565b6033546001600160a01b03166103fd565b61028b610434366004613041565b610f41565b6102296104473660046130a7565b610fa6565b61028b61045a3660046130f6565b611374565b61022961046d366004612bfb565b6113de565b61022961048036600461313c565b61151b565b610229611562565b61022961049b3660046131ad565b61162a565b61028b6104ae366004613041565b6117f7565b6102296104c13660046131ee565b611837565b61028b7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61028b7fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b61028b7f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b6103fd7f000000000000000000000000000000000000000000000000000000000000000081565b610229610570366004612c1f565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b6102296105a4366004613242565b61186c565b6102296105b7366004612bfb565b611c15565b61028b611c8b565b6102296105d2366004612c1f565b611c9a565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561062a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064e91906132ad565b6001600160a01b0316336001600160a01b0316146106875760405162461bcd60e51b815260040161067e906132ca565b60405180910390fd5b61069081611df6565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156106db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ff9190613314565b61071b5760405162461bcd60e51b815260040161067e90613336565b606654818116146107945760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161067e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156107f25750600054600160ff909116105b8061080c5750303b15801561080c575060005460ff166001145b61086f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161067e565b6000805460ff191660011790558015610892576000805461ff0019166101001790555b61089c8383611eed565b6108a4611fd7565b6097556108b0846120a0565b80156108f6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b606654600090600190811614156109255760405162461bcd60e51b815260040161067e9061337e565b428260400151101561099d5760405162461bcd60e51b815260206004820152604760248201526000805160206135f583398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a40161067e565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610a03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a279190613314565b610aa65760405162461bcd60e51b815260206004820152605660248201526000805160206135f583398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a40161067e565b336000908152609a602052604090205460ff16610b2d5760405162461bcd60e51b815260206004820152604b60248201526000805160206135f583398151915260448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a40161067e565b6001600160a01b038516600090815260996020908152604080832085830151845290915290205460ff1615610bb85760405162461bcd60e51b815260206004820152603f60248201526000805160206135f583398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e7400606482015260840161067e565b610bd885610bd133878787602001518860400151610f41565b84516120f2565b6001600160a01b03851660009081526099602090815260408083208583015184529091529020805460ff19166001179055610c15338686866122ac565b5050505050565b60665460009060019081161415610c455760405162461bcd60e51b815260040161067e9061337e565b815151610cdd57336001600160a01b03871614610cd85760405162461bcd60e51b815260206004820152604560248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2063616c6c6572206d757374206265206f70656064820152643930ba37b960d91b608482015260a40161067e565b610e52565b4282604001511015610d685760405162461bcd60e51b815260206004820152604860248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a206f70657261746f72207369676e617475726560648201526708195e1c1a5c995960c21b608482015260a40161067e565b6001600160a01b038616600090815260996020908152604080832085830151845290915290205460ff1615610e07576040805162461bcd60e51b81526020600482015260248101919091527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2073616c7420616c7265616479207370656e74606482015260840161067e565b610e2086610bd1878787876020015188604001516117f7565b6001600160a01b03861660009081526099602090815260408083208583015184529091529020805460ff191660011790555b610e5e858786866125ab565b505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610eae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed29190613314565b610eee5760405162461bcd60e51b815260040161067e90613336565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f356127d0565b610f3f60006120a0565b565b6000610f9c7f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610f81969594939291906133f9565b6040516020818303038152906040528051906020012061282a565b9695505050505050565b60665460009060019081161415610fcf5760405162461bcd60e51b815260040161067e9061337e565b42826040015110156110375760405162461bcd60e51b815260206004820152603e602482015260008051602061361583398151915260448201527f56533a206f70657261746f72207369676e617475726520657870697265640000606482015260840161067e565b336000908152609a602052604090205460ff16156110ab5760405162461bcd60e51b815260206004820152603e602482015260008051602061361583398151915260448201527f56533a2041565320697320616e206f70657261746f7220736574204156530000606482015260840161067e565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156110e5576110e5612fab565b14156111475760405162461bcd60e51b815260206004820152603f602482015260008051602061361583398151915260448201527f56533a206f70657261746f7220616c7265616479207265676973746572656400606482015260840161067e565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156111cb5760405162461bcd60e51b815260206004820152603660248201526000805160206136158339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b606482015260840161067e565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611231573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112559190613314565b6112cb5760405162461bcd60e51b815260206004820152604d602482015260008051602061361583398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a40161067e565b6112e383610bd1853386602001518760400151611374565b6001600160a01b038316600081815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916113679190612fc1565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290526000906113d59060c001610f81565b95945050505050565b606654600090600190811614156114075760405162461bcd60e51b815260040161067e9061337e565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561144157611441612fab565b146114b45760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f74207265676973746572656400606482015260840161067e565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161150f9190612fc1565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c9437138383604051611556929190613439565b60405180910390a25050565b336000908152609a602052604090205460ff16156115e85760405162461bcd60e51b815260206004820152603e60248201527f4156534469726563746f72792e6265636f6d654f70657261746f72536574415660448201527f533a20616c726561647920616e206f70657261746f7220736574204156530000606482015260840161067e565b336000818152609a6020526040808220805460ff19166001179055517f702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf9190a2565b60005b818110156117f257336000908152609b602052604081209084848481811061165757611657613468565b905060200201602081019061166c919061347e565b63ffffffff16815260208101919091526040016000205460ff16156116f95760405162461bcd60e51b815260206004820152603b60248201527f4156534469726563746f72792e6372656174654f70657261746f725365743a2060448201527f6f70657261746f722073657420616c7265616479206578697374730000000000606482015260840161067e565b336000908152609b6020526040812060019185858581811061171d5761171d613468565b9050602002016020810190611732919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280336001600160a01b031681526020018585858181106117b0576117b0613468565b90506020020160208101906117c5919061347e565b63ffffffff1690526040516117da9190613499565b60405180910390a16117eb816134d5565b905061162d565b505050565b6000610f9c7f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958787878787604051602001610f81969594939291906133f9565b606654600090600190811614156118605760405162461bcd60e51b815260040161067e9061337e565b6108f6338585856125ab565b606654600090600190811614156118955760405162461bcd60e51b815260040161067e9061337e565b336000908152609a602052604090205460ff1661192e5760405162461bcd60e51b815260206004820152604b60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a40161067e565b60005b84811015610e5e5760013360009081526098602052604081209088888581811061195d5761195d613468565b90506020020160208101906119729190612bfb565b6001600160a01b0316815260208101919091526040016000205460ff1660018111156119a0576119a0612fab565b14611a4c5760405162461bcd60e51b815260206004820152606a60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a206f70657261746f7220616c7265616479206d6960648201527f677261746564206f72206e6f742061206c656761637920726567697374657265608482015269321037b832b930ba37b960b11b60a482015260c40161067e565b611aa033878784818110611a6257611a62613468565b9050602002016020810190611a779190612bfb565b868685818110611a8957611a89613468565b9050602002810190611a9b91906134f0565b6122ac565b33600090815260986020526040812081888885818110611ac257611ac2613468565b9050602002016020810190611ad79190612bfb565b6001600160a01b031681526020810191909152604001600020805460ff191660018381811115611b0957611b09612fab565b021790555033868683818110611b2157611b21613468565b9050602002016020810190611b369190612bfb565b6001600160a01b03167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416000604051611b6f9190612fc1565b60405180910390a333868683818110611b8a57611b8a613468565b9050602002016020810190611b9f9190612bfb565b6001600160a01b03167f54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01868685818110611bdb57611bdb613468565b9050602002810190611bed91906134f0565b604051611bfb929190613539565b60405180910390a380611c0d816134d5565b915050611931565b611c1d6127d0565b6001600160a01b038116611c825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067e565b610690816120a0565b6000611c95611fd7565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ced573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d1191906132ad565b6001600160a01b0316336001600160a01b031614611d415760405162461bcd60e51b815260040161067e906132ca565b606654198119606654191614611dbf5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161067e565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107c7565b6001600160a01b038116611e845760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161067e565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316158015611f0e57506001600160a01b03821615155b611f905760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161067e565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2611fd382611df6565b5050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612008575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561220c57604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906121329086908690600401613555565b602060405180830381865afa15801561214f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217391906135b2565b6001600160e01b031916146117f25760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a40161067e565b826001600160a01b03166122208383612871565b6001600160a01b0316146117f25760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a40161067e565b60005b81811015610c15576001600160a01b0385166000908152609b60205260408120908484848181106122e2576122e2613468565b90506020020160208101906122f7919061347e565b63ffffffff16815260208101919091526040016000205460ff1661238e5760405162461bcd60e51b815260206004820152604260248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a20696e76616c6964206f70657261746f722073606482015261195d60f21b608482015260a40161067e565b6001600160a01b038086166000908152609c602090815260408083209388168352929052908120908484848181106123c8576123c8613468565b90506020020160208101906123dd919061347e565b63ffffffff16815260208101919091526040016000205460ff16156124905760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a206f70657261746f7220616c7265616479207260648201527f65676973746572656420746f206f70657261746f722073657400000000000000608482015260a40161067e565b6001600160a01b038086166000908152609c6020908152604080832093881683529290529081206001918585858181106124cc576124cc613468565b90506020020160208101906124e1919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e6040518060400160405280886001600160a01b0316815260200186868681811061256957612569613468565b905060200201602081019061257e919061347e565b63ffffffff1690526040516125939190613499565b60405180910390a26125a4816134d5565b90506122af565b60005b81811015610c15576001600160a01b038086166000908152609c602090815260408083209388168352929052908120908484848181106125f0576125f0613468565b9050602002016020810190612605919061347e565b63ffffffff16815260208101919091526040016000205460ff166126b75760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f646572656769737465724f70657261746f7260448201527f46726f6d4f70657261746f725365743a206f70657261746f72206e6f7420726560648201527f676973746572656420666f72206f70657261746f722073657400000000000000608482015260a40161067e565b6001600160a01b038086166000908152609c602090815260408083209388168352929052908120818585858181106126f1576126f1613468565b9050602002016020810190612706919061347e565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe6040518060400160405280886001600160a01b0316815260200186868681811061278e5761278e613468565b90506020020160208101906127a3919061347e565b63ffffffff1690526040516127b89190613499565b60405180910390a26127c9816134d5565b90506125ae565b6033546001600160a01b03163314610f3f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b6000612834611fd7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60008060006128808585612895565b9150915061288d81612905565b509392505050565b6000808251604114156128cc5760208301516040840151606085015160001a6128c087828585612ac0565b945094505050506128fe565b8251604014156128f657602083015160408401516128eb868383612bad565b9350935050506128fe565b506000905060025b9250929050565b600081600481111561291957612919612fab565b14156129225750565b600181600481111561293657612936612fab565b14156129845760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161067e565b600281600481111561299857612998612fab565b14156129e65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161067e565b60038160048111156129fa576129fa612fab565b1415612a535760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161067e565b6004816004811115612a6757612a67612fab565b14156106905760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161067e565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612af75750600090506003612ba4565b8460ff16601b14158015612b0f57508460ff16601c14155b15612b205750600090506004612ba4565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612b74573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612b9d57600060019250925050612ba4565b9150600090505b94509492505050565b6000806001600160ff1b03831681612bca60ff86901c601b6135dc565b9050612bd887828885612ac0565b935093505050935093915050565b6001600160a01b038116811461069057600080fd5b600060208284031215612c0d57600080fd5b8135612c1881612be6565b9392505050565b600060208284031215612c3157600080fd5b5035919050565b600080600060608486031215612c4d57600080fd5b8335612c5881612be6565b92506020840135612c6881612be6565b929592945050506040919091013590565b60008083601f840112612c8b57600080fd5b5081356001600160401b03811115612ca257600080fd5b6020830191508360208260051b85010111156128fe57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612cf557612cf5612cbd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d2357612d23612cbd565b604052919050565b600060608284031215612d3d57600080fd5b612d45612cd3565b905081356001600160401b0380821115612d5e57600080fd5b818401915084601f830112612d7257600080fd5b8135602082821115612d8657612d86612cbd565b612d98601f8301601f19168201612cfb565b92508183528681838601011115612dae57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b60008060008060608587031215612df357600080fd5b8435612dfe81612be6565b935060208501356001600160401b0380821115612e1a57600080fd5b612e2688838901612c79565b90955093506040870135915080821115612e3f57600080fd5b50612e4c87828801612d2b565b91505092959194509250565b60008060408385031215612e6b57600080fd5b8235612e7681612be6565b946020939093013593505050565b803563ffffffff81168114612e9857600080fd5b919050565b600080600060608486031215612eb257600080fd5b8335612ebd81612be6565b92506020840135612ecd81612be6565b9150612edb60408501612e84565b90509250925092565b600080600080600060808688031215612efc57600080fd5b8535612f0781612be6565b94506020860135612f1781612be6565b935060408601356001600160401b0380821115612f3357600080fd5b612f3f89838a01612c79565b90955093506060880135915080821115612f5857600080fd5b50612f6588828901612d2b565b9150509295509295909350565b60008060408385031215612f8557600080fd5b8235612f9081612be6565b91506020830135612fa081612be6565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b6020810160028310612fe357634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215612ffb57600080fd5b813560ff81168114612c1857600080fd5b6000806040838503121561301f57600080fd5b823561302a81612be6565b915061303860208401612e84565b90509250929050565b60008060008060006080868803121561305957600080fd5b853561306481612be6565b945060208601356001600160401b0381111561307f57600080fd5b61308b88828901612c79565b9699909850959660408101359660609091013595509350505050565b600080604083850312156130ba57600080fd5b82356130c581612be6565b915060208301356001600160401b038111156130e057600080fd5b6130ec85828601612d2b565b9150509250929050565b6000806000806080858703121561310c57600080fd5b843561311781612be6565b9350602085013561312781612be6565b93969395505050506040820135916060013590565b6000806020838503121561314f57600080fd5b82356001600160401b038082111561316657600080fd5b818501915085601f83011261317a57600080fd5b81358181111561318957600080fd5b86602082850101111561319b57600080fd5b60209290920196919550909350505050565b600080602083850312156131c057600080fd5b82356001600160401b038111156131d657600080fd5b6131e285828601612c79565b90969095509350505050565b60008060006040848603121561320357600080fd5b833561320e81612be6565b925060208401356001600160401b0381111561322957600080fd5b61323586828701612c79565b9497909650939450505050565b6000806000806040858703121561325857600080fd5b84356001600160401b038082111561326f57600080fd5b61327b88838901612c79565b9096509450602087013591508082111561329457600080fd5b506132a187828801612c79565b95989497509550505050565b6000602082840312156132bf57600080fd5b8151612c1881612be6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561332657600080fd5b81518015158114612c1857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b8183526000602080850194508260005b858110156133ee5763ffffffff6133db83612e84565b16875295820195908201906001016133c5565b509495945050505050565b8681526001600160a01b038616602082015260a06040820181905260009061342490830186886133b5565b60608301949094525060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561349057600080fd5b612c1882612e84565b81516001600160a01b0316815260209182015163ffffffff169181019190915260400190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156134e9576134e96134bf565b5060010190565b6000808335601e1984360301811261350757600080fd5b8301803591506001600160401b0382111561352157600080fd5b6020019150600581901b36038213156128fe57600080fd5b60208152600061354d6020830184866133b5565b949350505050565b82815260006020604081840152835180604085015260005b818110156135895785810183015185820160600152820161356d565b8181111561359b576000606083870101525b50601f01601f191692909201606001949350505050565b6000602082840312156135c457600080fd5b81516001600160e01b031981168114612c1857600080fd5b600082198211156135ef576135ef6134bf565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220c31b87ef6dc7c9b42ff5cf7c149ed22c42cbf046e9e403a5ed3b542f5469155464736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetMemberCount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60c06040523480156200001157600080fd5b506040516200390b3803806200390b833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161378d6200017e6000396000612011015260008181610576015281816109f20152611220015261378d6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80639926ee7d11610125578063d79aceab116100ad578063ec76f4421161007c578063ec76f44214610598578063ef2dfa8d146105cc578063f2fde38b146105df578063f698da25146105f2578063fabc1cbc146105fa57600080fd5b8063d79aceab146104f8578063dae226b61461051f578063dce974b91461054a578063df5cf7231461057157600080fd5b8063aec205c5116100f4578063aec205c514610490578063afe02ed514610498578063b2841d48146104ab578063c1a8e2c5146104be578063c825fe68146104d157600080fd5b80639926ee7d14610444578063a1060c8814610457578063a364f4da1461046a578063a98fb3551461047d57600080fd5b8063595c6a67116101a85780637673e93a116101775780637673e93a146103a457806384d76f7b146103c7578063886f1195146103f55780638da5cb5b14610420578063955e66961461043157600080fd5b8063595c6a67146103695780635ac86ab7146103715780635c975abb14610394578063715018a61461039c57600080fd5b806320606b70116101ef57806320606b701461026f578063374823b5146102a95780633c4385d0146102e75780633fee332d1461031b57806349075da31461032e57600080fd5b806310d67a2f14610221578063136439dd146102365780631794bb3c146102495780631e2199e21461025c575b600080fd5b61023461022f366004612d07565b61060d565b005b610234610244366004612d2b565b6106c9565b610234610257366004612d44565b610808565b61023461026a366004612ee9565b610932565b6102967f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6102d76102b7366004612f64565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102a0565b6102d76102f5366004612fa9565b609c60209081526000938452604080852082529284528284209052825290205460ff1681565b610234610329366004612ff0565b610c52565b61035c61033c36600461307e565b609860209081526000928352604080842090915290825290205460ff1681565b6040516102a091906130cd565b610234610e9c565b6102d761037f3660046130f5565b606654600160ff9092169190911b9081161490565b606654610296565b610234610f63565b6102d76103b2366004612d07565b609a6020526000908152604090205460ff1681565b6102d76103d5366004613118565b609b60209081526000928352604080842090915290825290205460ff1681565b606554610408906001600160a01b031681565b6040516001600160a01b0390911681526020016102a0565b6033546001600160a01b0316610408565b61029661043f36600461314d565b610f77565b6102346104523660046131b3565b610fdc565b610296610465366004613202565b6113aa565b610234610478366004612d07565b611414565b61023461048b366004613248565b611551565b610234611598565b6102346104a63660046132b9565b611660565b6102966104b936600461314d565b61182d565b6102346104cc3660046132fa565b61186d565b6102967f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6102967fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b61029661052d366004613118565b609d60209081526000928352604080842090915290825290205481565b6102967f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6102346105a6366004612d2b565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b6102346105da36600461334e565b6118a2565b6102346105ed366004612d07565b611c4b565b610296611cc1565b610234610608366004612d2b565b611cd0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068491906133b9565b6001600160a01b0316336001600160a01b0316146106bd5760405162461bcd60e51b81526004016106b4906133d6565b60405180910390fd5b6106c681611e2c565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107359190613420565b6107515760405162461bcd60e51b81526004016106b490613442565b606654818116146107ca5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156108285750600054600160ff909116105b806108425750303b158015610842575060005460ff166001145b6108a55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b4565b6000805460ff1916600117905580156108c8576000805461ff0019166101001790555b6108d28383611f23565b6108da61200d565b6097556108e6846120d6565b801561092c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6066546000906001908116141561095b5760405162461bcd60e51b81526004016106b49061348a565b42826040015110156109d35760405162461bcd60e51b8152602060048201526047602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a4016106b4565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d9190613420565b610adc5760405162461bcd60e51b8152602060048201526056602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a4016106b4565b336000908152609a602052604090205460ff16610b635760405162461bcd60e51b815260206004820152604b602482015260008051602061371883398151915260448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b6001600160a01b038516600090815260996020908152604080832085830151845290915290205460ff1615610bee5760405162461bcd60e51b815260206004820152603f602482015260008051602061371883398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e740060648201526084016106b4565b610c0e85610c0733878787602001518860400151610f77565b8451612128565b6001600160a01b03851660009081526099602090815260408083208583015184529091529020805460ff19166001179055610c4b338686866122e2565b5050505050565b60665460009060019081161415610c7b5760405162461bcd60e51b81526004016106b49061348a565b815151610d1357336001600160a01b03871614610d0e5760405162461bcd60e51b815260206004820152604560248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2063616c6c6572206d757374206265206f70656064820152643930ba37b960d91b608482015260a4016106b4565b610e88565b4282604001511015610d9e5760405162461bcd60e51b815260206004820152604860248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a206f70657261746f72207369676e617475726560648201526708195e1c1a5c995960c21b608482015260a4016106b4565b6001600160a01b038616600090815260996020908152604080832085830151845290915290205460ff1615610e3d576040805162461bcd60e51b81526020600482015260248101919091527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2073616c7420616c7265616479207370656e7460648201526084016106b4565b610e5686610c078787878760200151886040015161182d565b6001600160a01b03861660009081526099602090815260408083208583015184529091529020805460ff191660011790555b610e948587868661264c565b505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f089190613420565b610f245760405162461bcd60e51b81526004016106b490613442565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f6b6128dc565b610f7560006120d6565b565b6000610fd27f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610fb796959493929190613505565b60405160208183030381529060405280519060200120612936565b9695505050505050565b606654600090600190811614156110055760405162461bcd60e51b81526004016106b49061348a565b428260400151101561106d5760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a206f70657261746f72207369676e61747572652065787069726564000060648201526084016106b4565b336000908152609a602052604090205460ff16156110e15760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a2041565320697320616e206f70657261746f722073657420415653000060648201526084016106b4565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561111b5761111b6130b7565b141561117d5760405162461bcd60e51b815260206004820152603f602482015260008051602061373883398151915260448201527f56533a206f70657261746f7220616c726561647920726567697374657265640060648201526084016106b4565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156112015760405162461bcd60e51b815260206004820152603660248201526000805160206137388339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b60648201526084016106b4565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128b9190613420565b6113015760405162461bcd60e51b815260206004820152604d602482015260008051602061373883398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a4016106b4565b61131983610c078533866020015187604001516113aa565b6001600160a01b038316600081815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161139d91906130cd565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a0810182905260009061140b9060c001610fb7565b95945050505050565b6066546000906001908116141561143d5760405162461bcd60e51b81526004016106b49061348a565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115611477576114776130b7565b146114ea5760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f7420726567697374657265640060648201526084016106b4565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161154591906130cd565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713838360405161158c929190613545565b60405180910390a25050565b336000908152609a602052604090205460ff161561161e5760405162461bcd60e51b815260206004820152603e60248201527f4156534469726563746f72792e6265636f6d654f70657261746f72536574415660448201527f533a20616c726561647920616e206f70657261746f722073657420415653000060648201526084016106b4565b336000818152609a6020526040808220805460ff19166001179055517f702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf9190a2565b60005b8181101561182857336000908152609b602052604081209084848481811061168d5761168d613574565b90506020020160208101906116a2919061358a565b63ffffffff16815260208101919091526040016000205460ff161561172f5760405162461bcd60e51b815260206004820152603b60248201527f4156534469726563746f72792e6372656174654f70657261746f725365743a2060448201527f6f70657261746f722073657420616c726561647920657869737473000000000060648201526084016106b4565b336000908152609b6020526040812060019185858581811061175357611753613574565b9050602002016020810190611768919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280336001600160a01b031681526020018585858181106117e6576117e6613574565b90506020020160208101906117fb919061358a565b63ffffffff16905260405161181091906135a5565b60405180910390a1611821816135e1565b9050611663565b505050565b6000610fd27f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958787878787604051602001610fb796959493929190613505565b606654600090600190811614156118965760405162461bcd60e51b81526004016106b49061348a565b61092c3385858561264c565b606654600090600190811614156118cb5760405162461bcd60e51b81526004016106b49061348a565b336000908152609a602052604090205460ff166119645760405162461bcd60e51b815260206004820152604b60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b60005b84811015610e945760013360009081526098602052604081209088888581811061199357611993613574565b90506020020160208101906119a89190612d07565b6001600160a01b0316815260208101919091526040016000205460ff1660018111156119d6576119d66130b7565b14611a825760405162461bcd60e51b815260206004820152606a60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a206f70657261746f7220616c7265616479206d6960648201527f677261746564206f72206e6f742061206c656761637920726567697374657265608482015269321037b832b930ba37b960b11b60a482015260c4016106b4565b611ad633878784818110611a9857611a98613574565b9050602002016020810190611aad9190612d07565b868685818110611abf57611abf613574565b9050602002810190611ad191906135fc565b6122e2565b33600090815260986020526040812081888885818110611af857611af8613574565b9050602002016020810190611b0d9190612d07565b6001600160a01b031681526020810191909152604001600020805460ff191660018381811115611b3f57611b3f6130b7565b021790555033868683818110611b5757611b57613574565b9050602002016020810190611b6c9190612d07565b6001600160a01b03167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416000604051611ba591906130cd565b60405180910390a333868683818110611bc057611bc0613574565b9050602002016020810190611bd59190612d07565b6001600160a01b03167f54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01868685818110611c1157611c11613574565b9050602002810190611c2391906135fc565b604051611c31929190613645565b60405180910390a380611c43816135e1565b915050611967565b611c536128dc565b6001600160a01b038116611cb85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b4565b6106c6816120d6565b6000611ccb61200d565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4791906133b9565b6001600160a01b0316336001600160a01b031614611d775760405162461bcd60e51b81526004016106b4906133d6565b606654198119606654191614611df55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107fd565b6001600160a01b038116611eba5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016106b4565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316158015611f4457506001600160a01b03821615155b611fc65760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261200982611e2c565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000046141561203e575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561224257604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906121689086908690600401613661565b602060405180830381865afa158015612185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a991906136be565b6001600160e01b031916146118285760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a4016106b4565b826001600160a01b0316612256838361297d565b6001600160a01b0316146118285760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a4016106b4565b60005b81811015610c4b576001600160a01b0385166000908152609b602052604081209084848481811061231857612318613574565b905060200201602081019061232d919061358a565b63ffffffff16815260208101919091526040016000205460ff166123c45760405162461bcd60e51b815260206004820152604260248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a20696e76616c6964206f70657261746f722073606482015261195d60f21b608482015260a4016106b4565b6001600160a01b038086166000908152609c602090815260408083209388168352929052908120908484848181106123fe576123fe613574565b9050602002016020810190612413919061358a565b63ffffffff16815260208101919091526040016000205460ff16156124c65760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a206f70657261746f7220616c7265616479207260648201527f65676973746572656420746f206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0385166000908152609d60205260408120908484848181106124f1576124f1613574565b9050602002016020810190612506919061358a565b63ffffffff1663ffffffff1681526020019081526020016000206000815461252d906135e1565b909155506001600160a01b038086166000908152609c60209081526040808320938816835292905290812060019185858581811061256d5761256d613574565b9050602002016020810190612582919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e6040518060400160405280886001600160a01b0316815260200186868681811061260a5761260a613574565b905060200201602081019061261f919061358a565b63ffffffff16905260405161263491906135a5565b60405180910390a2612645816135e1565b90506122e5565b60005b81811015610c4b576001600160a01b038086166000908152609c6020908152604080832093881683529290529081209084848481811061269157612691613574565b90506020020160208101906126a6919061358a565b63ffffffff16815260208101919091526040016000205460ff166127585760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f646572656769737465724f70657261746f7260448201527f46726f6d4f70657261746f725365743a206f70657261746f72206e6f7420726560648201527f676973746572656420666f72206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0385166000908152609d602052604081209084848481811061278357612783613574565b9050602002016020810190612798919061358a565b63ffffffff1663ffffffff168152602001908152602001600020600081546127bf906136e8565b909155506001600160a01b038086166000908152609c602090815260408083209388168352929052908120818585858181106127fd576127fd613574565b9050602002016020810190612812919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe6040518060400160405280886001600160a01b0316815260200186868681811061289a5761289a613574565b90506020020160208101906128af919061358a565b63ffffffff1690526040516128c491906135a5565b60405180910390a26128d5816135e1565b905061264f565b6033546001600160a01b03163314610f755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b4565b600061294061200d565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b600080600061298c85856129a1565b9150915061299981612a11565b509392505050565b6000808251604114156129d85760208301516040840151606085015160001a6129cc87828585612bcc565b94509450505050612a0a565b825160401415612a0257602083015160408401516129f7868383612cb9565b935093505050612a0a565b506000905060025b9250929050565b6000816004811115612a2557612a256130b7565b1415612a2e5750565b6001816004811115612a4257612a426130b7565b1415612a905760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106b4565b6002816004811115612aa457612aa46130b7565b1415612af25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106b4565b6003816004811115612b0657612b066130b7565b1415612b5f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106b4565b6004816004811115612b7357612b736130b7565b14156106c65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106b4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c035750600090506003612cb0565b8460ff16601b14158015612c1b57508460ff16601c14155b15612c2c5750600090506004612cb0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c80573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ca957600060019250925050612cb0565b9150600090505b94509492505050565b6000806001600160ff1b03831681612cd660ff86901c601b6136ff565b9050612ce487828885612bcc565b935093505050935093915050565b6001600160a01b03811681146106c657600080fd5b600060208284031215612d1957600080fd5b8135612d2481612cf2565b9392505050565b600060208284031215612d3d57600080fd5b5035919050565b600080600060608486031215612d5957600080fd5b8335612d6481612cf2565b92506020840135612d7481612cf2565b929592945050506040919091013590565b60008083601f840112612d9757600080fd5b5081356001600160401b03811115612dae57600080fd5b6020830191508360208260051b8501011115612a0a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612e0157612e01612dc9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e2f57612e2f612dc9565b604052919050565b600060608284031215612e4957600080fd5b612e51612ddf565b905081356001600160401b0380821115612e6a57600080fd5b818401915084601f830112612e7e57600080fd5b8135602082821115612e9257612e92612dc9565b612ea4601f8301601f19168201612e07565b92508183528681838601011115612eba57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b60008060008060608587031215612eff57600080fd5b8435612f0a81612cf2565b935060208501356001600160401b0380821115612f2657600080fd5b612f3288838901612d85565b90955093506040870135915080821115612f4b57600080fd5b50612f5887828801612e37565b91505092959194509250565b60008060408385031215612f7757600080fd5b8235612f8281612cf2565b946020939093013593505050565b803563ffffffff81168114612fa457600080fd5b919050565b600080600060608486031215612fbe57600080fd5b8335612fc981612cf2565b92506020840135612fd981612cf2565b9150612fe760408501612f90565b90509250925092565b60008060008060006080868803121561300857600080fd5b853561301381612cf2565b9450602086013561302381612cf2565b935060408601356001600160401b038082111561303f57600080fd5b61304b89838a01612d85565b9095509350606088013591508082111561306457600080fd5b5061307188828901612e37565b9150509295509295909350565b6000806040838503121561309157600080fd5b823561309c81612cf2565b915060208301356130ac81612cf2565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106130ef57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561310757600080fd5b813560ff81168114612d2457600080fd5b6000806040838503121561312b57600080fd5b823561313681612cf2565b915061314460208401612f90565b90509250929050565b60008060008060006080868803121561316557600080fd5b853561317081612cf2565b945060208601356001600160401b0381111561318b57600080fd5b61319788828901612d85565b9699909850959660408101359660609091013595509350505050565b600080604083850312156131c657600080fd5b82356131d181612cf2565b915060208301356001600160401b038111156131ec57600080fd5b6131f885828601612e37565b9150509250929050565b6000806000806080858703121561321857600080fd5b843561322381612cf2565b9350602085013561323381612cf2565b93969395505050506040820135916060013590565b6000806020838503121561325b57600080fd5b82356001600160401b038082111561327257600080fd5b818501915085601f83011261328657600080fd5b81358181111561329557600080fd5b8660208285010111156132a757600080fd5b60209290920196919550909350505050565b600080602083850312156132cc57600080fd5b82356001600160401b038111156132e257600080fd5b6132ee85828601612d85565b90969095509350505050565b60008060006040848603121561330f57600080fd5b833561331a81612cf2565b925060208401356001600160401b0381111561333557600080fd5b61334186828701612d85565b9497909650939450505050565b6000806000806040858703121561336457600080fd5b84356001600160401b038082111561337b57600080fd5b61338788838901612d85565b909650945060208701359150808211156133a057600080fd5b506133ad87828801612d85565b95989497509550505050565b6000602082840312156133cb57600080fd5b8151612d2481612cf2565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561343257600080fd5b81518015158114612d2457600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b8183526000602080850194508260005b858110156134fa5763ffffffff6134e783612f90565b16875295820195908201906001016134d1565b509495945050505050565b8681526001600160a01b038616602082015260a06040820181905260009061353090830186886134c1565b60608301949094525060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561359c57600080fd5b612d2482612f90565b81516001600160a01b0316815260209182015163ffffffff169181019190915260400190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156135f5576135f56135cb565b5060010190565b6000808335601e1984360301811261361357600080fd5b8301803591506001600160401b0382111561362d57600080fd5b6020019150600581901b3603821315612a0a57600080fd5b6020815260006136596020830184866134c1565b949350505050565b82815260006020604081840152835180604085015260005b8181101561369557858101830151858201606001528201613679565b818111156136a7576000606083870101525b50601f01601f191692909201606001949350505050565b6000602082840312156136d057600080fd5b81516001600160e01b031981168114612d2457600080fd5b6000816136f7576136f76135cb565b506000190190565b60008219821115613712576137126135cb565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f4156534469726563746f72792e72656769737465724f70657261746f72546f41a264697066735822122067d0b14638ce5ceb01bcf3042d51aab2a9d009f53dbd2f7cf36e97c69477fa0c64736f6c634300080c0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. @@ -649,6 +649,37 @@ func (_AVSDirectory *AVSDirectoryCallerSession) OperatorSaltIsSpent(arg0 common. return _AVSDirectory.Contract.OperatorSaltIsSpent(&_AVSDirectory.CallOpts, arg0, arg1) } +// OperatorSetMemberCount is a free data retrieval call binding the contract method 0xdae226b6. +// +// Solidity: function operatorSetMemberCount(address , uint32 ) view returns(uint256) +func (_AVSDirectory *AVSDirectoryCaller) OperatorSetMemberCount(opts *bind.CallOpts, arg0 common.Address, arg1 uint32) (*big.Int, error) { + var out []interface{} + err := _AVSDirectory.contract.Call(opts, &out, "operatorSetMemberCount", arg0, arg1) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// OperatorSetMemberCount is a free data retrieval call binding the contract method 0xdae226b6. +// +// Solidity: function operatorSetMemberCount(address , uint32 ) view returns(uint256) +func (_AVSDirectory *AVSDirectorySession) OperatorSetMemberCount(arg0 common.Address, arg1 uint32) (*big.Int, error) { + return _AVSDirectory.Contract.OperatorSetMemberCount(&_AVSDirectory.CallOpts, arg0, arg1) +} + +// OperatorSetMemberCount is a free data retrieval call binding the contract method 0xdae226b6. +// +// Solidity: function operatorSetMemberCount(address , uint32 ) view returns(uint256) +func (_AVSDirectory *AVSDirectoryCallerSession) OperatorSetMemberCount(arg0 common.Address, arg1 uint32) (*big.Int, error) { + return _AVSDirectory.Contract.OperatorSetMemberCount(&_AVSDirectory.CallOpts, arg0, arg1) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) diff --git a/pkg/bindings/AVSDirectoryStorage/binding.go b/pkg/bindings/AVSDirectoryStorage/binding.go index 8fd8324c3..a750b290e 100644 --- a/pkg/bindings/AVSDirectoryStorage/binding.go +++ b/pkg/bindings/AVSDirectoryStorage/binding.go @@ -44,7 +44,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryStorageMetaData contains all meta data concerning the AVSDirectoryStorage contract. var AVSDirectoryStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetMemberCount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", } // AVSDirectoryStorageABI is the input ABI used to generate the binding from. @@ -627,6 +627,37 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) OperatorSaltIsSpen return _AVSDirectoryStorage.Contract.OperatorSaltIsSpent(&_AVSDirectoryStorage.CallOpts, arg0, arg1) } +// OperatorSetMemberCount is a free data retrieval call binding the contract method 0xdae226b6. +// +// Solidity: function operatorSetMemberCount(address , uint32 ) view returns(uint256) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) OperatorSetMemberCount(opts *bind.CallOpts, arg0 common.Address, arg1 uint32) (*big.Int, error) { + var out []interface{} + err := _AVSDirectoryStorage.contract.Call(opts, &out, "operatorSetMemberCount", arg0, arg1) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// OperatorSetMemberCount is a free data retrieval call binding the contract method 0xdae226b6. +// +// Solidity: function operatorSetMemberCount(address , uint32 ) view returns(uint256) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) OperatorSetMemberCount(arg0 common.Address, arg1 uint32) (*big.Int, error) { + return _AVSDirectoryStorage.Contract.OperatorSetMemberCount(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +} + +// OperatorSetMemberCount is a free data retrieval call binding the contract method 0xdae226b6. +// +// Solidity: function operatorSetMemberCount(address , uint32 ) view returns(uint256) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) OperatorSetMemberCount(arg0 common.Address, arg1 uint32) (*big.Int, error) { + return _AVSDirectoryStorage.Contract.OperatorSetMemberCount(&_AVSDirectoryStorage.CallOpts, arg0, arg1) +} + // BecomeOperatorSetAVS is a paid mutator transaction binding the contract method 0xaec205c5. // // Solidity: function becomeOperatorSetAVS() returns() diff --git a/pkg/bindings/IAVSDirectory/binding.go b/pkg/bindings/IAVSDirectory/binding.go index 0e2271d00..8ac23677e 100644 --- a/pkg/bindings/IAVSDirectory/binding.go +++ b/pkg/bindings/IAVSDirectory/binding.go @@ -44,11 +44,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // IAVSDirectoryMetaData contains all meta data concerning the IAVSDirectory contract. var IAVSDirectoryMetaData = &bind.MetaData{ -<<<<<<< HEAD - ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", -======= ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", ->>>>>>> ad282d28 (build: bindings) } // IAVSDirectoryABI is the input ABI used to generate the binding from. @@ -414,8 +410,6 @@ func (_IAVSDirectory *IAVSDirectoryCallerSession) IsMember(avs common.Address, o return _IAVSDirectory.Contract.IsMember(&_IAVSDirectory.CallOpts, avs, operator, operatorSetId) } -<<<<<<< HEAD -======= // IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. // // Solidity: function isOperatorSet(address avs, uint32 operatorSetId) view returns(bool) @@ -478,7 +472,6 @@ func (_IAVSDirectory *IAVSDirectoryCallerSession) IsOperatorSetAVS(avs common.Ad return _IAVSDirectory.Contract.IsOperatorSetAVS(&_IAVSDirectory.CallOpts, avs) } ->>>>>>> ad282d28 (build: bindings) // OperatorSaltIsSpent is a free data retrieval call binding the contract method 0x374823b5. // // Solidity: function operatorSaltIsSpent(address operator, bytes32 salt) view returns(bool) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index bd4cfa9d8..3e2c9993a 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -73,8 +73,6 @@ contract AVSDirectory is isOperatorSet[msg.sender][operatorSetIds[i]] = true; emit OperatorSetCreated(OperatorSet({avs: msg.sender, operatorSetId: operatorSetIds[i]})); } - operatorSetCount += operatorSetIds.length; - avsOperatorSetCount[msg.sender] += operatorSetIds.length; } /** diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index 5184cad14..3c5db125a 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -49,12 +49,6 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { /// @notice Mapping: avs => operatorSetId => Total operators within the given operator set. mapping(address => mapping(uint32 => uint256)) public operatorSetMemberCount; - /// @notice Mapping: avs => Total amount of operator sets created for a given AVS. - mapping(address => uint256) public avsOperatorSetCount; - - /// @notice Total amount of operators sets created. - uint256 public operatorSetCount; - constructor(IDelegationManager _delegation) { delegation = _delegation; } diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 0fecdf558..b01901b9e 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -837,9 +837,6 @@ contract AVSDirectoryUnitTests_createOperatorSet is AVSDirectoryUnitTests { } avsDirectory.createOperatorSets(oids); - - assertEq(avsDirectory.operatorSetCount(), totalSets); - assertEq(avsDirectory.avsOperatorSetCount(address(this)), totalSets); for (uint32 i = 1; i < totalSets + 1; ++i) { assertTrue(avsDirectory.isOperatorSet(address(this), i)); From 21e5330fdacfecf5a9b4d098283bdcb2b3832c3c Mon Sep 17 00:00:00 2001 From: Yash Patil Date: Thu, 8 Aug 2024 15:34:11 -0400 Subject: [PATCH 28/43] chore: address comments --- src/contracts/core/AVSDirectory.sol | 16 +++++++++------- src/contracts/core/AVSDirectoryStorage.sol | 1 + src/test/unit/AVSDirectoryUnit.t.sol | 4 +++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 3e2c9993a..a21fb5d48 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -17,6 +17,8 @@ contract AVSDirectory is { /// @dev Index for flag that pauses operator register/deregister to avs when set. uint8 internal constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0; + /// @dev Index for flag that pauses operator register/deregister to operator sets when set. + uint8 internal constant PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS = 1; /// @dev Returns the chain ID from the time the contract was deployed. uint256 internal immutable ORIGINAL_CHAIN_ID; @@ -100,7 +102,7 @@ contract AVSDirectory is function migrateOperatorsToOperatorSets( address[] calldata operators, uint32[][] calldata operatorSetIds - ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + ) external override onlyWhenNotPaused(PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS) { // Assert that the AVS is an operator set AVS. require( isOperatorSetAVS[msg.sender], "AVSDirectory.migrateOperatorsToOperatorSets: AVS is not an operator set AVS" @@ -114,7 +116,7 @@ contract AVSDirectory is ); // Migrate operator to operator sets. - _registerToOperatorSets(msg.sender, operators[i], operatorSetIds[i]); + _registerToOperatorSets(operators[i], msg.sender, operatorSetIds[i]); // Deregister operator from AVS - this prevents the operator from being migrated again since // the AVS can no longer use the legacy M2 registration path @@ -140,7 +142,7 @@ contract AVSDirectory is address operator, uint32[] calldata operatorSetIds, ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature - ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + ) external override onlyWhenNotPaused(PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS) { // Assert operator's signature has not expired. require( operatorSignature.expiry >= block.timestamp, @@ -176,7 +178,7 @@ contract AVSDirectory is // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. operatorSaltIsSpent[operator][operatorSignature.salt] = true; - _registerToOperatorSets(msg.sender, operator, operatorSetIds); + _registerToOperatorSets(operator, msg.sender, operatorSetIds); } /** @@ -195,7 +197,7 @@ contract AVSDirectory is address avs, uint32[] calldata operatorSetIds, ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature - ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + ) external override onlyWhenNotPaused(PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS) { if (operatorSignature.signature.length == 0) { require(msg.sender == operator, "AVSDirectory.forceDeregisterFromOperatorSets: caller must be operator"); } else { @@ -239,7 +241,7 @@ contract AVSDirectory is function deregisterOperatorFromOperatorSets( address operator, uint32[] calldata operatorSetIds - ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { + ) external override onlyWhenNotPaused(PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS) { _deregisterFromOperatorSets(msg.sender, operator, operatorSetIds); } @@ -366,7 +368,7 @@ contract AVSDirectory is * @param operator The operator to register. * @param operatorSetIds The IDs of the operator sets. */ - function _registerToOperatorSets(address avs, address operator, uint32[] calldata operatorSetIds) internal { + function _registerToOperatorSets(address operator, address avs, uint32[] calldata operatorSetIds) internal { // Loop over `operatorSetIds` array and register `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { require( diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index 3c5db125a..409c124c6 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -32,6 +32,7 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { bytes32 internal _DOMAIN_SEPARATOR; /// @notice Mapping: avs => operator => OperatorAVSRegistrationStatus struct + /// @dev This storage will be deprecated once M2 based deregistration is deprecated. mapping(address => mapping(address => OperatorAVSRegistrationStatus)) public avsOperatorStatus; /// @notice Mapping: operator => salt => Whether the salt has been used or not. diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index b01901b9e..e4d1cfc0b 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -42,6 +42,8 @@ contract AVSDirectoryUnitTests is EigenLayerUnitTestSetup, IAVSDirectoryEvents { // Index for flag that pauses registering/deregistering for AVSs uint8 internal constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0; + // Index for flag that pauses operator register/deregister to operator sets when set. + uint8 internal constant PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS = 1; function setUp() public virtual override { // Setup @@ -873,7 +875,7 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni function test_revert_paused() public { cheats.prank(pauser); - avsDirectory.pause(2 ** PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS); + avsDirectory.pause(2 ** PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS); operators = new address[](1); operatorSetIds = new uint32[][](1); From e71a0b838e7aa1e4e821adcc0a36184532981c89 Mon Sep 17 00:00:00 2001 From: Yash Patil Date: Thu, 8 Aug 2024 15:35:12 -0400 Subject: [PATCH 29/43] chore: update gap --- src/contracts/core/AVSDirectoryStorage.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index 409c124c6..b1c6a5e43 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -59,5 +59,5 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[40] private __gap; + uint256[43] private __gap; } From 88a482913acf37b22ea8cff1ceb9fd313f34473e Mon Sep 17 00:00:00 2001 From: Yash Patil Date: Thu, 8 Aug 2024 15:36:09 -0400 Subject: [PATCH 30/43] chore: bindings --- pkg/bindings/AVSDirectory/binding.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 7fe175b3e..706192c17 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -45,7 +45,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetMemberCount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b506040516200390b3803806200390b833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161378d6200017e6000396000612011015260008181610576015281816109f20152611220015261378d6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80639926ee7d11610125578063d79aceab116100ad578063ec76f4421161007c578063ec76f44214610598578063ef2dfa8d146105cc578063f2fde38b146105df578063f698da25146105f2578063fabc1cbc146105fa57600080fd5b8063d79aceab146104f8578063dae226b61461051f578063dce974b91461054a578063df5cf7231461057157600080fd5b8063aec205c5116100f4578063aec205c514610490578063afe02ed514610498578063b2841d48146104ab578063c1a8e2c5146104be578063c825fe68146104d157600080fd5b80639926ee7d14610444578063a1060c8814610457578063a364f4da1461046a578063a98fb3551461047d57600080fd5b8063595c6a67116101a85780637673e93a116101775780637673e93a146103a457806384d76f7b146103c7578063886f1195146103f55780638da5cb5b14610420578063955e66961461043157600080fd5b8063595c6a67146103695780635ac86ab7146103715780635c975abb14610394578063715018a61461039c57600080fd5b806320606b70116101ef57806320606b701461026f578063374823b5146102a95780633c4385d0146102e75780633fee332d1461031b57806349075da31461032e57600080fd5b806310d67a2f14610221578063136439dd146102365780631794bb3c146102495780631e2199e21461025c575b600080fd5b61023461022f366004612d07565b61060d565b005b610234610244366004612d2b565b6106c9565b610234610257366004612d44565b610808565b61023461026a366004612ee9565b610932565b6102967f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6102d76102b7366004612f64565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102a0565b6102d76102f5366004612fa9565b609c60209081526000938452604080852082529284528284209052825290205460ff1681565b610234610329366004612ff0565b610c52565b61035c61033c36600461307e565b609860209081526000928352604080842090915290825290205460ff1681565b6040516102a091906130cd565b610234610e9c565b6102d761037f3660046130f5565b606654600160ff9092169190911b9081161490565b606654610296565b610234610f63565b6102d76103b2366004612d07565b609a6020526000908152604090205460ff1681565b6102d76103d5366004613118565b609b60209081526000928352604080842090915290825290205460ff1681565b606554610408906001600160a01b031681565b6040516001600160a01b0390911681526020016102a0565b6033546001600160a01b0316610408565b61029661043f36600461314d565b610f77565b6102346104523660046131b3565b610fdc565b610296610465366004613202565b6113aa565b610234610478366004612d07565b611414565b61023461048b366004613248565b611551565b610234611598565b6102346104a63660046132b9565b611660565b6102966104b936600461314d565b61182d565b6102346104cc3660046132fa565b61186d565b6102967f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6102967fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b61029661052d366004613118565b609d60209081526000928352604080842090915290825290205481565b6102967f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6102346105a6366004612d2b565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b6102346105da36600461334e565b6118a2565b6102346105ed366004612d07565b611c4b565b610296611cc1565b610234610608366004612d2b565b611cd0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068491906133b9565b6001600160a01b0316336001600160a01b0316146106bd5760405162461bcd60e51b81526004016106b4906133d6565b60405180910390fd5b6106c681611e2c565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107359190613420565b6107515760405162461bcd60e51b81526004016106b490613442565b606654818116146107ca5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156108285750600054600160ff909116105b806108425750303b158015610842575060005460ff166001145b6108a55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b4565b6000805460ff1916600117905580156108c8576000805461ff0019166101001790555b6108d28383611f23565b6108da61200d565b6097556108e6846120d6565b801561092c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6066546000906001908116141561095b5760405162461bcd60e51b81526004016106b49061348a565b42826040015110156109d35760405162461bcd60e51b8152602060048201526047602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a4016106b4565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d9190613420565b610adc5760405162461bcd60e51b8152602060048201526056602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a4016106b4565b336000908152609a602052604090205460ff16610b635760405162461bcd60e51b815260206004820152604b602482015260008051602061371883398151915260448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b6001600160a01b038516600090815260996020908152604080832085830151845290915290205460ff1615610bee5760405162461bcd60e51b815260206004820152603f602482015260008051602061371883398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e740060648201526084016106b4565b610c0e85610c0733878787602001518860400151610f77565b8451612128565b6001600160a01b03851660009081526099602090815260408083208583015184529091529020805460ff19166001179055610c4b338686866122e2565b5050505050565b60665460009060019081161415610c7b5760405162461bcd60e51b81526004016106b49061348a565b815151610d1357336001600160a01b03871614610d0e5760405162461bcd60e51b815260206004820152604560248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2063616c6c6572206d757374206265206f70656064820152643930ba37b960d91b608482015260a4016106b4565b610e88565b4282604001511015610d9e5760405162461bcd60e51b815260206004820152604860248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a206f70657261746f72207369676e617475726560648201526708195e1c1a5c995960c21b608482015260a4016106b4565b6001600160a01b038616600090815260996020908152604080832085830151845290915290205460ff1615610e3d576040805162461bcd60e51b81526020600482015260248101919091527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2073616c7420616c7265616479207370656e7460648201526084016106b4565b610e5686610c078787878760200151886040015161182d565b6001600160a01b03861660009081526099602090815260408083208583015184529091529020805460ff191660011790555b610e948587868661264c565b505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f089190613420565b610f245760405162461bcd60e51b81526004016106b490613442565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f6b6128dc565b610f7560006120d6565b565b6000610fd27f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610fb796959493929190613505565b60405160208183030381529060405280519060200120612936565b9695505050505050565b606654600090600190811614156110055760405162461bcd60e51b81526004016106b49061348a565b428260400151101561106d5760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a206f70657261746f72207369676e61747572652065787069726564000060648201526084016106b4565b336000908152609a602052604090205460ff16156110e15760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a2041565320697320616e206f70657261746f722073657420415653000060648201526084016106b4565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561111b5761111b6130b7565b141561117d5760405162461bcd60e51b815260206004820152603f602482015260008051602061373883398151915260448201527f56533a206f70657261746f7220616c726561647920726567697374657265640060648201526084016106b4565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156112015760405162461bcd60e51b815260206004820152603660248201526000805160206137388339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b60648201526084016106b4565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128b9190613420565b6113015760405162461bcd60e51b815260206004820152604d602482015260008051602061373883398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a4016106b4565b61131983610c078533866020015187604001516113aa565b6001600160a01b038316600081815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161139d91906130cd565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a0810182905260009061140b9060c001610fb7565b95945050505050565b6066546000906001908116141561143d5760405162461bcd60e51b81526004016106b49061348a565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115611477576114776130b7565b146114ea5760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f7420726567697374657265640060648201526084016106b4565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161154591906130cd565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713838360405161158c929190613545565b60405180910390a25050565b336000908152609a602052604090205460ff161561161e5760405162461bcd60e51b815260206004820152603e60248201527f4156534469726563746f72792e6265636f6d654f70657261746f72536574415660448201527f533a20616c726561647920616e206f70657261746f722073657420415653000060648201526084016106b4565b336000818152609a6020526040808220805460ff19166001179055517f702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf9190a2565b60005b8181101561182857336000908152609b602052604081209084848481811061168d5761168d613574565b90506020020160208101906116a2919061358a565b63ffffffff16815260208101919091526040016000205460ff161561172f5760405162461bcd60e51b815260206004820152603b60248201527f4156534469726563746f72792e6372656174654f70657261746f725365743a2060448201527f6f70657261746f722073657420616c726561647920657869737473000000000060648201526084016106b4565b336000908152609b6020526040812060019185858581811061175357611753613574565b9050602002016020810190611768919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280336001600160a01b031681526020018585858181106117e6576117e6613574565b90506020020160208101906117fb919061358a565b63ffffffff16905260405161181091906135a5565b60405180910390a1611821816135e1565b9050611663565b505050565b6000610fd27f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958787878787604051602001610fb796959493929190613505565b606654600090600190811614156118965760405162461bcd60e51b81526004016106b49061348a565b61092c3385858561264c565b606654600090600190811614156118cb5760405162461bcd60e51b81526004016106b49061348a565b336000908152609a602052604090205460ff166119645760405162461bcd60e51b815260206004820152604b60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b60005b84811015610e945760013360009081526098602052604081209088888581811061199357611993613574565b90506020020160208101906119a89190612d07565b6001600160a01b0316815260208101919091526040016000205460ff1660018111156119d6576119d66130b7565b14611a825760405162461bcd60e51b815260206004820152606a60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a206f70657261746f7220616c7265616479206d6960648201527f677261746564206f72206e6f742061206c656761637920726567697374657265608482015269321037b832b930ba37b960b11b60a482015260c4016106b4565b611ad633878784818110611a9857611a98613574565b9050602002016020810190611aad9190612d07565b868685818110611abf57611abf613574565b9050602002810190611ad191906135fc565b6122e2565b33600090815260986020526040812081888885818110611af857611af8613574565b9050602002016020810190611b0d9190612d07565b6001600160a01b031681526020810191909152604001600020805460ff191660018381811115611b3f57611b3f6130b7565b021790555033868683818110611b5757611b57613574565b9050602002016020810190611b6c9190612d07565b6001600160a01b03167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416000604051611ba591906130cd565b60405180910390a333868683818110611bc057611bc0613574565b9050602002016020810190611bd59190612d07565b6001600160a01b03167f54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01868685818110611c1157611c11613574565b9050602002810190611c2391906135fc565b604051611c31929190613645565b60405180910390a380611c43816135e1565b915050611967565b611c536128dc565b6001600160a01b038116611cb85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b4565b6106c6816120d6565b6000611ccb61200d565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4791906133b9565b6001600160a01b0316336001600160a01b031614611d775760405162461bcd60e51b81526004016106b4906133d6565b606654198119606654191614611df55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107fd565b6001600160a01b038116611eba5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016106b4565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316158015611f4457506001600160a01b03821615155b611fc65760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261200982611e2c565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000046141561203e575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561224257604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906121689086908690600401613661565b602060405180830381865afa158015612185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a991906136be565b6001600160e01b031916146118285760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a4016106b4565b826001600160a01b0316612256838361297d565b6001600160a01b0316146118285760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a4016106b4565b60005b81811015610c4b576001600160a01b0385166000908152609b602052604081209084848481811061231857612318613574565b905060200201602081019061232d919061358a565b63ffffffff16815260208101919091526040016000205460ff166123c45760405162461bcd60e51b815260206004820152604260248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a20696e76616c6964206f70657261746f722073606482015261195d60f21b608482015260a4016106b4565b6001600160a01b038086166000908152609c602090815260408083209388168352929052908120908484848181106123fe576123fe613574565b9050602002016020810190612413919061358a565b63ffffffff16815260208101919091526040016000205460ff16156124c65760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a206f70657261746f7220616c7265616479207260648201527f65676973746572656420746f206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0385166000908152609d60205260408120908484848181106124f1576124f1613574565b9050602002016020810190612506919061358a565b63ffffffff1663ffffffff1681526020019081526020016000206000815461252d906135e1565b909155506001600160a01b038086166000908152609c60209081526040808320938816835292905290812060019185858581811061256d5761256d613574565b9050602002016020810190612582919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e6040518060400160405280886001600160a01b0316815260200186868681811061260a5761260a613574565b905060200201602081019061261f919061358a565b63ffffffff16905260405161263491906135a5565b60405180910390a2612645816135e1565b90506122e5565b60005b81811015610c4b576001600160a01b038086166000908152609c6020908152604080832093881683529290529081209084848481811061269157612691613574565b90506020020160208101906126a6919061358a565b63ffffffff16815260208101919091526040016000205460ff166127585760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f646572656769737465724f70657261746f7260448201527f46726f6d4f70657261746f725365743a206f70657261746f72206e6f7420726560648201527f676973746572656420666f72206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0385166000908152609d602052604081209084848481811061278357612783613574565b9050602002016020810190612798919061358a565b63ffffffff1663ffffffff168152602001908152602001600020600081546127bf906136e8565b909155506001600160a01b038086166000908152609c602090815260408083209388168352929052908120818585858181106127fd576127fd613574565b9050602002016020810190612812919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe6040518060400160405280886001600160a01b0316815260200186868681811061289a5761289a613574565b90506020020160208101906128af919061358a565b63ffffffff1690526040516128c491906135a5565b60405180910390a26128d5816135e1565b905061264f565b6033546001600160a01b03163314610f755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b4565b600061294061200d565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b600080600061298c85856129a1565b9150915061299981612a11565b509392505050565b6000808251604114156129d85760208301516040840151606085015160001a6129cc87828585612bcc565b94509450505050612a0a565b825160401415612a0257602083015160408401516129f7868383612cb9565b935093505050612a0a565b506000905060025b9250929050565b6000816004811115612a2557612a256130b7565b1415612a2e5750565b6001816004811115612a4257612a426130b7565b1415612a905760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106b4565b6002816004811115612aa457612aa46130b7565b1415612af25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106b4565b6003816004811115612b0657612b066130b7565b1415612b5f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106b4565b6004816004811115612b7357612b736130b7565b14156106c65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106b4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c035750600090506003612cb0565b8460ff16601b14158015612c1b57508460ff16601c14155b15612c2c5750600090506004612cb0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c80573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ca957600060019250925050612cb0565b9150600090505b94509492505050565b6000806001600160ff1b03831681612cd660ff86901c601b6136ff565b9050612ce487828885612bcc565b935093505050935093915050565b6001600160a01b03811681146106c657600080fd5b600060208284031215612d1957600080fd5b8135612d2481612cf2565b9392505050565b600060208284031215612d3d57600080fd5b5035919050565b600080600060608486031215612d5957600080fd5b8335612d6481612cf2565b92506020840135612d7481612cf2565b929592945050506040919091013590565b60008083601f840112612d9757600080fd5b5081356001600160401b03811115612dae57600080fd5b6020830191508360208260051b8501011115612a0a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612e0157612e01612dc9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e2f57612e2f612dc9565b604052919050565b600060608284031215612e4957600080fd5b612e51612ddf565b905081356001600160401b0380821115612e6a57600080fd5b818401915084601f830112612e7e57600080fd5b8135602082821115612e9257612e92612dc9565b612ea4601f8301601f19168201612e07565b92508183528681838601011115612eba57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b60008060008060608587031215612eff57600080fd5b8435612f0a81612cf2565b935060208501356001600160401b0380821115612f2657600080fd5b612f3288838901612d85565b90955093506040870135915080821115612f4b57600080fd5b50612f5887828801612e37565b91505092959194509250565b60008060408385031215612f7757600080fd5b8235612f8281612cf2565b946020939093013593505050565b803563ffffffff81168114612fa457600080fd5b919050565b600080600060608486031215612fbe57600080fd5b8335612fc981612cf2565b92506020840135612fd981612cf2565b9150612fe760408501612f90565b90509250925092565b60008060008060006080868803121561300857600080fd5b853561301381612cf2565b9450602086013561302381612cf2565b935060408601356001600160401b038082111561303f57600080fd5b61304b89838a01612d85565b9095509350606088013591508082111561306457600080fd5b5061307188828901612e37565b9150509295509295909350565b6000806040838503121561309157600080fd5b823561309c81612cf2565b915060208301356130ac81612cf2565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106130ef57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561310757600080fd5b813560ff81168114612d2457600080fd5b6000806040838503121561312b57600080fd5b823561313681612cf2565b915061314460208401612f90565b90509250929050565b60008060008060006080868803121561316557600080fd5b853561317081612cf2565b945060208601356001600160401b0381111561318b57600080fd5b61319788828901612d85565b9699909850959660408101359660609091013595509350505050565b600080604083850312156131c657600080fd5b82356131d181612cf2565b915060208301356001600160401b038111156131ec57600080fd5b6131f885828601612e37565b9150509250929050565b6000806000806080858703121561321857600080fd5b843561322381612cf2565b9350602085013561323381612cf2565b93969395505050506040820135916060013590565b6000806020838503121561325b57600080fd5b82356001600160401b038082111561327257600080fd5b818501915085601f83011261328657600080fd5b81358181111561329557600080fd5b8660208285010111156132a757600080fd5b60209290920196919550909350505050565b600080602083850312156132cc57600080fd5b82356001600160401b038111156132e257600080fd5b6132ee85828601612d85565b90969095509350505050565b60008060006040848603121561330f57600080fd5b833561331a81612cf2565b925060208401356001600160401b0381111561333557600080fd5b61334186828701612d85565b9497909650939450505050565b6000806000806040858703121561336457600080fd5b84356001600160401b038082111561337b57600080fd5b61338788838901612d85565b909650945060208701359150808211156133a057600080fd5b506133ad87828801612d85565b95989497509550505050565b6000602082840312156133cb57600080fd5b8151612d2481612cf2565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561343257600080fd5b81518015158114612d2457600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b8183526000602080850194508260005b858110156134fa5763ffffffff6134e783612f90565b16875295820195908201906001016134d1565b509495945050505050565b8681526001600160a01b038616602082015260a06040820181905260009061353090830186886134c1565b60608301949094525060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561359c57600080fd5b612d2482612f90565b81516001600160a01b0316815260209182015163ffffffff169181019190915260400190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156135f5576135f56135cb565b5060010190565b6000808335601e1984360301811261361357600080fd5b8301803591506001600160401b0382111561362d57600080fd5b6020019150600581901b3603821315612a0a57600080fd5b6020815260006136596020830184866134c1565b949350505050565b82815260006020604081840152835180604085015260005b8181101561369557858101830151858201606001528201613679565b818111156136a7576000606083870101525b50601f01601f191692909201606001949350505050565b6000602082840312156136d057600080fd5b81516001600160e01b031981168114612d2457600080fd5b6000816136f7576136f76135cb565b506000190190565b60008219821115613712576137126135cb565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f4156534469726563746f72792e72656769737465724f70657261746f72546f41a264697066735822122067d0b14638ce5ceb01bcf3042d51aab2a9d009f53dbd2f7cf36e97c69477fa0c64736f6c634300080c0033", + Bin: "0x60c06040523480156200001157600080fd5b506040516200390b3803806200390b833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161378d6200017e6000396000612011015260008181610576015281816109f20152611220015261378d6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80639926ee7d11610125578063d79aceab116100ad578063ec76f4421161007c578063ec76f44214610598578063ef2dfa8d146105cc578063f2fde38b146105df578063f698da25146105f2578063fabc1cbc146105fa57600080fd5b8063d79aceab146104f8578063dae226b61461051f578063dce974b91461054a578063df5cf7231461057157600080fd5b8063aec205c5116100f4578063aec205c514610490578063afe02ed514610498578063b2841d48146104ab578063c1a8e2c5146104be578063c825fe68146104d157600080fd5b80639926ee7d14610444578063a1060c8814610457578063a364f4da1461046a578063a98fb3551461047d57600080fd5b8063595c6a67116101a85780637673e93a116101775780637673e93a146103a457806384d76f7b146103c7578063886f1195146103f55780638da5cb5b14610420578063955e66961461043157600080fd5b8063595c6a67146103695780635ac86ab7146103715780635c975abb14610394578063715018a61461039c57600080fd5b806320606b70116101ef57806320606b701461026f578063374823b5146102a95780633c4385d0146102e75780633fee332d1461031b57806349075da31461032e57600080fd5b806310d67a2f14610221578063136439dd146102365780631794bb3c146102495780631e2199e21461025c575b600080fd5b61023461022f366004612d07565b61060d565b005b610234610244366004612d2b565b6106c9565b610234610257366004612d44565b610808565b61023461026a366004612ee9565b610932565b6102967f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6102d76102b7366004612f64565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102a0565b6102d76102f5366004612fa9565b609c60209081526000938452604080852082529284528284209052825290205460ff1681565b610234610329366004612ff0565b610c52565b61035c61033c36600461307e565b609860209081526000928352604080842090915290825290205460ff1681565b6040516102a091906130cd565b610234610e9c565b6102d761037f3660046130f5565b606654600160ff9092169190911b9081161490565b606654610296565b610234610f63565b6102d76103b2366004612d07565b609a6020526000908152604090205460ff1681565b6102d76103d5366004613118565b609b60209081526000928352604080842090915290825290205460ff1681565b606554610408906001600160a01b031681565b6040516001600160a01b0390911681526020016102a0565b6033546001600160a01b0316610408565b61029661043f36600461314d565b610f77565b6102346104523660046131b3565b610fdc565b610296610465366004613202565b6113aa565b610234610478366004612d07565b611414565b61023461048b366004613248565b611551565b610234611598565b6102346104a63660046132b9565b611660565b6102966104b936600461314d565b61182d565b6102346104cc3660046132fa565b61186d565b6102967f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6102967fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b61029661052d366004613118565b609d60209081526000928352604080842090915290825290205481565b6102967f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6102346105a6366004612d2b565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b6102346105da36600461334e565b6118a2565b6102346105ed366004612d07565b611c4b565b610296611cc1565b610234610608366004612d2b565b611cd0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068491906133b9565b6001600160a01b0316336001600160a01b0316146106bd5760405162461bcd60e51b81526004016106b4906133d6565b60405180910390fd5b6106c681611e2c565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107359190613420565b6107515760405162461bcd60e51b81526004016106b490613442565b606654818116146107ca5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156108285750600054600160ff909116105b806108425750303b158015610842575060005460ff166001145b6108a55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b4565b6000805460ff1916600117905580156108c8576000805461ff0019166101001790555b6108d28383611f23565b6108da61200d565b6097556108e6846120d6565b801561092c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6066546001906002908116141561095b5760405162461bcd60e51b81526004016106b49061348a565b42826040015110156109d35760405162461bcd60e51b8152602060048201526047602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a4016106b4565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d9190613420565b610adc5760405162461bcd60e51b8152602060048201526056602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a4016106b4565b336000908152609a602052604090205460ff16610b635760405162461bcd60e51b815260206004820152604b602482015260008051602061371883398151915260448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b6001600160a01b038516600090815260996020908152604080832085830151845290915290205460ff1615610bee5760405162461bcd60e51b815260206004820152603f602482015260008051602061371883398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e740060648201526084016106b4565b610c0e85610c0733878787602001518860400151610f77565b8451612128565b6001600160a01b03851660009081526099602090815260408083208583015184529091529020805460ff19166001179055610c4b853386866122e2565b5050505050565b60665460019060029081161415610c7b5760405162461bcd60e51b81526004016106b49061348a565b815151610d1357336001600160a01b03871614610d0e5760405162461bcd60e51b815260206004820152604560248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2063616c6c6572206d757374206265206f70656064820152643930ba37b960d91b608482015260a4016106b4565b610e88565b4282604001511015610d9e5760405162461bcd60e51b815260206004820152604860248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a206f70657261746f72207369676e617475726560648201526708195e1c1a5c995960c21b608482015260a4016106b4565b6001600160a01b038616600090815260996020908152604080832085830151845290915290205460ff1615610e3d576040805162461bcd60e51b81526020600482015260248101919091527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2073616c7420616c7265616479207370656e7460648201526084016106b4565b610e5686610c078787878760200151886040015161182d565b6001600160a01b03861660009081526099602090815260408083208583015184529091529020805460ff191660011790555b610e948587868661264c565b505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f089190613420565b610f245760405162461bcd60e51b81526004016106b490613442565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f6b6128dc565b610f7560006120d6565b565b6000610fd27f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610fb796959493929190613505565b60405160208183030381529060405280519060200120612936565b9695505050505050565b606654600090600190811614156110055760405162461bcd60e51b81526004016106b49061348a565b428260400151101561106d5760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a206f70657261746f72207369676e61747572652065787069726564000060648201526084016106b4565b336000908152609a602052604090205460ff16156110e15760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a2041565320697320616e206f70657261746f722073657420415653000060648201526084016106b4565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561111b5761111b6130b7565b141561117d5760405162461bcd60e51b815260206004820152603f602482015260008051602061373883398151915260448201527f56533a206f70657261746f7220616c726561647920726567697374657265640060648201526084016106b4565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156112015760405162461bcd60e51b815260206004820152603660248201526000805160206137388339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b60648201526084016106b4565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128b9190613420565b6113015760405162461bcd60e51b815260206004820152604d602482015260008051602061373883398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a4016106b4565b61131983610c078533866020015187604001516113aa565b6001600160a01b038316600081815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161139d91906130cd565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a0810182905260009061140b9060c001610fb7565b95945050505050565b6066546000906001908116141561143d5760405162461bcd60e51b81526004016106b49061348a565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115611477576114776130b7565b146114ea5760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f7420726567697374657265640060648201526084016106b4565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161154591906130cd565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713838360405161158c929190613545565b60405180910390a25050565b336000908152609a602052604090205460ff161561161e5760405162461bcd60e51b815260206004820152603e60248201527f4156534469726563746f72792e6265636f6d654f70657261746f72536574415660448201527f533a20616c726561647920616e206f70657261746f722073657420415653000060648201526084016106b4565b336000818152609a6020526040808220805460ff19166001179055517f702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf9190a2565b60005b8181101561182857336000908152609b602052604081209084848481811061168d5761168d613574565b90506020020160208101906116a2919061358a565b63ffffffff16815260208101919091526040016000205460ff161561172f5760405162461bcd60e51b815260206004820152603b60248201527f4156534469726563746f72792e6372656174654f70657261746f725365743a2060448201527f6f70657261746f722073657420616c726561647920657869737473000000000060648201526084016106b4565b336000908152609b6020526040812060019185858581811061175357611753613574565b9050602002016020810190611768919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280336001600160a01b031681526020018585858181106117e6576117e6613574565b90506020020160208101906117fb919061358a565b63ffffffff16905260405161181091906135a5565b60405180910390a1611821816135e1565b9050611663565b505050565b6000610fd27f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958787878787604051602001610fb796959493929190613505565b606654600190600290811614156118965760405162461bcd60e51b81526004016106b49061348a565b61092c3385858561264c565b606654600190600290811614156118cb5760405162461bcd60e51b81526004016106b49061348a565b336000908152609a602052604090205460ff166119645760405162461bcd60e51b815260206004820152604b60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b60005b84811015610e945760013360009081526098602052604081209088888581811061199357611993613574565b90506020020160208101906119a89190612d07565b6001600160a01b0316815260208101919091526040016000205460ff1660018111156119d6576119d66130b7565b14611a825760405162461bcd60e51b815260206004820152606a60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a206f70657261746f7220616c7265616479206d6960648201527f677261746564206f72206e6f742061206c656761637920726567697374657265608482015269321037b832b930ba37b960b11b60a482015260c4016106b4565b611ad6868683818110611a9757611a97613574565b9050602002016020810190611aac9190612d07565b33868685818110611abf57611abf613574565b9050602002810190611ad191906135fc565b6122e2565b33600090815260986020526040812081888885818110611af857611af8613574565b9050602002016020810190611b0d9190612d07565b6001600160a01b031681526020810191909152604001600020805460ff191660018381811115611b3f57611b3f6130b7565b021790555033868683818110611b5757611b57613574565b9050602002016020810190611b6c9190612d07565b6001600160a01b03167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416000604051611ba591906130cd565b60405180910390a333868683818110611bc057611bc0613574565b9050602002016020810190611bd59190612d07565b6001600160a01b03167f54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01868685818110611c1157611c11613574565b9050602002810190611c2391906135fc565b604051611c31929190613645565b60405180910390a380611c43816135e1565b915050611967565b611c536128dc565b6001600160a01b038116611cb85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b4565b6106c6816120d6565b6000611ccb61200d565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4791906133b9565b6001600160a01b0316336001600160a01b031614611d775760405162461bcd60e51b81526004016106b4906133d6565b606654198119606654191614611df55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107fd565b6001600160a01b038116611eba5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016106b4565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316158015611f4457506001600160a01b03821615155b611fc65760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261200982611e2c565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000046141561203e575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561224257604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906121689086908690600401613661565b602060405180830381865afa158015612185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a991906136be565b6001600160e01b031916146118285760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a4016106b4565b826001600160a01b0316612256838361297d565b6001600160a01b0316146118285760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a4016106b4565b60005b81811015610c4b576001600160a01b0384166000908152609b602052604081209084848481811061231857612318613574565b905060200201602081019061232d919061358a565b63ffffffff16815260208101919091526040016000205460ff166123c45760405162461bcd60e51b815260206004820152604260248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a20696e76616c6964206f70657261746f722073606482015261195d60f21b608482015260a4016106b4565b6001600160a01b038085166000908152609c602090815260408083209389168352929052908120908484848181106123fe576123fe613574565b9050602002016020810190612413919061358a565b63ffffffff16815260208101919091526040016000205460ff16156124c65760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a206f70657261746f7220616c7265616479207260648201527f65676973746572656420746f206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0384166000908152609d60205260408120908484848181106124f1576124f1613574565b9050602002016020810190612506919061358a565b63ffffffff1663ffffffff1681526020019081526020016000206000815461252d906135e1565b909155506001600160a01b038085166000908152609c60209081526040808320938916835292905290812060019185858581811061256d5761256d613574565b9050602002016020810190612582919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550846001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e6040518060400160405280876001600160a01b0316815260200186868681811061260a5761260a613574565b905060200201602081019061261f919061358a565b63ffffffff16905260405161263491906135a5565b60405180910390a2612645816135e1565b90506122e5565b60005b81811015610c4b576001600160a01b038086166000908152609c6020908152604080832093881683529290529081209084848481811061269157612691613574565b90506020020160208101906126a6919061358a565b63ffffffff16815260208101919091526040016000205460ff166127585760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f646572656769737465724f70657261746f7260448201527f46726f6d4f70657261746f725365743a206f70657261746f72206e6f7420726560648201527f676973746572656420666f72206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0385166000908152609d602052604081209084848481811061278357612783613574565b9050602002016020810190612798919061358a565b63ffffffff1663ffffffff168152602001908152602001600020600081546127bf906136e8565b909155506001600160a01b038086166000908152609c602090815260408083209388168352929052908120818585858181106127fd576127fd613574565b9050602002016020810190612812919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe6040518060400160405280886001600160a01b0316815260200186868681811061289a5761289a613574565b90506020020160208101906128af919061358a565b63ffffffff1690526040516128c491906135a5565b60405180910390a26128d5816135e1565b905061264f565b6033546001600160a01b03163314610f755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b4565b600061294061200d565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b600080600061298c85856129a1565b9150915061299981612a11565b509392505050565b6000808251604114156129d85760208301516040840151606085015160001a6129cc87828585612bcc565b94509450505050612a0a565b825160401415612a0257602083015160408401516129f7868383612cb9565b935093505050612a0a565b506000905060025b9250929050565b6000816004811115612a2557612a256130b7565b1415612a2e5750565b6001816004811115612a4257612a426130b7565b1415612a905760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106b4565b6002816004811115612aa457612aa46130b7565b1415612af25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106b4565b6003816004811115612b0657612b066130b7565b1415612b5f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106b4565b6004816004811115612b7357612b736130b7565b14156106c65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106b4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c035750600090506003612cb0565b8460ff16601b14158015612c1b57508460ff16601c14155b15612c2c5750600090506004612cb0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c80573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ca957600060019250925050612cb0565b9150600090505b94509492505050565b6000806001600160ff1b03831681612cd660ff86901c601b6136ff565b9050612ce487828885612bcc565b935093505050935093915050565b6001600160a01b03811681146106c657600080fd5b600060208284031215612d1957600080fd5b8135612d2481612cf2565b9392505050565b600060208284031215612d3d57600080fd5b5035919050565b600080600060608486031215612d5957600080fd5b8335612d6481612cf2565b92506020840135612d7481612cf2565b929592945050506040919091013590565b60008083601f840112612d9757600080fd5b5081356001600160401b03811115612dae57600080fd5b6020830191508360208260051b8501011115612a0a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612e0157612e01612dc9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e2f57612e2f612dc9565b604052919050565b600060608284031215612e4957600080fd5b612e51612ddf565b905081356001600160401b0380821115612e6a57600080fd5b818401915084601f830112612e7e57600080fd5b8135602082821115612e9257612e92612dc9565b612ea4601f8301601f19168201612e07565b92508183528681838601011115612eba57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b60008060008060608587031215612eff57600080fd5b8435612f0a81612cf2565b935060208501356001600160401b0380821115612f2657600080fd5b612f3288838901612d85565b90955093506040870135915080821115612f4b57600080fd5b50612f5887828801612e37565b91505092959194509250565b60008060408385031215612f7757600080fd5b8235612f8281612cf2565b946020939093013593505050565b803563ffffffff81168114612fa457600080fd5b919050565b600080600060608486031215612fbe57600080fd5b8335612fc981612cf2565b92506020840135612fd981612cf2565b9150612fe760408501612f90565b90509250925092565b60008060008060006080868803121561300857600080fd5b853561301381612cf2565b9450602086013561302381612cf2565b935060408601356001600160401b038082111561303f57600080fd5b61304b89838a01612d85565b9095509350606088013591508082111561306457600080fd5b5061307188828901612e37565b9150509295509295909350565b6000806040838503121561309157600080fd5b823561309c81612cf2565b915060208301356130ac81612cf2565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106130ef57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561310757600080fd5b813560ff81168114612d2457600080fd5b6000806040838503121561312b57600080fd5b823561313681612cf2565b915061314460208401612f90565b90509250929050565b60008060008060006080868803121561316557600080fd5b853561317081612cf2565b945060208601356001600160401b0381111561318b57600080fd5b61319788828901612d85565b9699909850959660408101359660609091013595509350505050565b600080604083850312156131c657600080fd5b82356131d181612cf2565b915060208301356001600160401b038111156131ec57600080fd5b6131f885828601612e37565b9150509250929050565b6000806000806080858703121561321857600080fd5b843561322381612cf2565b9350602085013561323381612cf2565b93969395505050506040820135916060013590565b6000806020838503121561325b57600080fd5b82356001600160401b038082111561327257600080fd5b818501915085601f83011261328657600080fd5b81358181111561329557600080fd5b8660208285010111156132a757600080fd5b60209290920196919550909350505050565b600080602083850312156132cc57600080fd5b82356001600160401b038111156132e257600080fd5b6132ee85828601612d85565b90969095509350505050565b60008060006040848603121561330f57600080fd5b833561331a81612cf2565b925060208401356001600160401b0381111561333557600080fd5b61334186828701612d85565b9497909650939450505050565b6000806000806040858703121561336457600080fd5b84356001600160401b038082111561337b57600080fd5b61338788838901612d85565b909650945060208701359150808211156133a057600080fd5b506133ad87828801612d85565b95989497509550505050565b6000602082840312156133cb57600080fd5b8151612d2481612cf2565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561343257600080fd5b81518015158114612d2457600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b8183526000602080850194508260005b858110156134fa5763ffffffff6134e783612f90565b16875295820195908201906001016134d1565b509495945050505050565b8681526001600160a01b038616602082015260a06040820181905260009061353090830186886134c1565b60608301949094525060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561359c57600080fd5b612d2482612f90565b81516001600160a01b0316815260209182015163ffffffff169181019190915260400190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156135f5576135f56135cb565b5060010190565b6000808335601e1984360301811261361357600080fd5b8301803591506001600160401b0382111561362d57600080fd5b6020019150600581901b3603821315612a0a57600080fd5b6020815260006136596020830184866134c1565b949350505050565b82815260006020604081840152835180604085015260005b8181101561369557858101830151858201606001528201613679565b818111156136a7576000606083870101525b50601f01601f191692909201606001949350505050565b6000602082840312156136d057600080fd5b81516001600160e01b031981168114612d2457600080fd5b6000816136f7576136f76135cb565b506000190190565b60008219821115613712576137126135cb565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220f717d2abfc5e1b00d23a6bac7bafaeb65202da5074ca03a6617b228952bf6e8564736f6c634300080c0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. From 3e36c1bfa495af73f19763e18f08df38044fa47e Mon Sep 17 00:00:00 2001 From: Yash Patil Date: Thu, 8 Aug 2024 15:51:09 -0400 Subject: [PATCH 31/43] fix: deployers --- .../devnet/M2_deploy_from_scratch.anvil.config.json | 4 +++- script/deploy/devnet/M2_Deploy_From_Scratch.s.sol | 13 ++++++++++++- script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol | 10 ++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/script/configs/devnet/M2_deploy_from_scratch.anvil.config.json b/script/configs/devnet/M2_deploy_from_scratch.anvil.config.json index b4ccb27dc..20a5cfb06 100644 --- a/script/configs/devnet/M2_deploy_from_scratch.anvil.config.json +++ b/script/configs/devnet/M2_deploy_from_scratch.anvil.config.json @@ -38,7 +38,9 @@ "rewards_updater_address": "0x18a0f92Ad9645385E8A8f3db7d0f6CF7aBBb0aD4", "activation_delay": 7200, "calculation_interval_seconds": 604800, - "global_operator_commission_bips": 1000 + "global_operator_commission_bips": 1000, + "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1719964800, + "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000 }, "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa" } \ No newline at end of file diff --git a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol index 36a1bd7b8..b6ce00e72 100644 --- a/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol +++ b/script/deploy/devnet/M2_Deploy_From_Scratch.s.sol @@ -101,6 +101,8 @@ contract Deployer_M2 is Script, Test { uint32 REWARDS_COORDINATOR_ACTIVATION_DELAY; uint32 REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS; uint32 REWARDS_COORDINATOR_GLOBAL_OPERATOR_COMMISSION_BIPS; + uint32 REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP; + uint32 REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH; // one week in blocks -- 50400 uint32 STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS; @@ -145,6 +147,12 @@ contract Deployer_M2 is Script, Test { REWARDS_COORDINATOR_GLOBAL_OPERATOR_COMMISSION_BIPS = uint32( stdJson.readUint(config_data, ".rewardsCoordinator.global_operator_commission_bips") ); + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP = uint32( + stdJson.readUint(config_data, ".rewardsCoordinator.OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP") + ); + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH = uint32( + stdJson.readUint(config_data, ".rewardsCoordinator.OPERATOR_SET_MAX_RETROACTIVE_LENGTH") + ); STRATEGY_MANAGER_INIT_WITHDRAWAL_DELAY_BLOCKS = uint32( stdJson.readUint(config_data, ".strategyManager.init_withdrawal_delay_blocks") @@ -245,11 +253,14 @@ contract Deployer_M2 is Script, Test { rewardsCoordinatorImplementation = new RewardsCoordinator( delegation, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. diff --git a/script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol b/script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol index a91ff4873..b24233d09 100644 --- a/script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol +++ b/script/deploy/mainnet/v0.3.0-mainnet-rewards.s.sol @@ -52,11 +52,14 @@ contract MainnetRewardsCoordinatorDeploy is ExistingDeploymentParser { rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManager, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); rewardsCoordinator = RewardsCoordinator( address( @@ -85,11 +88,14 @@ contract MainnetRewardsCoordinatorDeploy is ExistingDeploymentParser { rewardsCoordinatorImplementation = new RewardsCoordinator( delegationManager, strategyManager, + avsDirectory, REWARDS_COORDINATOR_CALCULATION_INTERVAL_SECONDS, REWARDS_COORDINATOR_MAX_REWARDS_DURATION, REWARDS_COORDINATOR_MAX_RETROACTIVE_LENGTH, REWARDS_COORDINATOR_MAX_FUTURE_LENGTH, - REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP + REWARDS_COORDINATOR_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP, + REWARDS_COORDINATOR_OPERATOR_SET_MAX_RETROACTIVE_LENGTH ); eigenLayerProxyAdmin.upgrade( From e957feda9cac06714afbd95d9391006d04d61b5c Mon Sep 17 00:00:00 2001 From: Yash Patil Date: Thu, 8 Aug 2024 15:58:51 -0400 Subject: [PATCH 32/43] fix: deploy config --- script/configs/devnet/M2_deploy_from_scratch.anvil.config.json | 2 +- .../holesky/Deploy_RewardsCoordinator.holesky.config.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/script/configs/devnet/M2_deploy_from_scratch.anvil.config.json b/script/configs/devnet/M2_deploy_from_scratch.anvil.config.json index 20a5cfb06..8221dfaac 100644 --- a/script/configs/devnet/M2_deploy_from_scratch.anvil.config.json +++ b/script/configs/devnet/M2_deploy_from_scratch.anvil.config.json @@ -39,7 +39,7 @@ "activation_delay": 7200, "calculation_interval_seconds": 604800, "global_operator_commission_bips": 1000, - "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1719964800, + "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000, "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000 }, "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa" diff --git a/script/configs/holesky/Deploy_RewardsCoordinator.holesky.config.json b/script/configs/holesky/Deploy_RewardsCoordinator.holesky.config.json index d012c178d..ecd86e029 100644 --- a/script/configs/holesky/Deploy_RewardsCoordinator.holesky.config.json +++ b/script/configs/holesky/Deploy_RewardsCoordinator.holesky.config.json @@ -34,7 +34,7 @@ "activation_delay": 7200, "calculation_interval_seconds": 604800, "global_operator_commission_bips": 1000, - "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1719964800, + "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000, "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000 }, "avsDirectory": { From 191e7feadcb6ebb9fa449b3377ee7180a39a522f Mon Sep 17 00:00:00 2001 From: Michael Sun <35479365+8sunyuan@users.noreply.github.com> Date: Fri, 9 Aug 2024 14:06:42 -0400 Subject: [PATCH 33/43] fix: fix operator commission tests (#673) * fix: flakey tests * build: bindings * fix: out of gas error --- pkg/bindings/AVSDirectory/binding.go | 2 +- pkg/bindings/DelayedWithdrawalRouter/binding.go | 2 +- pkg/bindings/DelegationManager/binding.go | 2 +- pkg/bindings/EigenPod/binding.go | 2 +- pkg/bindings/EigenPodManager/binding.go | 6 +----- pkg/bindings/EigenStrategy/binding.go | 4 ++-- pkg/bindings/RewardsCoordinator/binding.go | 2 +- pkg/bindings/StrategyBase/binding.go | 4 ++-- pkg/bindings/StrategyBaseTVLLimits/binding.go | 4 ++-- pkg/bindings/StrategyManager/binding.go | 4 ---- src/test/unit/AVSDirectoryUnit.t.sol | 1 + src/test/unit/RewardsCoordinatorUnit.t.sol | 17 ++++++++++++----- 12 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 706192c17..68532389b 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -45,7 +45,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetMemberCount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b506040516200390b3803806200390b833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161378d6200017e6000396000612011015260008181610576015281816109f20152611220015261378d6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80639926ee7d11610125578063d79aceab116100ad578063ec76f4421161007c578063ec76f44214610598578063ef2dfa8d146105cc578063f2fde38b146105df578063f698da25146105f2578063fabc1cbc146105fa57600080fd5b8063d79aceab146104f8578063dae226b61461051f578063dce974b91461054a578063df5cf7231461057157600080fd5b8063aec205c5116100f4578063aec205c514610490578063afe02ed514610498578063b2841d48146104ab578063c1a8e2c5146104be578063c825fe68146104d157600080fd5b80639926ee7d14610444578063a1060c8814610457578063a364f4da1461046a578063a98fb3551461047d57600080fd5b8063595c6a67116101a85780637673e93a116101775780637673e93a146103a457806384d76f7b146103c7578063886f1195146103f55780638da5cb5b14610420578063955e66961461043157600080fd5b8063595c6a67146103695780635ac86ab7146103715780635c975abb14610394578063715018a61461039c57600080fd5b806320606b70116101ef57806320606b701461026f578063374823b5146102a95780633c4385d0146102e75780633fee332d1461031b57806349075da31461032e57600080fd5b806310d67a2f14610221578063136439dd146102365780631794bb3c146102495780631e2199e21461025c575b600080fd5b61023461022f366004612d07565b61060d565b005b610234610244366004612d2b565b6106c9565b610234610257366004612d44565b610808565b61023461026a366004612ee9565b610932565b6102967f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6102d76102b7366004612f64565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102a0565b6102d76102f5366004612fa9565b609c60209081526000938452604080852082529284528284209052825290205460ff1681565b610234610329366004612ff0565b610c52565b61035c61033c36600461307e565b609860209081526000928352604080842090915290825290205460ff1681565b6040516102a091906130cd565b610234610e9c565b6102d761037f3660046130f5565b606654600160ff9092169190911b9081161490565b606654610296565b610234610f63565b6102d76103b2366004612d07565b609a6020526000908152604090205460ff1681565b6102d76103d5366004613118565b609b60209081526000928352604080842090915290825290205460ff1681565b606554610408906001600160a01b031681565b6040516001600160a01b0390911681526020016102a0565b6033546001600160a01b0316610408565b61029661043f36600461314d565b610f77565b6102346104523660046131b3565b610fdc565b610296610465366004613202565b6113aa565b610234610478366004612d07565b611414565b61023461048b366004613248565b611551565b610234611598565b6102346104a63660046132b9565b611660565b6102966104b936600461314d565b61182d565b6102346104cc3660046132fa565b61186d565b6102967f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6102967fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b61029661052d366004613118565b609d60209081526000928352604080842090915290825290205481565b6102967f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6102346105a6366004612d2b565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b6102346105da36600461334e565b6118a2565b6102346105ed366004612d07565b611c4b565b610296611cc1565b610234610608366004612d2b565b611cd0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068491906133b9565b6001600160a01b0316336001600160a01b0316146106bd5760405162461bcd60e51b81526004016106b4906133d6565b60405180910390fd5b6106c681611e2c565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107359190613420565b6107515760405162461bcd60e51b81526004016106b490613442565b606654818116146107ca5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156108285750600054600160ff909116105b806108425750303b158015610842575060005460ff166001145b6108a55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b4565b6000805460ff1916600117905580156108c8576000805461ff0019166101001790555b6108d28383611f23565b6108da61200d565b6097556108e6846120d6565b801561092c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6066546001906002908116141561095b5760405162461bcd60e51b81526004016106b49061348a565b42826040015110156109d35760405162461bcd60e51b8152602060048201526047602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a4016106b4565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d9190613420565b610adc5760405162461bcd60e51b8152602060048201526056602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a4016106b4565b336000908152609a602052604090205460ff16610b635760405162461bcd60e51b815260206004820152604b602482015260008051602061371883398151915260448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b6001600160a01b038516600090815260996020908152604080832085830151845290915290205460ff1615610bee5760405162461bcd60e51b815260206004820152603f602482015260008051602061371883398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e740060648201526084016106b4565b610c0e85610c0733878787602001518860400151610f77565b8451612128565b6001600160a01b03851660009081526099602090815260408083208583015184529091529020805460ff19166001179055610c4b853386866122e2565b5050505050565b60665460019060029081161415610c7b5760405162461bcd60e51b81526004016106b49061348a565b815151610d1357336001600160a01b03871614610d0e5760405162461bcd60e51b815260206004820152604560248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2063616c6c6572206d757374206265206f70656064820152643930ba37b960d91b608482015260a4016106b4565b610e88565b4282604001511015610d9e5760405162461bcd60e51b815260206004820152604860248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a206f70657261746f72207369676e617475726560648201526708195e1c1a5c995960c21b608482015260a4016106b4565b6001600160a01b038616600090815260996020908152604080832085830151845290915290205460ff1615610e3d576040805162461bcd60e51b81526020600482015260248101919091527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2073616c7420616c7265616479207370656e7460648201526084016106b4565b610e5686610c078787878760200151886040015161182d565b6001600160a01b03861660009081526099602090815260408083208583015184529091529020805460ff191660011790555b610e948587868661264c565b505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f089190613420565b610f245760405162461bcd60e51b81526004016106b490613442565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f6b6128dc565b610f7560006120d6565b565b6000610fd27f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610fb796959493929190613505565b60405160208183030381529060405280519060200120612936565b9695505050505050565b606654600090600190811614156110055760405162461bcd60e51b81526004016106b49061348a565b428260400151101561106d5760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a206f70657261746f72207369676e61747572652065787069726564000060648201526084016106b4565b336000908152609a602052604090205460ff16156110e15760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a2041565320697320616e206f70657261746f722073657420415653000060648201526084016106b4565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561111b5761111b6130b7565b141561117d5760405162461bcd60e51b815260206004820152603f602482015260008051602061373883398151915260448201527f56533a206f70657261746f7220616c726561647920726567697374657265640060648201526084016106b4565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156112015760405162461bcd60e51b815260206004820152603660248201526000805160206137388339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b60648201526084016106b4565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128b9190613420565b6113015760405162461bcd60e51b815260206004820152604d602482015260008051602061373883398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a4016106b4565b61131983610c078533866020015187604001516113aa565b6001600160a01b038316600081815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161139d91906130cd565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a0810182905260009061140b9060c001610fb7565b95945050505050565b6066546000906001908116141561143d5760405162461bcd60e51b81526004016106b49061348a565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115611477576114776130b7565b146114ea5760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f7420726567697374657265640060648201526084016106b4565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161154591906130cd565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713838360405161158c929190613545565b60405180910390a25050565b336000908152609a602052604090205460ff161561161e5760405162461bcd60e51b815260206004820152603e60248201527f4156534469726563746f72792e6265636f6d654f70657261746f72536574415660448201527f533a20616c726561647920616e206f70657261746f722073657420415653000060648201526084016106b4565b336000818152609a6020526040808220805460ff19166001179055517f702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf9190a2565b60005b8181101561182857336000908152609b602052604081209084848481811061168d5761168d613574565b90506020020160208101906116a2919061358a565b63ffffffff16815260208101919091526040016000205460ff161561172f5760405162461bcd60e51b815260206004820152603b60248201527f4156534469726563746f72792e6372656174654f70657261746f725365743a2060448201527f6f70657261746f722073657420616c726561647920657869737473000000000060648201526084016106b4565b336000908152609b6020526040812060019185858581811061175357611753613574565b9050602002016020810190611768919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280336001600160a01b031681526020018585858181106117e6576117e6613574565b90506020020160208101906117fb919061358a565b63ffffffff16905260405161181091906135a5565b60405180910390a1611821816135e1565b9050611663565b505050565b6000610fd27f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958787878787604051602001610fb796959493929190613505565b606654600190600290811614156118965760405162461bcd60e51b81526004016106b49061348a565b61092c3385858561264c565b606654600190600290811614156118cb5760405162461bcd60e51b81526004016106b49061348a565b336000908152609a602052604090205460ff166119645760405162461bcd60e51b815260206004820152604b60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b60005b84811015610e945760013360009081526098602052604081209088888581811061199357611993613574565b90506020020160208101906119a89190612d07565b6001600160a01b0316815260208101919091526040016000205460ff1660018111156119d6576119d66130b7565b14611a825760405162461bcd60e51b815260206004820152606a60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a206f70657261746f7220616c7265616479206d6960648201527f677261746564206f72206e6f742061206c656761637920726567697374657265608482015269321037b832b930ba37b960b11b60a482015260c4016106b4565b611ad6868683818110611a9757611a97613574565b9050602002016020810190611aac9190612d07565b33868685818110611abf57611abf613574565b9050602002810190611ad191906135fc565b6122e2565b33600090815260986020526040812081888885818110611af857611af8613574565b9050602002016020810190611b0d9190612d07565b6001600160a01b031681526020810191909152604001600020805460ff191660018381811115611b3f57611b3f6130b7565b021790555033868683818110611b5757611b57613574565b9050602002016020810190611b6c9190612d07565b6001600160a01b03167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416000604051611ba591906130cd565b60405180910390a333868683818110611bc057611bc0613574565b9050602002016020810190611bd59190612d07565b6001600160a01b03167f54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01868685818110611c1157611c11613574565b9050602002810190611c2391906135fc565b604051611c31929190613645565b60405180910390a380611c43816135e1565b915050611967565b611c536128dc565b6001600160a01b038116611cb85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b4565b6106c6816120d6565b6000611ccb61200d565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4791906133b9565b6001600160a01b0316336001600160a01b031614611d775760405162461bcd60e51b81526004016106b4906133d6565b606654198119606654191614611df55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107fd565b6001600160a01b038116611eba5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016106b4565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316158015611f4457506001600160a01b03821615155b611fc65760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261200982611e2c565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000046141561203e575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561224257604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906121689086908690600401613661565b602060405180830381865afa158015612185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a991906136be565b6001600160e01b031916146118285760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a4016106b4565b826001600160a01b0316612256838361297d565b6001600160a01b0316146118285760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a4016106b4565b60005b81811015610c4b576001600160a01b0384166000908152609b602052604081209084848481811061231857612318613574565b905060200201602081019061232d919061358a565b63ffffffff16815260208101919091526040016000205460ff166123c45760405162461bcd60e51b815260206004820152604260248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a20696e76616c6964206f70657261746f722073606482015261195d60f21b608482015260a4016106b4565b6001600160a01b038085166000908152609c602090815260408083209389168352929052908120908484848181106123fe576123fe613574565b9050602002016020810190612413919061358a565b63ffffffff16815260208101919091526040016000205460ff16156124c65760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a206f70657261746f7220616c7265616479207260648201527f65676973746572656420746f206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0384166000908152609d60205260408120908484848181106124f1576124f1613574565b9050602002016020810190612506919061358a565b63ffffffff1663ffffffff1681526020019081526020016000206000815461252d906135e1565b909155506001600160a01b038085166000908152609c60209081526040808320938916835292905290812060019185858581811061256d5761256d613574565b9050602002016020810190612582919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550846001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e6040518060400160405280876001600160a01b0316815260200186868681811061260a5761260a613574565b905060200201602081019061261f919061358a565b63ffffffff16905260405161263491906135a5565b60405180910390a2612645816135e1565b90506122e5565b60005b81811015610c4b576001600160a01b038086166000908152609c6020908152604080832093881683529290529081209084848481811061269157612691613574565b90506020020160208101906126a6919061358a565b63ffffffff16815260208101919091526040016000205460ff166127585760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f646572656769737465724f70657261746f7260448201527f46726f6d4f70657261746f725365743a206f70657261746f72206e6f7420726560648201527f676973746572656420666f72206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0385166000908152609d602052604081209084848481811061278357612783613574565b9050602002016020810190612798919061358a565b63ffffffff1663ffffffff168152602001908152602001600020600081546127bf906136e8565b909155506001600160a01b038086166000908152609c602090815260408083209388168352929052908120818585858181106127fd576127fd613574565b9050602002016020810190612812919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe6040518060400160405280886001600160a01b0316815260200186868681811061289a5761289a613574565b90506020020160208101906128af919061358a565b63ffffffff1690526040516128c491906135a5565b60405180910390a26128d5816135e1565b905061264f565b6033546001600160a01b03163314610f755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b4565b600061294061200d565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b600080600061298c85856129a1565b9150915061299981612a11565b509392505050565b6000808251604114156129d85760208301516040840151606085015160001a6129cc87828585612bcc565b94509450505050612a0a565b825160401415612a0257602083015160408401516129f7868383612cb9565b935093505050612a0a565b506000905060025b9250929050565b6000816004811115612a2557612a256130b7565b1415612a2e5750565b6001816004811115612a4257612a426130b7565b1415612a905760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106b4565b6002816004811115612aa457612aa46130b7565b1415612af25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106b4565b6003816004811115612b0657612b066130b7565b1415612b5f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106b4565b6004816004811115612b7357612b736130b7565b14156106c65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106b4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c035750600090506003612cb0565b8460ff16601b14158015612c1b57508460ff16601c14155b15612c2c5750600090506004612cb0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c80573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ca957600060019250925050612cb0565b9150600090505b94509492505050565b6000806001600160ff1b03831681612cd660ff86901c601b6136ff565b9050612ce487828885612bcc565b935093505050935093915050565b6001600160a01b03811681146106c657600080fd5b600060208284031215612d1957600080fd5b8135612d2481612cf2565b9392505050565b600060208284031215612d3d57600080fd5b5035919050565b600080600060608486031215612d5957600080fd5b8335612d6481612cf2565b92506020840135612d7481612cf2565b929592945050506040919091013590565b60008083601f840112612d9757600080fd5b5081356001600160401b03811115612dae57600080fd5b6020830191508360208260051b8501011115612a0a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612e0157612e01612dc9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e2f57612e2f612dc9565b604052919050565b600060608284031215612e4957600080fd5b612e51612ddf565b905081356001600160401b0380821115612e6a57600080fd5b818401915084601f830112612e7e57600080fd5b8135602082821115612e9257612e92612dc9565b612ea4601f8301601f19168201612e07565b92508183528681838601011115612eba57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b60008060008060608587031215612eff57600080fd5b8435612f0a81612cf2565b935060208501356001600160401b0380821115612f2657600080fd5b612f3288838901612d85565b90955093506040870135915080821115612f4b57600080fd5b50612f5887828801612e37565b91505092959194509250565b60008060408385031215612f7757600080fd5b8235612f8281612cf2565b946020939093013593505050565b803563ffffffff81168114612fa457600080fd5b919050565b600080600060608486031215612fbe57600080fd5b8335612fc981612cf2565b92506020840135612fd981612cf2565b9150612fe760408501612f90565b90509250925092565b60008060008060006080868803121561300857600080fd5b853561301381612cf2565b9450602086013561302381612cf2565b935060408601356001600160401b038082111561303f57600080fd5b61304b89838a01612d85565b9095509350606088013591508082111561306457600080fd5b5061307188828901612e37565b9150509295509295909350565b6000806040838503121561309157600080fd5b823561309c81612cf2565b915060208301356130ac81612cf2565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106130ef57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561310757600080fd5b813560ff81168114612d2457600080fd5b6000806040838503121561312b57600080fd5b823561313681612cf2565b915061314460208401612f90565b90509250929050565b60008060008060006080868803121561316557600080fd5b853561317081612cf2565b945060208601356001600160401b0381111561318b57600080fd5b61319788828901612d85565b9699909850959660408101359660609091013595509350505050565b600080604083850312156131c657600080fd5b82356131d181612cf2565b915060208301356001600160401b038111156131ec57600080fd5b6131f885828601612e37565b9150509250929050565b6000806000806080858703121561321857600080fd5b843561322381612cf2565b9350602085013561323381612cf2565b93969395505050506040820135916060013590565b6000806020838503121561325b57600080fd5b82356001600160401b038082111561327257600080fd5b818501915085601f83011261328657600080fd5b81358181111561329557600080fd5b8660208285010111156132a757600080fd5b60209290920196919550909350505050565b600080602083850312156132cc57600080fd5b82356001600160401b038111156132e257600080fd5b6132ee85828601612d85565b90969095509350505050565b60008060006040848603121561330f57600080fd5b833561331a81612cf2565b925060208401356001600160401b0381111561333557600080fd5b61334186828701612d85565b9497909650939450505050565b6000806000806040858703121561336457600080fd5b84356001600160401b038082111561337b57600080fd5b61338788838901612d85565b909650945060208701359150808211156133a057600080fd5b506133ad87828801612d85565b95989497509550505050565b6000602082840312156133cb57600080fd5b8151612d2481612cf2565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561343257600080fd5b81518015158114612d2457600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b8183526000602080850194508260005b858110156134fa5763ffffffff6134e783612f90565b16875295820195908201906001016134d1565b509495945050505050565b8681526001600160a01b038616602082015260a06040820181905260009061353090830186886134c1565b60608301949094525060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561359c57600080fd5b612d2482612f90565b81516001600160a01b0316815260209182015163ffffffff169181019190915260400190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156135f5576135f56135cb565b5060010190565b6000808335601e1984360301811261361357600080fd5b8301803591506001600160401b0382111561362d57600080fd5b6020019150600581901b3603821315612a0a57600080fd5b6020815260006136596020830184866134c1565b949350505050565b82815260006020604081840152835180604085015260005b8181101561369557858101830151858201606001528201613679565b818111156136a7576000606083870101525b50601f01601f191692909201606001949350505050565b6000602082840312156136d057600080fd5b81516001600160e01b031981168114612d2457600080fd5b6000816136f7576136f76135cb565b506000190190565b60008219821115613712576137126135cb565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f4156534469726563746f72792e72656769737465724f70657261746f72546f41a2646970667358221220f717d2abfc5e1b00d23a6bac7bafaeb65202da5074ca03a6617b228952bf6e8564736f6c634300080c0033", + Bin: "0x60c06040523480156200001157600080fd5b506040516200390b3803806200390b833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161378d6200017e6000396000612011015260008181610576015281816109f20152611220015261378d6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80639926ee7d11610125578063d79aceab116100ad578063ec76f4421161007c578063ec76f44214610598578063ef2dfa8d146105cc578063f2fde38b146105df578063f698da25146105f2578063fabc1cbc146105fa57600080fd5b8063d79aceab146104f8578063dae226b61461051f578063dce974b91461054a578063df5cf7231461057157600080fd5b8063aec205c5116100f4578063aec205c514610490578063afe02ed514610498578063b2841d48146104ab578063c1a8e2c5146104be578063c825fe68146104d157600080fd5b80639926ee7d14610444578063a1060c8814610457578063a364f4da1461046a578063a98fb3551461047d57600080fd5b8063595c6a67116101a85780637673e93a116101775780637673e93a146103a457806384d76f7b146103c7578063886f1195146103f55780638da5cb5b14610420578063955e66961461043157600080fd5b8063595c6a67146103695780635ac86ab7146103715780635c975abb14610394578063715018a61461039c57600080fd5b806320606b70116101ef57806320606b701461026f578063374823b5146102a95780633c4385d0146102e75780633fee332d1461031b57806349075da31461032e57600080fd5b806310d67a2f14610221578063136439dd146102365780631794bb3c146102495780631e2199e21461025c575b600080fd5b61023461022f366004612d07565b61060d565b005b610234610244366004612d2b565b6106c9565b610234610257366004612d44565b610808565b61023461026a366004612ee9565b610932565b6102967f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6102d76102b7366004612f64565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102a0565b6102d76102f5366004612fa9565b609c60209081526000938452604080852082529284528284209052825290205460ff1681565b610234610329366004612ff0565b610c52565b61035c61033c36600461307e565b609860209081526000928352604080842090915290825290205460ff1681565b6040516102a091906130cd565b610234610e9c565b6102d761037f3660046130f5565b606654600160ff9092169190911b9081161490565b606654610296565b610234610f63565b6102d76103b2366004612d07565b609a6020526000908152604090205460ff1681565b6102d76103d5366004613118565b609b60209081526000928352604080842090915290825290205460ff1681565b606554610408906001600160a01b031681565b6040516001600160a01b0390911681526020016102a0565b6033546001600160a01b0316610408565b61029661043f36600461314d565b610f77565b6102346104523660046131b3565b610fdc565b610296610465366004613202565b6113aa565b610234610478366004612d07565b611414565b61023461048b366004613248565b611551565b610234611598565b6102346104a63660046132b9565b611660565b6102966104b936600461314d565b61182d565b6102346104cc3660046132fa565b61186d565b6102967f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6102967fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b61029661052d366004613118565b609d60209081526000928352604080842090915290825290205481565b6102967f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6102346105a6366004612d2b565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b6102346105da36600461334e565b6118a2565b6102346105ed366004612d07565b611c4b565b610296611cc1565b610234610608366004612d2b565b611cd0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068491906133b9565b6001600160a01b0316336001600160a01b0316146106bd5760405162461bcd60e51b81526004016106b4906133d6565b60405180910390fd5b6106c681611e2c565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107359190613420565b6107515760405162461bcd60e51b81526004016106b490613442565b606654818116146107ca5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156108285750600054600160ff909116105b806108425750303b158015610842575060005460ff166001145b6108a55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b4565b6000805460ff1916600117905580156108c8576000805461ff0019166101001790555b6108d28383611f23565b6108da61200d565b6097556108e6846120d6565b801561092c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6066546001906002908116141561095b5760405162461bcd60e51b81526004016106b49061348a565b42826040015110156109d35760405162461bcd60e51b8152602060048201526047602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a4016106b4565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d9190613420565b610adc5760405162461bcd60e51b8152602060048201526056602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a4016106b4565b336000908152609a602052604090205460ff16610b635760405162461bcd60e51b815260206004820152604b602482015260008051602061371883398151915260448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b6001600160a01b038516600090815260996020908152604080832085830151845290915290205460ff1615610bee5760405162461bcd60e51b815260206004820152603f602482015260008051602061371883398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e740060648201526084016106b4565b610c0e85610c0733878787602001518860400151610f77565b8451612128565b6001600160a01b03851660009081526099602090815260408083208583015184529091529020805460ff19166001179055610c4b853386866122e2565b5050505050565b60665460019060029081161415610c7b5760405162461bcd60e51b81526004016106b49061348a565b815151610d1357336001600160a01b03871614610d0e5760405162461bcd60e51b815260206004820152604560248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2063616c6c6572206d757374206265206f70656064820152643930ba37b960d91b608482015260a4016106b4565b610e88565b4282604001511015610d9e5760405162461bcd60e51b815260206004820152604860248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a206f70657261746f72207369676e617475726560648201526708195e1c1a5c995960c21b608482015260a4016106b4565b6001600160a01b038616600090815260996020908152604080832085830151845290915290205460ff1615610e3d576040805162461bcd60e51b81526020600482015260248101919091527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2073616c7420616c7265616479207370656e7460648201526084016106b4565b610e5686610c078787878760200151886040015161182d565b6001600160a01b03861660009081526099602090815260408083208583015184529091529020805460ff191660011790555b610e948587868661264c565b505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f089190613420565b610f245760405162461bcd60e51b81526004016106b490613442565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f6b6128dc565b610f7560006120d6565b565b6000610fd27f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610fb796959493929190613505565b60405160208183030381529060405280519060200120612936565b9695505050505050565b606654600090600190811614156110055760405162461bcd60e51b81526004016106b49061348a565b428260400151101561106d5760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a206f70657261746f72207369676e61747572652065787069726564000060648201526084016106b4565b336000908152609a602052604090205460ff16156110e15760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a2041565320697320616e206f70657261746f722073657420415653000060648201526084016106b4565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561111b5761111b6130b7565b141561117d5760405162461bcd60e51b815260206004820152603f602482015260008051602061373883398151915260448201527f56533a206f70657261746f7220616c726561647920726567697374657265640060648201526084016106b4565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156112015760405162461bcd60e51b815260206004820152603660248201526000805160206137388339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b60648201526084016106b4565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128b9190613420565b6113015760405162461bcd60e51b815260206004820152604d602482015260008051602061373883398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a4016106b4565b61131983610c078533866020015187604001516113aa565b6001600160a01b038316600081815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161139d91906130cd565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a0810182905260009061140b9060c001610fb7565b95945050505050565b6066546000906001908116141561143d5760405162461bcd60e51b81526004016106b49061348a565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115611477576114776130b7565b146114ea5760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f7420726567697374657265640060648201526084016106b4565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161154591906130cd565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713838360405161158c929190613545565b60405180910390a25050565b336000908152609a602052604090205460ff161561161e5760405162461bcd60e51b815260206004820152603e60248201527f4156534469726563746f72792e6265636f6d654f70657261746f72536574415660448201527f533a20616c726561647920616e206f70657261746f722073657420415653000060648201526084016106b4565b336000818152609a6020526040808220805460ff19166001179055517f702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf9190a2565b60005b8181101561182857336000908152609b602052604081209084848481811061168d5761168d613574565b90506020020160208101906116a2919061358a565b63ffffffff16815260208101919091526040016000205460ff161561172f5760405162461bcd60e51b815260206004820152603b60248201527f4156534469726563746f72792e6372656174654f70657261746f725365743a2060448201527f6f70657261746f722073657420616c726561647920657869737473000000000060648201526084016106b4565b336000908152609b6020526040812060019185858581811061175357611753613574565b9050602002016020810190611768919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280336001600160a01b031681526020018585858181106117e6576117e6613574565b90506020020160208101906117fb919061358a565b63ffffffff16905260405161181091906135a5565b60405180910390a1611821816135e1565b9050611663565b505050565b6000610fd27f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958787878787604051602001610fb796959493929190613505565b606654600190600290811614156118965760405162461bcd60e51b81526004016106b49061348a565b61092c3385858561264c565b606654600190600290811614156118cb5760405162461bcd60e51b81526004016106b49061348a565b336000908152609a602052604090205460ff166119645760405162461bcd60e51b815260206004820152604b60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b60005b84811015610e945760013360009081526098602052604081209088888581811061199357611993613574565b90506020020160208101906119a89190612d07565b6001600160a01b0316815260208101919091526040016000205460ff1660018111156119d6576119d66130b7565b14611a825760405162461bcd60e51b815260206004820152606a60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a206f70657261746f7220616c7265616479206d6960648201527f677261746564206f72206e6f742061206c656761637920726567697374657265608482015269321037b832b930ba37b960b11b60a482015260c4016106b4565b611ad6868683818110611a9757611a97613574565b9050602002016020810190611aac9190612d07565b33868685818110611abf57611abf613574565b9050602002810190611ad191906135fc565b6122e2565b33600090815260986020526040812081888885818110611af857611af8613574565b9050602002016020810190611b0d9190612d07565b6001600160a01b031681526020810191909152604001600020805460ff191660018381811115611b3f57611b3f6130b7565b021790555033868683818110611b5757611b57613574565b9050602002016020810190611b6c9190612d07565b6001600160a01b03167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416000604051611ba591906130cd565b60405180910390a333868683818110611bc057611bc0613574565b9050602002016020810190611bd59190612d07565b6001600160a01b03167f54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01868685818110611c1157611c11613574565b9050602002810190611c2391906135fc565b604051611c31929190613645565b60405180910390a380611c43816135e1565b915050611967565b611c536128dc565b6001600160a01b038116611cb85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b4565b6106c6816120d6565b6000611ccb61200d565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4791906133b9565b6001600160a01b0316336001600160a01b031614611d775760405162461bcd60e51b81526004016106b4906133d6565b606654198119606654191614611df55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107fd565b6001600160a01b038116611eba5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016106b4565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316158015611f4457506001600160a01b03821615155b611fc65760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261200982611e2c565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000046141561203e575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561224257604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906121689086908690600401613661565b602060405180830381865afa158015612185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a991906136be565b6001600160e01b031916146118285760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a4016106b4565b826001600160a01b0316612256838361297d565b6001600160a01b0316146118285760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a4016106b4565b60005b81811015610c4b576001600160a01b0384166000908152609b602052604081209084848481811061231857612318613574565b905060200201602081019061232d919061358a565b63ffffffff16815260208101919091526040016000205460ff166123c45760405162461bcd60e51b815260206004820152604260248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a20696e76616c6964206f70657261746f722073606482015261195d60f21b608482015260a4016106b4565b6001600160a01b038085166000908152609c602090815260408083209389168352929052908120908484848181106123fe576123fe613574565b9050602002016020810190612413919061358a565b63ffffffff16815260208101919091526040016000205460ff16156124c65760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a206f70657261746f7220616c7265616479207260648201527f65676973746572656420746f206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0384166000908152609d60205260408120908484848181106124f1576124f1613574565b9050602002016020810190612506919061358a565b63ffffffff1663ffffffff1681526020019081526020016000206000815461252d906135e1565b909155506001600160a01b038085166000908152609c60209081526040808320938916835292905290812060019185858581811061256d5761256d613574565b9050602002016020810190612582919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550846001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e6040518060400160405280876001600160a01b0316815260200186868681811061260a5761260a613574565b905060200201602081019061261f919061358a565b63ffffffff16905260405161263491906135a5565b60405180910390a2612645816135e1565b90506122e5565b60005b81811015610c4b576001600160a01b038086166000908152609c6020908152604080832093881683529290529081209084848481811061269157612691613574565b90506020020160208101906126a6919061358a565b63ffffffff16815260208101919091526040016000205460ff166127585760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f646572656769737465724f70657261746f7260448201527f46726f6d4f70657261746f725365743a206f70657261746f72206e6f7420726560648201527f676973746572656420666f72206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0385166000908152609d602052604081209084848481811061278357612783613574565b9050602002016020810190612798919061358a565b63ffffffff1663ffffffff168152602001908152602001600020600081546127bf906136e8565b909155506001600160a01b038086166000908152609c602090815260408083209388168352929052908120818585858181106127fd576127fd613574565b9050602002016020810190612812919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe6040518060400160405280886001600160a01b0316815260200186868681811061289a5761289a613574565b90506020020160208101906128af919061358a565b63ffffffff1690526040516128c491906135a5565b60405180910390a26128d5816135e1565b905061264f565b6033546001600160a01b03163314610f755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b4565b600061294061200d565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b600080600061298c85856129a1565b9150915061299981612a11565b509392505050565b6000808251604114156129d85760208301516040840151606085015160001a6129cc87828585612bcc565b94509450505050612a0a565b825160401415612a0257602083015160408401516129f7868383612cb9565b935093505050612a0a565b506000905060025b9250929050565b6000816004811115612a2557612a256130b7565b1415612a2e5750565b6001816004811115612a4257612a426130b7565b1415612a905760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106b4565b6002816004811115612aa457612aa46130b7565b1415612af25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106b4565b6003816004811115612b0657612b066130b7565b1415612b5f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106b4565b6004816004811115612b7357612b736130b7565b14156106c65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106b4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c035750600090506003612cb0565b8460ff16601b14158015612c1b57508460ff16601c14155b15612c2c5750600090506004612cb0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c80573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ca957600060019250925050612cb0565b9150600090505b94509492505050565b6000806001600160ff1b03831681612cd660ff86901c601b6136ff565b9050612ce487828885612bcc565b935093505050935093915050565b6001600160a01b03811681146106c657600080fd5b600060208284031215612d1957600080fd5b8135612d2481612cf2565b9392505050565b600060208284031215612d3d57600080fd5b5035919050565b600080600060608486031215612d5957600080fd5b8335612d6481612cf2565b92506020840135612d7481612cf2565b929592945050506040919091013590565b60008083601f840112612d9757600080fd5b5081356001600160401b03811115612dae57600080fd5b6020830191508360208260051b8501011115612a0a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612e0157612e01612dc9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e2f57612e2f612dc9565b604052919050565b600060608284031215612e4957600080fd5b612e51612ddf565b905081356001600160401b0380821115612e6a57600080fd5b818401915084601f830112612e7e57600080fd5b8135602082821115612e9257612e92612dc9565b612ea4601f8301601f19168201612e07565b92508183528681838601011115612eba57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b60008060008060608587031215612eff57600080fd5b8435612f0a81612cf2565b935060208501356001600160401b0380821115612f2657600080fd5b612f3288838901612d85565b90955093506040870135915080821115612f4b57600080fd5b50612f5887828801612e37565b91505092959194509250565b60008060408385031215612f7757600080fd5b8235612f8281612cf2565b946020939093013593505050565b803563ffffffff81168114612fa457600080fd5b919050565b600080600060608486031215612fbe57600080fd5b8335612fc981612cf2565b92506020840135612fd981612cf2565b9150612fe760408501612f90565b90509250925092565b60008060008060006080868803121561300857600080fd5b853561301381612cf2565b9450602086013561302381612cf2565b935060408601356001600160401b038082111561303f57600080fd5b61304b89838a01612d85565b9095509350606088013591508082111561306457600080fd5b5061307188828901612e37565b9150509295509295909350565b6000806040838503121561309157600080fd5b823561309c81612cf2565b915060208301356130ac81612cf2565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106130ef57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561310757600080fd5b813560ff81168114612d2457600080fd5b6000806040838503121561312b57600080fd5b823561313681612cf2565b915061314460208401612f90565b90509250929050565b60008060008060006080868803121561316557600080fd5b853561317081612cf2565b945060208601356001600160401b0381111561318b57600080fd5b61319788828901612d85565b9699909850959660408101359660609091013595509350505050565b600080604083850312156131c657600080fd5b82356131d181612cf2565b915060208301356001600160401b038111156131ec57600080fd5b6131f885828601612e37565b9150509250929050565b6000806000806080858703121561321857600080fd5b843561322381612cf2565b9350602085013561323381612cf2565b93969395505050506040820135916060013590565b6000806020838503121561325b57600080fd5b82356001600160401b038082111561327257600080fd5b818501915085601f83011261328657600080fd5b81358181111561329557600080fd5b8660208285010111156132a757600080fd5b60209290920196919550909350505050565b600080602083850312156132cc57600080fd5b82356001600160401b038111156132e257600080fd5b6132ee85828601612d85565b90969095509350505050565b60008060006040848603121561330f57600080fd5b833561331a81612cf2565b925060208401356001600160401b0381111561333557600080fd5b61334186828701612d85565b9497909650939450505050565b6000806000806040858703121561336457600080fd5b84356001600160401b038082111561337b57600080fd5b61338788838901612d85565b909650945060208701359150808211156133a057600080fd5b506133ad87828801612d85565b95989497509550505050565b6000602082840312156133cb57600080fd5b8151612d2481612cf2565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561343257600080fd5b81518015158114612d2457600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b8183526000602080850194508260005b858110156134fa5763ffffffff6134e783612f90565b16875295820195908201906001016134d1565b509495945050505050565b8681526001600160a01b038616602082015260a06040820181905260009061353090830186886134c1565b60608301949094525060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561359c57600080fd5b612d2482612f90565b81516001600160a01b0316815260209182015163ffffffff169181019190915260400190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156135f5576135f56135cb565b5060010190565b6000808335601e1984360301811261361357600080fd5b8301803591506001600160401b0382111561362d57600080fd5b6020019150600581901b3603821315612a0a57600080fd5b6020815260006136596020830184866134c1565b949350505050565b82815260006020604081840152835180604085015260005b8181101561369557858101830151858201606001528201613679565b818111156136a7576000606083870101525b50601f01601f191692909201606001949350505050565b6000602082840312156136d057600080fd5b81516001600160e01b031981168114612d2457600080fd5b6000816136f7576136f76135cb565b506000190190565b60008219821115613712576137126135cb565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f4156534469726563746f72792e72656769737465724f70657261746f72546f41a264697066735822122016076cbb1a92d6de96b28641aa9f940f5bd061727d8fe80d01f3eb5c3312b42864736f6c634300080c0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelayedWithdrawalRouter/binding.go b/pkg/bindings/DelayedWithdrawalRouter/binding.go index 4943de658..31fb64ca0 100644 --- a/pkg/bindings/DelayedWithdrawalRouter/binding.go +++ b/pkg/bindings/DelayedWithdrawalRouter/binding.go @@ -44,7 +44,7 @@ type IDelayedWithdrawalRouterUserDelayedWithdrawals struct { // DelayedWithdrawalRouterMetaData contains all meta data concerning the DelayedWithdrawalRouter contract. var DelayedWithdrawalRouterMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canClaimDelayedWithdrawal\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"claimDelayedWithdrawals\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"maxNumberOfDelayedWithdrawalsToClaim\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createDelayedWithdrawal\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getClaimableUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getUserDelayedWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userDelayedWithdrawalByIndex\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawals\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelayedWithdrawalRouter.UserDelayedWithdrawals\",\"components\":[{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelayedWithdrawalRouter.DelayedWithdrawal[]\",\"components\":[{\"name\":\"amount\",\"type\":\"uint224\",\"internalType\":\"uint224\"},{\"name\":\"blockCreated\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"userWithdrawalsLength\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DelayedWithdrawalCreated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"index\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelayedWithdrawalsClaimed\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"amountClaimed\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"delayedWithdrawalsCompleted\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001f0e38038062001f0e8339810160408190526200003491620001a8565b6001600160a01b038116620000cb5760405162461bcd60e51b815260206004820152604c60248201527f44656c617965645769746864726177616c526f757465722e636f6e737472756360448201527f746f723a205f656967656e506f644d616e616765722063616e6e6f742062652060648201526b7a65726f206164647265737360a01b608482015260a4015b60405180910390fd5b6001600160a01b038116608052620000e2620000e9565b50620001da565b600054610100900460ff1615620001535760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000c2565b60005460ff9081161015620001a6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611d11620001fd600039600081816101fa0152610c000152611d116000f3fe60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000000000000000000000000000000000000000000169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea264697066735822122005b0ecc66b0468e43c0d5b0ff9c7b1e449b7556e61ae26d108ff696ed83f730364736f6c634300080c0033", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001f0e38038062001f0e8339810160408190526200003491620001a8565b6001600160a01b038116620000cb5760405162461bcd60e51b815260206004820152604c60248201527f44656c617965645769746864726177616c526f757465722e636f6e737472756360448201527f746f723a205f656967656e506f644d616e616765722063616e6e6f742062652060648201526b7a65726f206164647265737360a01b608482015260a4015b60405180910390fd5b6001600160a01b038116608052620000e2620000e9565b50620001da565b600054610100900460ff1615620001535760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000c2565b60005460ff9081161015620001a6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600060208284031215620001bb57600080fd5b81516001600160a01b0381168114620001d357600080fd5b9392505050565b608051611d11620001fd600039600081816101fa0152610c000152611d116000f3fe60806040526004361061014b5760003560e01c806385594e58116100b6578063e4f4f8871161006f578063e4f4f887146103cc578063e5db06c014610405578063eb990c5914610425578063ecb7cb1b14610445578063f2fde38b14610472578063fabc1cbc1461049257600080fd5b806385594e5814610317578063886f1195146103445780638da5cb5b14610364578063c0db354c14610382578063ca661c0414610395578063d44e1b76146103ac57600080fd5b806350f73e7c1161010857806350f73e7c14610254578063595c6a67146102785780635ac86ab71461028d5780635c975abb146102cd578063715018a6146102e257806375608896146102f757600080fd5b806310d67a2f14610150578063136439dd146101725780631f39d87f146101925780633e1de008146101c85780634665bcda146101e85780634d50f9a414610234575b600080fd5b34801561015c57600080fd5b5061017061016b36600461196d565b6104b2565b005b34801561017e57600080fd5b5061017061018d366004611991565b61056e565b34801561019e57600080fd5b506101b26101ad36600461196d565b6106ad565b6040516101bf91906119c8565b60405180910390f35b3480156101d457600080fd5b506101b26101e336600461196d565b6108a8565b3480156101f457600080fd5b5061021c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101bf565b34801561024057600080fd5b5061017061024f366004611991565b6109ee565b34801561026057600080fd5b5061026a60c95481565b6040519081526020016101bf565b34801561028457600080fd5b506101706109ff565b34801561029957600080fd5b506102bd6102a8366004611a15565b609854600160ff9092169190911b9081161490565b60405190151581526020016101bf565b3480156102d957600080fd5b5060985461026a565b3480156102ee57600080fd5b50610170610ac6565b34801561030357600080fd5b506102bd610312366004611a38565b610ada565b34801561032357600080fd5b50610337610332366004611a38565b610b5d565b6040516101bf9190611a64565b34801561035057600080fd5b5060975461021c906001600160a01b031681565b34801561037057600080fd5b506033546001600160a01b031661021c565b610170610390366004611a72565b610bdd565b3480156103a157600080fd5b5061026a62034bc081565b3480156103b857600080fd5b506101706103c7366004611991565b610e9d565b3480156103d857600080fd5b5061026a6103e736600461196d565b6001600160a01b0316600090815260ca602052604090206001015490565b34801561041157600080fd5b50610170610420366004611a38565b610f31565b34801561043157600080fd5b50610170610440366004611aab565b610fc6565b34801561045157600080fd5b5061046561046036600461196d565b6110ee565b6040516101bf9190611af1565b34801561047e57600080fd5b5061017061048d36600461196d565b6111a8565b34801561049e57600080fd5b506101706104ad366004611991565b61121e565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190611b47565b6001600160a01b0316336001600160a01b0316146105625760405162461bcd60e51b815260040161055990611b64565b60405180910390fd5b61056b8161137a565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156105b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105da9190611bae565b6105f65760405162461bcd60e51b815260040161055990611bd0565b6098548181161461066f5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926106da8383611c2e565b90508060005b82811015610786576001600160a01b038716600090815260ca6020526040812060010161070d8388611c45565b8154811061071d5761071d611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061076391611c45565b4310156107735781925050610786565b508061077e81611c73565b9150506106e0565b508060008167ffffffffffffffff8111156107a3576107a3611c8e565b6040519080825280602002602001820160405280156107e857816020015b60408051808201909152600080825260208201528152602001906001900390816107c15790505b509050811561089d5760005b8281101561089b576001600160a01b038916600090815260ca602052604090206001016108218289611c45565b8154811061083157610831611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810191909152825183908390811061087d5761087d611c5d565b6020026020010181905250808061089390611c73565b9150506107f4565b505b979650505050505050565b6001600160a01b038116600090815260ca6020526040812080546001909101546060926108d58383611c2e565b905060008167ffffffffffffffff8111156108f2576108f2611c8e565b60405190808252806020026020018201604052801561093757816020015b60408051808201909152600080825260208201528152602001906001900390816109105790505b50905060005b828110156109e4576001600160a01b038716600090815260ca6020526040902060010161096a8287611c45565b8154811061097a5761097a611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff169181019190915282518390839081106109c6576109c6611c5d565b602002602001018190525080806109dc90611c73565b91505061093d565b5095945050505050565b6109f6611471565b61056b816114cb565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6b9190611bae565b610a875760405162461bcd60e51b815260040161055990611bd0565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610ace611471565b610ad86000611593565b565b6001600160a01b038216600090815260ca60205260408120548210801590610b54575060c9546001600160a01b038416600090815260ca60205260409020600101805484908110610b2d57610b2d611c5d565b600091825260209091200154610b509190600160e01b900463ffffffff16611c45565b4310155b90505b92915050565b60408051808201909152600080825260208201526001600160a01b038316600090815260ca60205260409020600101805483908110610b9e57610b9e611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff16918101919091529392505050565b60405163a38406a360e01b81526001600160a01b038084166004830152839133917f0000000000000000000000000000000000000000000000000000000000000000169063a38406a390602401602060405180830381865afa158015610c47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c6b9190611b47565b6001600160a01b031614610ce75760405162461bcd60e51b815260206004820152603d60248201527f44656c617965645769746864726177616c526f757465722e6f6e6c794569676560448201527f6e506f643a206e6f7420706f644f776e6572277320456967656e506f640000006064820152608401610559565b60985460009060019081161415610d105760405162461bcd60e51b815260040161055990611ca4565b6001600160a01b038316610da65760405162461bcd60e51b815260206004820152605160248201527f44656c617965645769746864726177616c526f757465722e637265617465446560448201527f6c617965645769746864726177616c3a20726563697069656e742063616e6e6f60648201527074206265207a65726f206164647265737360781b608482015260a401610559565b346001600160e01b03811615610e96576040805180820182526001600160e01b03808416825263ffffffff43811660208085019182526001600160a01b038a16600081815260ca8352968720600190810180548083018255818a5293892088519551909616600160e01b029490961693909317939091019290925593525490917fb8f1b14c7caf74150801dcc9bc18d575cbeaf5b421943497e409df92c92e0f5991889188918691610e5791611c2e565b604080516001600160a01b0395861681529490931660208501526001600160e01b039091169183019190915260608201526080015b60405180910390a1505b5050505050565b60026065541415610ef05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610f1e5760405162461bcd60e51b815260040161055990611ca4565b610f2833836115e5565b50506001606555565b60026065541415610f845760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610559565b600260655560985460009060019081161415610fb25760405162461bcd60e51b815260040161055990611ca4565b610fbc83836115e5565b5050600160655550565b600054610100900460ff1615808015610fe65750600054600160ff909116105b806110005750303b158015611000575060005460ff166001145b6110635760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610559565b6000805460ff191660011790558015611086576000805461ff0019166101001790555b61108f85611593565b6110998484611750565b6110a2826114cb565b8015610e96576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6040805180820190915260008152606060208201526001600160a01b038216600090815260ca6020908152604080832081518083018352815481526001820180548451818702810187019095528085529195929486810194939192919084015b8282101561119a57600084815260209081902060408051808201909152908401546001600160e01b0381168252600160e01b900463ffffffff168183015282526001909201910161114e565b505050915250909392505050565b6111b0611471565b6001600160a01b0381166112155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610559565b61056b81611593565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112959190611b47565b6001600160a01b0316336001600160a01b0316146112c55760405162461bcd60e51b815260040161055990611b64565b6098541981196098541916146113435760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610559565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016106a2565b6001600160a01b0381166114085760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610559565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610559565b62034bc08111156115525760405162461bcd60e51b815260206004820152604560248201527f44656c617965645769746864726177616c526f757465722e5f7365745769746860448201527f64726177616c44656c6179426c6f636b733a206e657756616c756520746f6f206064820152646c6172676560d81b608482015260a401610559565b60c95460408051918252602082018390527f4ffb00400574147429ee377a5633386321e66d45d8b14676014b5fa393e61e9e910160405180910390a160c955565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260ca602052604081208054600190910154825b848110801561161e57508161161c8285611c45565b105b156116cb576001600160a01b038616600090815260ca602052604081206001016116488386611c45565b8154811061165857611658611c5d565b6000918252602091829020604080518082019091529101546001600160e01b0381168252600160e01b900463ffffffff1691810182905260c95490925061169e91611c45565b4310156116ab57506116cb565b80516116c0906001600160e01b031686611c45565b945050600101611607565b6116d58184611c45565b6001600160a01b038716600090815260ca602052604090205583156116fe576116fe868561183a565b7f6b7151500bd0b5cc211bcc47b3029831b769004df4549e8e1c9a69da05bb0943868561172b8487611c45565b604080516001600160a01b039094168452602084019290925290820152606001610e8c565b6097546001600160a01b031615801561177157506001600160a01b03821615155b6117f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610559565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26118368261137a565b5050565b8047101561188a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610559565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146118d7576040519150601f19603f3d011682016040523d82523d6000602084013e6118dc565b606091505b50509050806119535760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610559565b505050565b6001600160a01b038116811461056b57600080fd5b60006020828403121561197f57600080fd5b813561198a81611958565b9392505050565b6000602082840312156119a357600080fd5b5035919050565b80516001600160e01b0316825260209081015163ffffffff16910152565b602080825282518282018190526000919060409081850190868401855b82811015611a08576119f88483516119aa565b92840192908501906001016119e5565b5091979650505050505050565b600060208284031215611a2757600080fd5b813560ff8116811461198a57600080fd5b60008060408385031215611a4b57600080fd5b8235611a5681611958565b946020939093013593505050565b60408101610b5782846119aa565b60008060408385031215611a8557600080fd5b8235611a9081611958565b91506020830135611aa081611958565b809150509250929050565b60008060008060808587031215611ac157600080fd5b8435611acc81611958565b93506020850135611adc81611958565b93969395505050506040820135916060013590565b602080825282518282015282810151604080840181905281516060850181905260009392830191849160808701905b8084101561089b57611b338286516119aa565b938501936001939093019290820190611b20565b600060208284031215611b5957600080fd5b815161198a81611958565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611bc057600080fd5b8151801515811461198a57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082821015611c4057611c40611c18565b500390565b60008219821115611c5857611c58611c18565b500190565b634e487b7160e01b600052603260045260246000fd5b6000600019821415611c8757611c87611c18565b5060010190565b634e487b7160e01b600052604160045260246000fd5b60208082526019908201527f5061757361626c653a20696e646578206973207061757365640000000000000060408201526060019056fea264697066735822122000d7cf28f4403941c299573f87dac2e0ac298f40aace10d232ce8c2e9d0894a564736f6c634300080c0033", } // DelayedWithdrawalRouterABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/DelegationManager/binding.go b/pkg/bindings/DelegationManager/binding.go index d244533e3..eaf983f4f 100644 --- a/pkg/bindings/DelegationManager/binding.go +++ b/pkg/bindings/DelegationManager/binding.go @@ -63,7 +63,7 @@ type ISignatureUtilsSignatureWithExpiry struct { // DelegationManagerMetaData contains all meta data concerning the DelegationManager contract. var DelegationManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DELEGATION_APPROVAL_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_STAKER_OPT_OUT_WINDOW_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_WITHDRAWAL_DELAY_BLOCKS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"STAKER_DELEGATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateCurrentStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateDelegationApprovalDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateStakerDelegationDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_stakerNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateWithdrawalRoot\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawal\",\"inputs\":[{\"name\":\"withdrawal\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"middlewareTimesIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeQueuedWithdrawals\",\"inputs\":[{\"name\":\"withdrawals\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.Withdrawal[]\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]},{\"name\":\"tokens\",\"type\":\"address[][]\",\"internalType\":\"contractIERC20[][]\"},{\"name\":\"middlewareTimesIndexes\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"receiveAsTokens\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeWithdrawalsQueued\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateTo\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateToBySignature\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSignatureAndExpiry\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"approverSalt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegatedTo\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApprover\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationApproverSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDelegatableShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorShares\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalDelay\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseDelegatedShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_minWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"_withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperator\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"minWithdrawalDelayBlocks\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyOperatorDetails\",\"inputs\":[{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorDetails\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingWithdrawals\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"queueWithdrawals\",\"inputs\":[{\"name\":\"queuedWithdrawalParams\",\"type\":\"tuple[]\",\"internalType\":\"structIDelegationManager.QueuedWithdrawalParams[]\",\"components\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerAsOperator\",\"inputs\":[{\"name\":\"registeringOperatorDetails\",\"type\":\"tuple\",\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setMinWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"newMinWithdrawalDelayBlocks\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"withdrawalDelayBlocks\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerOptOutWindowBlocks\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWithdrawalDelayBlocks\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"withdrawalRoots\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateOperatorMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MinWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorDetailsModified\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOperatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMetadataURIUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRegistered\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorDetails\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.OperatorDetails\",\"components\":[{\"name\":\"__deprecated_earningsReceiver\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegationApprover\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"stakerOptOutWindowBlocks\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesDecreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSharesIncreased\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerDelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerForceUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StakerUndelegated\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWithdrawalDelayBlocksSet\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalCompleted\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalQueued\",\"inputs\":[{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"withdrawal\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIDelegationManager.Withdrawal\",\"components\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegatedTo\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}]}],\"anonymous\":false}]", - Bin: "0x6101006040523480156200001257600080fd5b5060405162005c3338038062005c33833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a0a6200022960003960006126870152600081816105b10152818161102e015281816113aa01528181611c0a015281816129e001528181613e93015261437f015260006107620152600081816104f901528181610ffc0152818161137801528181611c9e01528181612aad01528181612c3001528181613fb901526144250152615a0a6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a610355366004614835565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a236600461489b565b6109ce565b6103ba6103b5366004614835565b610a90565b60405161036491906148f6565b6103da6103d5366004614993565b610df9565b005b6103da6103ea3660046149e6565b610f3e565b6103da6103fd366004614a0a565b610ff1565b6103da610410366004614a4b565b6110a8565b6103da610423366004614a64565b6111e7565b61035a6104363660046149e6565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a0a565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614acf565b611229565b6103da6104bc366004614a0a565b61136d565b61035a6104cf3660046149e6565b609b6020526000908152604090205481565b6103da6104ef366004614b76565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149e6565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149e6565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e73565b611641565b610575610606366004614eaf565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ee0565b611671565b6103da610644366004614a4b565b61170c565b61051b6106573660046149e6565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149e6565b61171d565b6103da61173e565b61035a61069b366004614f6f565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615050565b611752565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150e0565b61197e565b604051610364919061516a565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da61073836600461517d565b611a58565b61035a61074b3660046149e6565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a4b565b609e6020526000908152604090205460ff1681565b6105756107b53660046151b2565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149e6565b60a16020526000908152604090205481565b61086e61080c3660046149e6565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151de565b611b2a565b61035a62034bc081565b6108d46108cf3660046149e6565b611be3565b60405161036492919061525f565b6103ba6108f03660046149e6565b611f9b565b6103da610903366004615284565b61245f565b6103da6109163660046152dc565b61257c565b6103da6109293660046149e6565b61260d565b61035a612683565b6103da610944366004614a4b565b6126c1565b609d54600090815b838110156109c657600060a16000878785818110610971576109716152f8565b905060200201602081019061098691906149e6565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf81615324565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc9061533f565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c18565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b436152f8565b9050602002810190610b559190615376565b610b63906020810190615396565b9050878783818110610b7757610b776152f8565b9050602002810190610b899190615376565b610b939080615396565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b6152f8565b9050602002810190610c2d9190615376565b610c3e9060608101906040016149e6565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd16152f8565b9050602002810190610ce39190615376565b610cf49060608101906040016149e6565b8a8a86818110610d0657610d066152f8565b9050602002810190610d189190615376565b610d229080615396565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d686152f8565b9050602002810190610d7a9190615376565b610d88906020810190615396565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061281d92505050565b838281518110610dd157610dd16152f8565b602090810291909101015280610de681615324565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612ddd565b604080518082019091526060815260006020820152610eb43380836000612fd0565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153df565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f30929190615431565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615460565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc9061547d565b610fee81613266565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154c7565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561335d565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190615524565b6111305760405162461bcd60e51b8152600401610abc90615541565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133d8565b6110a184848484613432565b6001600160a01b0383166000908152609b602052604081205461122085828686611b2a565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613658565b6112fb613742565b609755611307896137d9565b6113108661382b565b61131c85858585613432565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154c7565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613925565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be6152f8565b90506020028101906114d09190615589565b8989848181106114e2576114e26152f8565b90506020028101906114f49190615396565b898986818110611506576115066152f8565b9050602002013588888781811061151f5761151f6152f8565b9050602002016020810190611534919061559f565b6139a0565b61154281615324565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e69190615524565b6116025760405162461bcd60e51b8152600401610abc90615541565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615630565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc9061533f565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139a0565b5050600160c95550505050565b6117146133d8565b610fee8161382b565b6001600160a01b039081166000818152609a60205260409020549091161490565b6117466133d8565b61175060006137d9565b565b42836020015110156117d65760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117df8561155a565b156118685760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b6118718461171d565b6118fd5760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119398783888860200151611b2a565b6001600160a01b0388166000908152609b602052604090206001840190558551909150611969908890839061418a565b61197587878686612fd0565b50505050505050565b6060600082516001600160401b0381111561199b5761199b614c18565b6040519080825280602002602001820160405280156119c4578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a0257611a026152f8565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a3d57611a3d6152f8565b6020908102919091010152611a5181615324565b90506119ca565b611a613361171d565b611ae35760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b1e929190615431565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611ba0612683565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190615643565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611ce7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d0f91908101906156b7565b9150915060008313611d2657909590945092505050565b606080835160001415611de0576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611d9b57611d9b6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611dcf57611dcf6152f8565b602002602001018181525050611f8e565b8351611ded906001615771565b6001600160401b03811115611e0457611e04614c18565b604051908082528060200260200182016040528015611e2d578160200160208202803683370190505b50915081516001600160401b03811115611e4957611e49614c18565b604051908082528060200260200182016040528015611e72578160200160208202803683370190505b50905060005b8451811015611f0c57848181518110611e9357611e936152f8565b6020026020010151838281518110611ead57611ead6152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611edf57611edf6152f8565b6020026020010151828281518110611ef957611ef96152f8565b6020908102919091010152600101611e78565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f319190615789565b81518110611f4157611f416152f8565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f719190615789565b81518110611f8157611f816152f8565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fc75760405162461bcd60e51b8152600401610abc9061533f565b611fd08361155a565b6120505760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120598361171d565b156120cc5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121485760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a60205260409020549091169033148061217b5750336001600160a01b038216145b806121a257506001600160a01b038181166000908152609960205260409020600101541633145b6122145760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061222086611be3565b9092509050336001600160a01b0387161461227657826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b031916905581516122f8576040805160008152602081019091529450612456565b81516001600160401b0381111561231157612311614c18565b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50945060005b8251811015612454576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123a0576123a06152f8565b6020026020010151826000815181106123bb576123bb6152f8565b60200260200101906001600160a01b031690816001600160a01b0316815250508383815181106123ed576123ed6152f8565b602002602001015181600081518110612408576124086152f8565b60200260200101818152505061242189878b858561281d565b888481518110612433576124336152f8565b6020026020010181815250505050808061244c90615324565b915050612340565b505b50505050919050565b6124683361155a565b156124e65760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6124ef8361171d565b6125705760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fd0565b6125853361171d565b6126035760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612ddd565b6126156133d8565b6001600160a01b03811661267a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137d9565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126b4575060975490565b6126bc613742565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612714573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127389190615460565b6001600160a01b0316336001600160a01b0316146127685760405162461bcd60e51b8152600401610abc9061547d565b6066541981196066541916146127e65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128b45760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b825161293e5760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612ceb576001600160a01b03861615612997576129978688868481518110612970576129706152f8565b602002602001015186858151811061298a5761298a6152f8565b602002602001015161335d565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129c7576129c76152f8565b60200260200101516001600160a01b03161415612a90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a2057612a206152f8565b60200260200101516040518363ffffffff1660e01b8152600401612a599291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a7357600080fd5b505af1158015612a87573d6000803e3d6000fd5b50505050612ce3565b846001600160a01b0316876001600160a01b03161480612b6257507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612aec57612aec6152f8565b60200260200101516040518263ffffffff1660e01b8152600401612b1f91906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b609190615524565b155b612c2e5760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c7057612c706152f8565b6020026020010151868581518110612c8a57612c8a6152f8565b60200260200101516040518463ffffffff1660e01b8152600401612cb0939291906157a0565b600060405180830381600087803b158015612cca57600080fd5b505af1158015612cde573d6000803e3d6000fd5b505050505b600101612941565b506001600160a01b0386166000908152609f60205260408120805491829190612d1383615324565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d7b82611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612dc990839085906157c4565b60405180910390a198975050505050505050565b6213c680612df160608301604084016157dd565b63ffffffff161115612ea65760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612ee290606084019084016157dd565b63ffffffff161015612f785760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612f9c828261581a565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b1e9084906153df565b60665460009060019081161415612ff95760405162461bcd60e51b8152600401610abc9061533f565b6001600160a01b0380851660009081526099602052604090206001015416801580159061302f5750336001600160a01b03821614155b80156130445750336001600160a01b03861614155b156131b15742846020015110156130c35760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff161561315d5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff1916600117905585015161319e9088908890859088906109ce565b90506131af8282876000015161418a565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061321088611be3565b9150915060005b82518110156113625761325e888a858481518110613237576132376152f8565b6020026020010151858581518110613251576132516152f8565b6020026020010151613925565b600101613217565b6001600160a01b0381166132f45760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03808516600090815260986020908152604080832093861683529290529081208054839290613394908490615789565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157a0565b6033546001600160a01b031633146117505760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134ba5760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136505760008686838181106134da576134da6152f8565b90506020020160208101906134ef91906149e6565b6001600160a01b038116600090815260a1602052604081205491925086868581811061351d5761351d6152f8565b90506020020135905062034bc08111156135e15760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a15050508061364990615324565b90506134be565b505050505050565b6065546001600160a01b031615801561367957506001600160a01b03821615155b6136fb5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261373e82613266565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138e45760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061395c908490615771565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157a0565b60006139ae6105f38761587d565b6000818152609e602052604090205490915060ff16613a2f5760405162461bcd60e51b815260206004820152604360248201526000805160206159b583398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a4460a0890160808a016157dd565b63ffffffff16613a549190615771565b1115613adc5760405162461bcd60e51b815260206004820152605f60248201526000805160206159b583398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613aec60608701604088016149e6565b6001600160a01b0316336001600160a01b031614613b795760405162461bcd60e51b815260206004820152605060248201526000805160206159b583398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613bfb57613b8c60a0870187615396565b85149050613bfb5760405162461bcd60e51b815260206004820152604260248201526000805160206159b583398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d605760005b613c2760a0880188615396565b9050811015613d5a574360a16000613c4260a08b018b615396565b85818110613c5257613c526152f8565b9050602002016020810190613c6791906149e6565b6001600160a01b03168152602081019190915260400160002054613c9160a08a0160808b016157dd565b63ffffffff16613ca19190615771565b1115613cbf5760405162461bcd60e51b8152600401610abc9061588f565b613d52613ccf60208901896149e6565b33613cdd60a08b018b615396565b85818110613ced57613ced6152f8565b9050602002016020810190613d0291906149e6565b613d0f60c08c018c615396565b86818110613d1f57613d1f6152f8565b905060200201358a8a87818110613d3857613d386152f8565b9050602002016020810190613d4d91906149e6565b614344565b600101613c1a565b5061414f565b336000908152609a60205260408120546001600160a01b0316905b613d8860a0890189615396565b905081101561414c574360a16000613da360a08c018c615396565b85818110613db357613db36152f8565b9050602002016020810190613dc891906149e6565b6001600160a01b03168152602081019190915260400160002054613df260a08b0160808c016157dd565b63ffffffff16613e029190615771565b1115613e205760405162461bcd60e51b8152600401610abc9061588f565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e4260a08a018a615396565b83818110613e5257613e526152f8565b9050602002016020810190613e6791906149e6565b6001600160a01b03161415613fb7576000613e8560208a018a6149e6565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613ec660c08e018e615396565b87818110613ed657613ed66152f8565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4e9190615643565b6001600160a01b038084166000908152609a6020526040902054919250168015613faf57613faf8184613f8460a08f018f615396565b88818110613f9457613f946152f8565b9050602002016020810190613fa991906149e6565b85613925565b505050614144565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea133898985818110613ff957613ff96152f8565b905060200201602081019061400e91906149e6565b61401b60a08d018d615396565b8681811061402b5761402b6152f8565b905060200201602081019061404091906149e6565b61404d60c08e018e615396565b8781811061405d5761405d6152f8565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140bd57600080fd5b505af11580156140d1573d6000803e3d6000fd5b505050506001600160a01b038216156141445761414482336140f660a08c018c615396565b85818110614106576141066152f8565b905060200201602081019061411b91906149e6565b61412860c08d018d615396565b86818110614138576141386152f8565b90506020020135613925565b600101613d7b565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142a457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141ca9086908690600401615917565b602060405180830381865afa1580156141e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061420b9190615974565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142b88383614484565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156143ef5760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143b8908890889087906004016157a0565b600060405180830381600087803b1580156143d257600080fd5b505af11580156143e6573d6000803e3d6000fd5b5050505061447d565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561446957600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b600080600061449385856144a0565b915091506109c681614510565b6000808251604114156144d75760208301516040840151606085015160001a6144cb878285856146cb565b94509450505050614509565b82516040141561450157602083015160408401516144f68683836147b8565b935093505050614509565b506000905060025b9250929050565b60008160048111156145245761452461599e565b141561452d5750565b60018160048111156145415761454161599e565b141561458f5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145a3576145a361599e565b14156145f15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b60038160048111156146055761460561599e565b141561465e5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b60048160048111156146725761467261599e565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470257506000905060036147af565b8460ff16601b1415801561471a57508460ff16601c14155b1561472b57506000905060046147af565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561477f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147a8576000600192509250506147af565b9150600090505b94509492505050565b6000806001600160ff1b038316816147d560ff86901c601b615771565b90506147e3878288856146cb565b935093505050935093915050565b60008083601f84011261480357600080fd5b5081356001600160401b0381111561481a57600080fd5b6020830191508360208260051b850101111561450957600080fd5b6000806020838503121561484857600080fd5b82356001600160401b0381111561485e57600080fd5b61486a858286016147f1565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b803561489681614876565b919050565b600080600080600060a086880312156148b357600080fd5b85356148be81614876565b945060208601356148ce81614876565b935060408601356148de81614876565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b8181101561492e57835183529284019291840191600101614912565b50909695505050505050565b60006060828403121561494c57600080fd5b50919050565b60008083601f84011261496457600080fd5b5081356001600160401b0381111561497b57600080fd5b60208301915083602082850101111561450957600080fd5b6000806000608084860312156149a857600080fd5b6149b2858561493a565b925060608401356001600160401b038111156149cd57600080fd5b6149d986828701614952565b9497909650939450505050565b6000602082840312156149f857600080fd5b8135614a0381614876565b9392505050565b600080600060608486031215614a1f57600080fd5b8335614a2a81614876565b92506020840135614a3a81614876565b929592945050506040919091013590565b600060208284031215614a5d57600080fd5b5035919050565b60008060008060408587031215614a7a57600080fd5b84356001600160401b0380821115614a9157600080fd5b614a9d888389016147f1565b90965094506020870135915080821115614ab657600080fd5b50614ac3878288016147f1565b95989497509550505050565b60008060008060008060008060c0898b031215614aeb57600080fd5b8835614af681614876565b97506020890135614b0681614876565b9650604089013595506060890135945060808901356001600160401b0380821115614b3057600080fd5b614b3c8c838d016147f1565b909650945060a08b0135915080821115614b5557600080fd5b50614b628b828c016147f1565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614b9257600080fd5b88356001600160401b0380821115614ba957600080fd5b614bb58c838d016147f1565b909a50985060208b0135915080821115614bce57600080fd5b614bda8c838d016147f1565b909850965060408b0135915080821115614bf357600080fd5b614bff8c838d016147f1565b909650945060608b0135915080821115614b5557600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c5057614c50614c18565b60405290565b604080519081016001600160401b0381118282101715614c5057614c50614c18565b604051601f8201601f191681016001600160401b0381118282101715614ca057614ca0614c18565b604052919050565b63ffffffff81168114610fee57600080fd5b803561489681614ca8565b60006001600160401b03821115614cde57614cde614c18565b5060051b60200190565b600082601f830112614cf957600080fd5b81356020614d0e614d0983614cc5565b614c78565b82815260059290921b84018101918181019086841115614d2d57600080fd5b8286015b84811015614d51578035614d4481614876565b8352918301918301614d31565b509695505050505050565b600082601f830112614d6d57600080fd5b81356020614d7d614d0983614cc5565b82815260059290921b84018101918181019086841115614d9c57600080fd5b8286015b84811015614d515780358352918301918301614da0565b600060e08284031215614dc957600080fd5b614dd1614c2e565b9050614ddc8261488b565b8152614dea6020830161488b565b6020820152614dfb6040830161488b565b604082015260608201356060820152614e1660808301614cba565b608082015260a08201356001600160401b0380821115614e3557600080fd5b614e4185838601614ce8565b60a084015260c0840135915080821115614e5a57600080fd5b50614e6784828501614d5c565b60c08301525092915050565b600060208284031215614e8557600080fd5b81356001600160401b03811115614e9b57600080fd5b614ea784828501614db7565b949350505050565b600060208284031215614ec157600080fd5b813560ff81168114614a0357600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614ef857600080fd5b85356001600160401b0380821115614f0f57600080fd5b9087019060e0828a031215614f2357600080fd5b90955060208701359080821115614f3957600080fd5b50614f46888289016147f1565b909550935050604086013591506060860135614f6181614ed2565b809150509295509295909350565b60008060408385031215614f8257600080fd5b8235614f8d81614876565b91506020830135614f9d81614876565b809150509250929050565b600060408284031215614fba57600080fd5b614fc2614c56565b905081356001600160401b0380821115614fdb57600080fd5b818401915084601f830112614fef57600080fd5b813560208282111561500357615003614c18565b615015601f8301601f19168201614c78565b9250818352868183860101111561502b57600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561506857600080fd5b853561507381614876565b9450602086013561508381614876565b935060408601356001600160401b038082111561509f57600080fd5b6150ab89838a01614fa8565b945060608801359150808211156150c157600080fd5b506150ce88828901614fa8565b95989497509295608001359392505050565b600080604083850312156150f357600080fd5b82356150fe81614876565b915060208301356001600160401b0381111561511957600080fd5b61512585828601614ce8565b9150509250929050565b600081518084526020808501945080840160005b8381101561515f57815187529582019590820190600101615143565b509495945050505050565b602081526000614a03602083018461512f565b6000806020838503121561519057600080fd5b82356001600160401b038111156151a657600080fd5b61486a85828601614952565b600080604083850312156151c557600080fd5b82356151d081614876565b946020939093013593505050565b600080600080608085870312156151f457600080fd5b84356151ff81614876565b935060208501359250604085013561521681614876565b9396929550929360600135925050565b600081518084526020808501945080840160005b8381101561515f5781516001600160a01b03168752958201959082019060010161523a565b6040815260006152726040830185615226565b8281036020840152611220818561512f565b60008060006060848603121561529957600080fd5b83356152a481614876565b925060208401356001600160401b038111156152bf57600080fd5b6152cb86828701614fa8565b925050604084013590509250925092565b6000606082840312156152ee57600080fd5b614a03838361493a565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156153385761533861530e565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e1983360301811261538c57600080fd5b9190910192915050565b6000808335601e198436030181126153ad57600080fd5b8301803591506001600160401b038211156153c757600080fd5b6020019150600581901b360382131561450957600080fd5b6060810182356153ee81614876565b6001600160a01b03908116835260208401359061540a82614876565b166020830152604083013561541e81614ca8565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561547257600080fd5b8151614a0381614876565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561553657600080fd5b8151614a0381614ed2565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de1983360301811261538c57600080fd5b6000602082840312156155b157600080fd5b8135614a0381614ed2565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261561760e0850182615226565b905060c083015184820360c0860152611220828261512f565b602081526000614a0360208301846155bc565b60006020828403121561565557600080fd5b5051919050565b600082601f83011261566d57600080fd5b8151602061567d614d0983614cc5565b82815260059290921b8401810191818101908684111561569c57600080fd5b8286015b84811015614d5157805183529183019183016156a0565b600080604083850312156156ca57600080fd5b82516001600160401b03808211156156e157600080fd5b818501915085601f8301126156f557600080fd5b81516020615705614d0983614cc5565b82815260059290921b8401810191818101908984111561572457600080fd5b948201945b8386101561574b57855161573c81614876565b82529482019490820190615729565b9188015191965090935050508082111561576457600080fd5b506151258582860161565c565b600082198211156157845761578461530e565b500190565b60008282101561579b5761579b61530e565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ea760408301846155bc565b6000602082840312156157ef57600080fd5b8135614a0381614ca8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561582581614876565b61582f81836157fa565b5060018101602083013561584281614876565b61584c81836157fa565b50604083013561585b81614ca8565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006158893683614db7565b92915050565b6020808252606e908201526000805160206159b583398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561594b5785810183015185820160600152820161592f565b8181111561595d576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561598657600080fd5b81516001600160e01b031981168114614a0357600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a26469706673582212204f8ba68b8a28e3effef34dcfd60594e2fbd9e919cbab8917dc02c14df97507da64736f6c634300080c0033", + Bin: "0x6101006040523480156200001257600080fd5b5060405162005c4638038062005c46833981016040819052620000359162000140565b6001600160a01b0380841660805280821660c052821660a0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e051615a1d6200022960003960006126a00152600081816105b10152818161102e015281816113aa01528181611c23015281816129f901528181613eac0152614398015260006107620152600081816104f901528181610ffc0152818161137801528181611cb701528181612ac601528181612c4901528181613fd2015261443e0152615a1d6000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c8063635bbd10116101b8578063b7f06ebe11610104578063cf80873e116100a2578063f16172b01161007c578063f16172b014610908578063f2fde38b1461091b578063f698da251461092e578063fabc1cbc1461093657600080fd5b8063cf80873e146108c1578063da8be864146108e2578063eea9064b146108f557600080fd5b8063c488375a116100de578063c488375a146107de578063c5e480db146107fe578063c94b5111146108a4578063ca661c04146108b757600080fd5b8063b7f06ebe14610784578063bb45fef2146107a7578063c448feb8146107d557600080fd5b8063886f1195116101715780639104c3191161014b5780639104c3191461070f57806399be81c81461072a578063a17884841461073d578063b13442711461075d57600080fd5b8063886f1195146106cb5780638da5cb5b146106de57806390041347146106ef57600080fd5b8063635bbd101461063657806365da1264146106495780636d70f7ae14610672578063715018a614610685578063778e55f31461068d5780637f548071146106b857600080fd5b806328a573ae116102925780634665bcda11610230578063597b36da1161020a578063597b36da146105e55780635ac86ab7146105f85780635c975abb1461061b57806360d7faed1461062357600080fd5b80634665bcda146105ac5780634fc40b61146105d3578063595c6a67146105dd57600080fd5b806339b70e381161026c57806339b70e38146104f45780633cdeb5e0146105335780633e28391d14610562578063433773821461058557600080fd5b806328a573ae146104ae57806329c77d4f146104c157806333404396146104e157600080fd5b8063132d4967116102ff57806316928365116102d957806316928365146104285780631bbce0911461046157806320606b701461047457806322bf40e41461049b57600080fd5b8063132d4967146103ef578063136439dd146104025780631522bf021461041557600080fd5b80630449ca391461034757806304a4f9791461036d5780630b9f487a146103945780630dd8dd02146103a75780630f589e59146103c757806310d67a2f146103dc575b600080fd5b61035a61035536600461484e565b610949565b6040519081526020015b60405180910390f35b61035a7f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad81565b61035a6103a23660046148b4565b6109ce565b6103ba6103b536600461484e565b610a90565b604051610364919061490f565b6103da6103d53660046149ac565b610df9565b005b6103da6103ea3660046149ff565b610f3e565b6103da6103fd366004614a23565b610ff1565b6103da610410366004614a64565b6110a8565b6103da610423366004614a7d565b6111e7565b61035a6104363660046149ff565b6001600160a01b0316600090815260996020526040902060010154600160a01b900463ffffffff1690565b61035a61046f366004614a23565b6111fb565b61035a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6103da6104a9366004614ae8565b611229565b6103da6104bc366004614a23565b61136d565b61035a6104cf3660046149ff565b609b6020526000908152604090205481565b6103da6104ef366004614b8f565b61141d565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610364565b61051b6105413660046149ff565b6001600160a01b039081166000908152609960205260409020600101541690565b6105756105703660046149ff565b61155a565b6040519015158152602001610364565b61035a7f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b81565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b61035a6213c68081565b6103da61157a565b61035a6105f3366004614e8c565b611641565b610575610606366004614ec8565b606654600160ff9092169190911b9081161490565b60665461035a565b6103da610631366004614ef9565b611671565b6103da610644366004614a64565b61170c565b61051b6106573660046149ff565b609a602052600090815260409020546001600160a01b031681565b6105756106803660046149ff565b61171d565b6103da611757565b61035a61069b366004614f88565b609860209081526000928352604080842090915290825290205481565b6103da6106c6366004615069565b61176b565b60655461051b906001600160a01b031681565b6033546001600160a01b031661051b565b6107026106fd3660046150f9565b611997565b6040516103649190615183565b61051b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6103da610738366004615196565b611a71565b61035a61074b3660046149ff565b609f6020526000908152604090205481565b61051b7f000000000000000000000000000000000000000000000000000000000000000081565b610575610792366004614a64565b609e6020526000908152604090205460ff1681565b6105756107b53660046151cb565b609c60209081526000928352604080842090915290825290205460ff1681565b61035a609d5481565b61035a6107ec3660046149ff565b60a16020526000908152604090205481565b61086e61080c3660046149ff565b6040805160608082018352600080835260208084018290529284018190526001600160a01b03948516815260998352839020835191820184528054851682526001015493841691810191909152600160a01b90920463ffffffff169082015290565b6040805182516001600160a01b039081168252602080850151909116908201529181015163ffffffff1690820152606001610364565b61035a6108b23660046151f7565b611b43565b61035a62034bc081565b6108d46108cf3660046149ff565b611bfc565b604051610364929190615278565b6103ba6108f03660046149ff565b611fb4565b6103da61090336600461529d565b612478565b6103da6109163660046152f5565b612595565b6103da6109293660046149ff565b612626565b61035a61269c565b6103da610944366004614a64565b6126da565b609d54600090815b838110156109c657600060a1600087878581811061097157610971615311565b905060200201602081019061098691906149ff565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828111156109b5578092505b506109bf8161533d565b9050610951565b509392505050565b604080517f14bde674c9f64b2ad00eaaee4a8bed1fabef35c7507e3c5b9cfc9436909a2dad6020808301919091526001600160a01b038681168385015288811660608401528716608083015260a0820185905260c08083018590528351808403909101815260e0909201909252805191012060009081610a4c61269c565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f19018152919052805160209091012098975050505050505050565b60665460609060019060029081161415610ac55760405162461bcd60e51b8152600401610abc90615358565b60405180910390fd5b6000836001600160401b03811115610adf57610adf614c31565b604051908082528060200260200182016040528015610b08578160200160208202803683370190505b50336000908152609a60205260408120549192506001600160a01b03909116905b85811015610dee57868682818110610b4357610b43615311565b9050602002810190610b55919061538f565b610b639060208101906153af565b9050878783818110610b7757610b77615311565b9050602002810190610b89919061538f565b610b9390806153af565b905014610c085760405162461bcd60e51b815260206004820152603860248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a20696e707574206c656e677468206d69736d6174636800000000000000006064820152608401610abc565b33878783818110610c1b57610c1b615311565b9050602002810190610c2d919061538f565b610c3e9060608101906040016149ff565b6001600160a01b031614610cba5760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e717565756557697468647261776160448201527f6c3a2077697468647261776572206d757374206265207374616b6572000000006064820152608401610abc565b610dbf3383898985818110610cd157610cd1615311565b9050602002810190610ce3919061538f565b610cf49060608101906040016149ff565b8a8a86818110610d0657610d06615311565b9050602002810190610d18919061538f565b610d2290806153af565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508e92508d9150889050818110610d6857610d68615311565b9050602002810190610d7a919061538f565b610d889060208101906153af565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061283692505050565b838281518110610dd157610dd1615311565b602090810291909101015280610de68161533d565b915050610b29565b509095945050505050565b610e023361155a565b15610e885760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e726567697374657241734f70657260448201527f61746f723a2063616c6c657220697320616c7265616479206163746976656c796064820152690819195b1959d85d195960b21b608482015260a401610abc565b610e923384612df6565b604080518082019091526060815260006020820152610eb43380836000612fe9565b336001600160a01b03167f8e8485583a2310d41f7c82b9427d0bd49bad74bb9cff9d3402a29d8f9b28a0e285604051610eed91906153f8565b60405180910390a2336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908484604051610f3092919061544a565b60405180910390a250505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb59190615479565b6001600160a01b0316336001600160a01b031614610fe55760405162461bcd60e51b8152600401610abc90615496565b610fee8161327f565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110505750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61106c5760405162461bcd60e51b8152600401610abc906154e0565b6110758361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a181858585613376565b505b505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156110f0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611114919061553d565b6111305760405162461bcd60e51b8152600401610abc9061555a565b606654818116146111a95760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6111ef6133f1565b6110a18484848461344b565b6001600160a01b0383166000908152609b602052604081205461122085828686611b43565b95945050505050565b600054610100900460ff16158080156112495750600054600160ff909116105b806112635750303b158015611263575060005460ff166001145b6112c65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610abc565b6000805460ff1916600117905580156112e9576000805461ff0019166101001790555b6112f38888613671565b6112fb61375b565b609755611307896137f2565b61131086613844565b61131c8585858561344b565b8015611362576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806113cc5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b6113e85760405162461bcd60e51b8152600401610abc906154e0565b6113f18361155a565b156110a3576001600160a01b038084166000908152609a6020526040902054166110a18185858561393e565b606654600290600490811614156114465760405162461bcd60e51b8152600401610abc90615358565b600260c95414156114995760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c95560005b88811015611549576115398a8a838181106114be576114be615311565b90506020028101906114d091906155a2565b8989848181106114e2576114e2615311565b90506020028101906114f491906153af565b89898681811061150657611506615311565b9050602002013588888781811061151f5761151f615311565b905060200201602081019061153491906155b8565b6139b9565b6115428161533d565b90506114a1565b5050600160c9555050505050505050565b6001600160a01b039081166000908152609a602052604090205416151590565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156115c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e6919061553d565b6116025760405162461bcd60e51b8152600401610abc9061555a565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000816040516020016116549190615649565b604051602081830303815290604052805190602001209050919050565b6066546002906004908116141561169a5760405162461bcd60e51b8152600401610abc90615358565b600260c95414156116ed5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610abc565b600260c9556116ff86868686866139b9565b5050600160c95550505050565b6117146133f1565b610fee81613844565b60006001600160a01b0382161580159061175157506001600160a01b038083166000818152609a6020526040902054909116145b92915050565b61175f6133f1565b61176960006137f2565b565b42836020015110156117ef5760405162461bcd60e51b815260206004820152604160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b6572207369676e6174757265206578706972656064820152601960fa1b608482015260a401610abc565b6117f88561155a565b156118815760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a207374616b657220697320616c726561647920616374697660648201526c195b1e4819195b1959d85d1959609a1b608482015260a401610abc565b61188a8461171d565b6119165760405162461bcd60e51b815260206004820152605160248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f4279536960448201527f676e61747572653a206f70657261746f72206973206e6f7420726567697374656064820152703932b21034b71022b4b3b2b72630bcb2b960791b608482015260a401610abc565b6000609b6000876001600160a01b03166001600160a01b0316815260200190815260200160002054905060006119528783888860200151611b43565b6001600160a01b0388166000908152609b60205260409020600184019055855190915061198290889083906141a3565b61198e87878686612fe9565b50505050505050565b6060600082516001600160401b038111156119b4576119b4614c31565b6040519080825280602002602001820160405280156119dd578160200160208202803683370190505b50905060005b83518110156109c6576001600160a01b03851660009081526098602052604081208551909190869084908110611a1b57611a1b615311565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054828281518110611a5657611a56615311565b6020908102919091010152611a6a8161533d565b90506119e3565b611a7a3361171d565b611afc5760405162461bcd60e51b815260206004820152604760248201527f44656c65676174696f6e4d616e616765722e7570646174654f70657261746f7260448201527f4d657461646174615552493a2063616c6c6572206d75737420626520616e206f6064820152663832b930ba37b960c91b608482015260a401610abc565b336001600160a01b03167f02a919ed0e2acad1dd90f17ef2fa4ae5462ee1339170034a8531cca4b67080908383604051611b3792919061544a565b60405180910390a25050565b604080517f39111bc4a4d688e1f685123d7497d4615370152a8ee4a0593e647bd06ad8bb0b6020808301919091526001600160a01b0387811683850152851660608301526080820186905260a08083018590528351808403909101815260c0909201909252805191012060009081611bb961269c565b60405161190160f01b602082015260228101919091526042810183905260620160408051808303601f190181529190528051602090910120979650505050505050565b6040516360f4062b60e01b81526001600160a01b03828116600483015260609182916000917f0000000000000000000000000000000000000000000000000000000000000000909116906360f4062b90602401602060405180830381865afa158015611c6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c90919061565c565b6040516394f649dd60e01b81526001600160a01b03868116600483015291925060009182917f0000000000000000000000000000000000000000000000000000000000000000909116906394f649dd90602401600060405180830381865afa158015611d00573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d2891908101906156d0565b9150915060008313611d3f57909590945092505050565b606080835160001415611df9576040805160018082528183019092529060208083019080368337505060408051600180825281830190925292945090506020808301908036833701905050905073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac082600081518110611db457611db4615311565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600081518110611de857611de8615311565b602002602001018181525050611fa7565b8351611e0690600161578a565b6001600160401b03811115611e1d57611e1d614c31565b604051908082528060200260200182016040528015611e46578160200160208202803683370190505b50915081516001600160401b03811115611e6257611e62614c31565b604051908082528060200260200182016040528015611e8b578160200160208202803683370190505b50905060005b8451811015611f2557848181518110611eac57611eac615311565b6020026020010151838281518110611ec657611ec6615311565b60200260200101906001600160a01b031690816001600160a01b031681525050838181518110611ef857611ef8615311565b6020026020010151828281518110611f1257611f12615311565b6020908102919091010152600101611e91565b5073beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac08260018451611f4a91906157a2565b81518110611f5a57611f5a615311565b60200260200101906001600160a01b031690816001600160a01b031681525050848160018451611f8a91906157a2565b81518110611f9a57611f9a615311565b6020026020010181815250505b9097909650945050505050565b60665460609060019060029081161415611fe05760405162461bcd60e51b8152600401610abc90615358565b611fe98361155a565b6120695760405162461bcd60e51b8152602060048201526044602482018190527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a207374908201527f616b6572206d7573742062652064656c65676174656420746f20756e64656c656064820152636761746560e01b608482015260a401610abc565b6120728361171d565b156120e55760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a206f7060448201527f657261746f72732063616e6e6f7420626520756e64656c6567617465640000006064820152608401610abc565b6001600160a01b0383166121615760405162461bcd60e51b815260206004820152603c60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6e6e6f7420756e64656c6567617465207a65726f2061646472657373000000006064820152608401610abc565b6001600160a01b038084166000818152609a6020526040902054909116903314806121945750336001600160a01b038216145b806121bb57506001600160a01b038181166000908152609960205260409020600101541633145b61222d5760405162461bcd60e51b815260206004820152603d60248201527f44656c65676174696f6e4d616e616765722e756e64656c65676174653a20636160448201527f6c6c65722063616e6e6f7420756e64656c6567617465207374616b65720000006064820152608401610abc565b60008061223986611bfc565b9092509050336001600160a01b0387161461228f57826001600160a01b0316866001600160a01b03167ff0eddf07e6ea14f388b47e1e94a0f464ecbd9eed4171130e0fc0e99fb4030a8a60405160405180910390a35b826001600160a01b0316866001600160a01b03167ffee30966a256b71e14bc0ebfc94315e28ef4a97a7131a9e2b7a310a73af4467660405160405180910390a36001600160a01b0386166000908152609a6020526040902080546001600160a01b0319169055815161231157604080516000815260208101909152945061246f565b81516001600160401b0381111561232a5761232a614c31565b604051908082528060200260200182016040528015612353578160200160208202803683370190505b50945060005b825181101561246d576040805160018082528183019092526000916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090508483815181106123b9576123b9615311565b6020026020010151826000815181106123d4576123d4615311565b60200260200101906001600160a01b031690816001600160a01b03168152505083838151811061240657612406615311565b60200260200101518160008151811061242157612421615311565b60200260200101818152505061243a89878b8585612836565b88848151811061244c5761244c615311565b602002602001018181525050505080806124659061533d565b915050612359565b505b50505050919050565b6124813361155a565b156124ff5760405162461bcd60e51b815260206004820152604260248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a20737460448201527f616b657220697320616c7265616479206163746976656c792064656c65676174606482015261195960f21b608482015260a401610abc565b6125088361171d565b6125895760405162461bcd60e51b815260206004820152604660248201527f44656c65676174696f6e4d616e616765722e64656c6567617465546f3a206f7060448201527f657261746f72206973206e6f74207265676973746572656420696e2045696765606482015265372630bcb2b960d11b608482015260a401610abc565b6110a333848484612fe9565b61259e3361171d565b61261c5760405162461bcd60e51b815260206004820152604360248201527f44656c65676174696f6e4d616e616765722e6d6f646966794f70657261746f7260448201527f44657461696c733a2063616c6c6572206d75737420626520616e206f706572616064820152623a37b960e91b608482015260a401610abc565b610fee3382612df6565b61262e6133f1565b6001600160a01b0381166126935760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610abc565b610fee816137f2565b60007f00000000000000000000000000000000000000000000000000000000000000004614156126cd575060975490565b6126d561375b565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561272d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127519190615479565b6001600160a01b0316336001600160a01b0316146127815760405162461bcd60e51b8152600401610abc90615496565b6066541981196066541916146127ff5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610abc565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016111dc565b60006001600160a01b0386166128cd5760405162461bcd60e51b815260206004820152605060248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374616b65722063616e6e6f7460648201526f206265207a65726f206164647265737360801b608482015260a401610abc565b82516129575760405162461bcd60e51b815260206004820152604d60248201527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448201527f6e6451756575655769746864726177616c3a207374726174656769657320636160648201526c6e6e6f7420626520656d70747960981b608482015260a401610abc565b60005b8351811015612d04576001600160a01b038616156129b0576129b0868886848151811061298957612989615311565b60200260200101518685815181106129a3576129a3615311565b6020026020010151613376565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06001600160a01b03168482815181106129e0576129e0615311565b60200260200101516001600160a01b03161415612aa9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663beffbb8988858481518110612a3957612a39615311565b60200260200101516040518363ffffffff1660e01b8152600401612a729291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b158015612a8c57600080fd5b505af1158015612aa0573d6000803e3d6000fd5b50505050612cfc565b846001600160a01b0316876001600160a01b03161480612b7b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4da03d858381518110612b0557612b05615311565b60200260200101516040518263ffffffff1660e01b8152600401612b3891906001600160a01b0391909116815260200190565b602060405180830381865afa158015612b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b79919061553d565b155b612c475760405162461bcd60e51b8152602060048201526084602482018190527f44656c65676174696f6e4d616e616765722e5f72656d6f76655368617265734160448301527f6e6451756575655769746864726177616c3a2077697468647261776572206d7560648301527f73742062652073616d652061646472657373206173207374616b657220696620908201527f746869726450617274795472616e7366657273466f7262696464656e2061726560a482015263081cd95d60e21b60c482015260e401610abc565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638c80d4e588868481518110612c8957612c89615311565b6020026020010151868581518110612ca357612ca3615311565b60200260200101516040518463ffffffff1660e01b8152600401612cc9939291906157b9565b600060405180830381600087803b158015612ce357600080fd5b505af1158015612cf7573d6000803e3d6000fd5b505050505b60010161295a565b506001600160a01b0386166000908152609f60205260408120805491829190612d2c8361533d565b919050555060006040518060e00160405280896001600160a01b03168152602001886001600160a01b03168152602001876001600160a01b031681526020018381526020014363ffffffff1681526020018681526020018581525090506000612d9482611641565b6000818152609e602052604090819020805460ff19166001179055519091507f9009ab153e8014fbfb02f2217f5cde7aa7f9ad734ae85ca3ee3f4ca2fdd499f990612de290839085906157dd565b60405180910390a198975050505050505050565b6213c680612e0a60608301604084016157f6565b63ffffffff161115612ebf5760405162461bcd60e51b815260206004820152606c60248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527f63616e6e6f74206265203e204d41585f5354414b45525f4f50545f4f55545f5760848201526b494e444f575f424c4f434b5360a01b60a482015260c401610abc565b6001600160a01b0382166000908152609960205260409081902060010154600160a01b900463ffffffff1690612efb90606084019084016157f6565b63ffffffff161015612f915760405162461bcd60e51b815260206004820152605360248201527f44656c65676174696f6e4d616e616765722e5f7365744f70657261746f72446560448201527f7461696c733a207374616b65724f70744f757457696e646f77426c6f636b732060648201527218d85b9b9bdd08189948191958dc99585cd959606a1b608482015260a401610abc565b6001600160a01b03821660009081526099602052604090208190612fb58282615833565b505060405133907ffebe5cd24b2cbc7b065b9d0fdeb904461e4afcff57dd57acda1e7832031ba7ac90611b379084906153f8565b606654600090600190811614156130125760405162461bcd60e51b8152600401610abc90615358565b6001600160a01b038085166000908152609960205260409020600101541680158015906130485750336001600160a01b03821614155b801561305d5750336001600160a01b03861614155b156131ca5742846020015110156130dc5760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f766572207369676e617475726520657870697265640000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845290915290205460ff16156131765760405162461bcd60e51b815260206004820152603760248201527f44656c65676174696f6e4d616e616765722e5f64656c65676174653a2061707060448201527f726f76657253616c7420616c7265616479207370656e740000000000000000006064820152608401610abc565b6001600160a01b0381166000908152609c6020908152604080832086845282528220805460ff191660011790558501516131b79088908890859088906109ce565b90506131c8828287600001516141a3565b505b6001600160a01b038681166000818152609a602052604080822080546001600160a01b031916948a169485179055517fc3ee9f2e5fda98e8066a1f745b2df9285f416fe98cf2559cd21484b3d87433049190a360008061322988611bfc565b9150915060005b825181101561136257613277888a85848151811061325057613250615311565b602002602001015185858151811061326a5761326a615311565b602002602001015161393e565b600101613230565b6001600160a01b03811661330d5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610abc565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038085166000908152609860209081526040808320938616835292905290812080548392906133ad9084906157a2565b92505081905550836001600160a01b03167f6909600037b75d7b4733aedd815442b5ec018a827751c832aaff64eba5d6d2dd848484604051610f30939291906157b9565b6033546001600160a01b031633146117695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610abc565b8281146134d35760405162461bcd60e51b815260206004820152604a60248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a20696e707574206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610abc565b8260005b818110156136695760008686838181106134f3576134f3615311565b905060200201602081019061350891906149ff565b6001600160a01b038116600090815260a1602052604081205491925086868581811061353657613536615311565b90506020020135905062034bc08111156135fa5760405162461bcd60e51b815260206004820152607360248201527f44656c65676174696f6e4d616e616765722e5f7365745374726174656779576960448201527f746864726177616c44656c6179426c6f636b733a205f7769746864726177616c60648201527f44656c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544860848201527244524157414c5f44454c41595f424c4f434b5360681b60a482015260c401610abc565b6001600160a01b038316600081815260a160209081526040918290208490558151928352820184905281018290527f0e7efa738e8b0ce6376a0c1af471655540d2e9a81647d7b09ed823018426576d9060600160405180910390a1505050806136629061533d565b90506134d7565b505050505050565b6065546001600160a01b031615801561369257506001600160a01b03821615155b6137145760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610abc565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26137578261327f565b5050565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62034bc08111156138fd5760405162461bcd60e51b815260206004820152607160248201527f44656c65676174696f6e4d616e616765722e5f7365744d696e5769746864726160448201527f77616c44656c6179426c6f636b733a205f6d696e5769746864726177616c446560648201527f6c6179426c6f636b732063616e6e6f74206265203e204d41585f5749544844526084820152704157414c5f44454c41595f424c4f434b5360781b60a482015260c401610abc565b609d5460408051918252602082018390527fafa003cd76f87ff9d62b35beea889920f33c0c42b8d45b74954d61d50f4b6b69910160405180910390a1609d55565b6001600160a01b0380851660009081526098602090815260408083209386168352929052908120805483929061397590849061578a565b92505081905550836001600160a01b03167f1ec042c965e2edd7107b51188ee0f383e22e76179041ab3a9d18ff151405166c848484604051610f30939291906157b9565b60006139c76105f387615896565b6000818152609e602052604090205490915060ff16613a485760405162461bcd60e51b815260206004820152604360248201526000805160206159c883398151915260448201527f645769746864726177616c3a20616374696f6e206973206e6f7420696e20717560648201526265756560e81b608482015260a401610abc565b609d544390613a5d60a0890160808a016157f6565b63ffffffff16613a6d919061578a565b1115613af55760405162461bcd60e51b815260206004820152605f60248201526000805160206159c883398151915260448201527f645769746864726177616c3a206d696e5769746864726177616c44656c61794260648201527f6c6f636b7320706572696f6420686173206e6f74207965742070617373656400608482015260a401610abc565b613b0560608701604088016149ff565b6001600160a01b0316336001600160a01b031614613b925760405162461bcd60e51b815260206004820152605060248201526000805160206159c883398151915260448201527f645769746864726177616c3a206f6e6c7920776974686472617765722063616e60648201526f1031b7b6b83632ba329030b1ba34b7b760811b608482015260a401610abc565b8115613c1457613ba560a08701876153af565b85149050613c145760405162461bcd60e51b815260206004820152604260248201526000805160206159c883398151915260448201527f645769746864726177616c3a20696e707574206c656e677468206d69736d61746064820152610c6d60f31b608482015260a401610abc565b6000818152609e60205260409020805460ff191690558115613d795760005b613c4060a08801886153af565b9050811015613d73574360a16000613c5b60a08b018b6153af565b85818110613c6b57613c6b615311565b9050602002016020810190613c8091906149ff565b6001600160a01b03168152602081019190915260400160002054613caa60a08a0160808b016157f6565b63ffffffff16613cba919061578a565b1115613cd85760405162461bcd60e51b8152600401610abc906158a2565b613d6b613ce860208901896149ff565b33613cf660a08b018b6153af565b85818110613d0657613d06615311565b9050602002016020810190613d1b91906149ff565b613d2860c08c018c6153af565b86818110613d3857613d38615311565b905060200201358a8a87818110613d5157613d51615311565b9050602002016020810190613d6691906149ff565b61435d565b600101613c33565b50614168565b336000908152609a60205260408120546001600160a01b0316905b613da160a08901896153af565b9050811015614165574360a16000613dbc60a08c018c6153af565b85818110613dcc57613dcc615311565b9050602002016020810190613de191906149ff565b6001600160a01b03168152602081019190915260400160002054613e0b60a08b0160808c016157f6565b63ffffffff16613e1b919061578a565b1115613e395760405162461bcd60e51b8152600401610abc906158a2565b73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0613e5b60a08a018a6153af565b83818110613e6b57613e6b615311565b9050602002016020810190613e8091906149ff565b6001600160a01b03161415613fd0576000613e9e60208a018a6149ff565b905060006001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630e81073c83613edf60c08e018e6153af565b87818110613eef57613eef615311565b6040516001600160e01b031960e087901b1681526001600160a01b03909416600485015260200291909101356024830152506044016020604051808303816000875af1158015613f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f67919061565c565b6001600160a01b038084166000908152609a6020526040902054919250168015613fc857613fc88184613f9d60a08f018f6153af565b88818110613fad57613fad615311565b9050602002016020810190613fc291906149ff565b8561393e565b50505061415d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4623ea13389898581811061401257614012615311565b905060200201602081019061402791906149ff565b61403460a08d018d6153af565b8681811061404457614044615311565b905060200201602081019061405991906149ff565b61406660c08e018e6153af565b8781811061407657614076615311565b60405160e088901b6001600160e01b03191681526001600160a01b03968716600482015294861660248601529290941660448401526020909102013560648201526084019050600060405180830381600087803b1580156140d657600080fd5b505af11580156140ea573d6000803e3d6000fd5b505050506001600160a01b0382161561415d5761415d823361410f60a08c018c6153af565b8581811061411f5761411f615311565b905060200201602081019061413491906149ff565b61414160c08d018d6153af565b8681811061415157614151615311565b9050602002013561393e565b600101613d94565b50505b6040518181527fc97098c2f658800b4df29001527f7324bcdffcf6e8751a699ab920a1eced5b1d9060200160405180910390a1505050505050565b6001600160a01b0383163b156142bd57604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906141e3908690869060040161592a565b602060405180830381865afa158015614200573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142249190615987565b6001600160e01b031916146110a35760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610abc565b826001600160a01b03166142d1838361449d565b6001600160a01b0316146110a35760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610abc565b6001600160a01b03831673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014156144085760405162387b1360e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063387b1300906143d1908890889087906004016157b9565b600060405180830381600087803b1580156143eb57600080fd5b505af11580156143ff573d6000803e3d6000fd5b50505050614496565b60405163c608c7f360e01b81526001600160a01b03858116600483015284811660248301526044820184905282811660648301527f0000000000000000000000000000000000000000000000000000000000000000169063c608c7f390608401600060405180830381600087803b15801561448257600080fd5b505af1158015611362573d6000803e3d6000fd5b5050505050565b60008060006144ac85856144b9565b915091506109c681614529565b6000808251604114156144f05760208301516040840151606085015160001a6144e4878285856146e4565b94509450505050614522565b82516040141561451a576020830151604084015161450f8683836147d1565b935093505050614522565b506000905060025b9250929050565b600081600481111561453d5761453d6159b1565b14156145465750565b600181600481111561455a5761455a6159b1565b14156145a85760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610abc565b60028160048111156145bc576145bc6159b1565b141561460a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610abc565b600381600481111561461e5761461e6159b1565b14156146775760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610abc565b600481600481111561468b5761468b6159b1565b1415610fee5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610abc565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561471b57506000905060036147c8565b8460ff16601b1415801561473357508460ff16601c14155b1561474457506000905060046147c8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614798573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147c1576000600192509250506147c8565b9150600090505b94509492505050565b6000806001600160ff1b038316816147ee60ff86901c601b61578a565b90506147fc878288856146e4565b935093505050935093915050565b60008083601f84011261481c57600080fd5b5081356001600160401b0381111561483357600080fd5b6020830191508360208260051b850101111561452257600080fd5b6000806020838503121561486157600080fd5b82356001600160401b0381111561487757600080fd5b6148838582860161480a565b90969095509350505050565b6001600160a01b0381168114610fee57600080fd5b80356148af8161488f565b919050565b600080600080600060a086880312156148cc57600080fd5b85356148d78161488f565b945060208601356148e78161488f565b935060408601356148f78161488f565b94979396509394606081013594506080013592915050565b6020808252825182820181905260009190848201906040850190845b818110156149475783518352928401929184019160010161492b565b50909695505050505050565b60006060828403121561496557600080fd5b50919050565b60008083601f84011261497d57600080fd5b5081356001600160401b0381111561499457600080fd5b60208301915083602082850101111561452257600080fd5b6000806000608084860312156149c157600080fd5b6149cb8585614953565b925060608401356001600160401b038111156149e657600080fd5b6149f28682870161496b565b9497909650939450505050565b600060208284031215614a1157600080fd5b8135614a1c8161488f565b9392505050565b600080600060608486031215614a3857600080fd5b8335614a438161488f565b92506020840135614a538161488f565b929592945050506040919091013590565b600060208284031215614a7657600080fd5b5035919050565b60008060008060408587031215614a9357600080fd5b84356001600160401b0380821115614aaa57600080fd5b614ab68883890161480a565b90965094506020870135915080821115614acf57600080fd5b50614adc8782880161480a565b95989497509550505050565b60008060008060008060008060c0898b031215614b0457600080fd5b8835614b0f8161488f565b97506020890135614b1f8161488f565b9650604089013595506060890135945060808901356001600160401b0380821115614b4957600080fd5b614b558c838d0161480a565b909650945060a08b0135915080821115614b6e57600080fd5b50614b7b8b828c0161480a565b999c989b5096995094979396929594505050565b6000806000806000806000806080898b031215614bab57600080fd5b88356001600160401b0380821115614bc257600080fd5b614bce8c838d0161480a565b909a50985060208b0135915080821115614be757600080fd5b614bf38c838d0161480a565b909850965060408b0135915080821115614c0c57600080fd5b614c188c838d0161480a565b909650945060608b0135915080821115614b6e57600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715614c6957614c69614c31565b60405290565b604080519081016001600160401b0381118282101715614c6957614c69614c31565b604051601f8201601f191681016001600160401b0381118282101715614cb957614cb9614c31565b604052919050565b63ffffffff81168114610fee57600080fd5b80356148af81614cc1565b60006001600160401b03821115614cf757614cf7614c31565b5060051b60200190565b600082601f830112614d1257600080fd5b81356020614d27614d2283614cde565b614c91565b82815260059290921b84018101918181019086841115614d4657600080fd5b8286015b84811015614d6a578035614d5d8161488f565b8352918301918301614d4a565b509695505050505050565b600082601f830112614d8657600080fd5b81356020614d96614d2283614cde565b82815260059290921b84018101918181019086841115614db557600080fd5b8286015b84811015614d6a5780358352918301918301614db9565b600060e08284031215614de257600080fd5b614dea614c47565b9050614df5826148a4565b8152614e03602083016148a4565b6020820152614e14604083016148a4565b604082015260608201356060820152614e2f60808301614cd3565b608082015260a08201356001600160401b0380821115614e4e57600080fd5b614e5a85838601614d01565b60a084015260c0840135915080821115614e7357600080fd5b50614e8084828501614d75565b60c08301525092915050565b600060208284031215614e9e57600080fd5b81356001600160401b03811115614eb457600080fd5b614ec084828501614dd0565b949350505050565b600060208284031215614eda57600080fd5b813560ff81168114614a1c57600080fd5b8015158114610fee57600080fd5b600080600080600060808688031215614f1157600080fd5b85356001600160401b0380821115614f2857600080fd5b9087019060e0828a031215614f3c57600080fd5b90955060208701359080821115614f5257600080fd5b50614f5f8882890161480a565b909550935050604086013591506060860135614f7a81614eeb565b809150509295509295909350565b60008060408385031215614f9b57600080fd5b8235614fa68161488f565b91506020830135614fb68161488f565b809150509250929050565b600060408284031215614fd357600080fd5b614fdb614c6f565b905081356001600160401b0380821115614ff457600080fd5b818401915084601f83011261500857600080fd5b813560208282111561501c5761501c614c31565b61502e601f8301601f19168201614c91565b9250818352868183860101111561504457600080fd5b8181850182850137600081838501015282855280860135818601525050505092915050565b600080600080600060a0868803121561508157600080fd5b853561508c8161488f565b9450602086013561509c8161488f565b935060408601356001600160401b03808211156150b857600080fd5b6150c489838a01614fc1565b945060608801359150808211156150da57600080fd5b506150e788828901614fc1565b95989497509295608001359392505050565b6000806040838503121561510c57600080fd5b82356151178161488f565b915060208301356001600160401b0381111561513257600080fd5b61513e85828601614d01565b9150509250929050565b600081518084526020808501945080840160005b838110156151785781518752958201959082019060010161515c565b509495945050505050565b602081526000614a1c6020830184615148565b600080602083850312156151a957600080fd5b82356001600160401b038111156151bf57600080fd5b6148838582860161496b565b600080604083850312156151de57600080fd5b82356151e98161488f565b946020939093013593505050565b6000806000806080858703121561520d57600080fd5b84356152188161488f565b935060208501359250604085013561522f8161488f565b9396929550929360600135925050565b600081518084526020808501945080840160005b838110156151785781516001600160a01b031687529582019590820190600101615253565b60408152600061528b604083018561523f565b82810360208401526112208185615148565b6000806000606084860312156152b257600080fd5b83356152bd8161488f565b925060208401356001600160401b038111156152d857600080fd5b6152e486828701614fc1565b925050604084013590509250925092565b60006060828403121561530757600080fd5b614a1c8383614953565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060001982141561535157615351615327565b5060010190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b60008235605e198336030181126153a557600080fd5b9190910192915050565b6000808335601e198436030181126153c657600080fd5b8301803591506001600160401b038211156153e057600080fd5b6020019150600581901b360382131561452257600080fd5b6060810182356154078161488f565b6001600160a01b0390811683526020840135906154238261488f565b166020830152604083013561543781614cc1565b63ffffffff811660408401525092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b60006020828403121561548b57600080fd5b8151614a1c8161488f565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60208082526037908201527f44656c65676174696f6e4d616e616765723a206f6e6c7953747261746567794d60408201527f616e616765724f72456967656e506f644d616e61676572000000000000000000606082015260800190565b60006020828403121561554f57600080fd5b8151614a1c81614eeb565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000823560de198336030181126153a557600080fd5b6000602082840312156155ca57600080fd5b8135614a1c81614eeb565b600060018060a01b03808351168452806020840151166020850152806040840151166040850152506060820151606084015263ffffffff608083015116608084015260a082015160e060a085015261563060e085018261523f565b905060c083015184820360c08601526112208282615148565b602081526000614a1c60208301846155d5565b60006020828403121561566e57600080fd5b5051919050565b600082601f83011261568657600080fd5b81516020615696614d2283614cde565b82815260059290921b840181019181810190868411156156b557600080fd5b8286015b84811015614d6a57805183529183019183016156b9565b600080604083850312156156e357600080fd5b82516001600160401b03808211156156fa57600080fd5b818501915085601f83011261570e57600080fd5b8151602061571e614d2283614cde565b82815260059290921b8401810191818101908984111561573d57600080fd5b948201945b838610156157645785516157558161488f565b82529482019490820190615742565b9188015191965090935050508082111561577d57600080fd5b5061513e85828601615675565b6000821982111561579d5761579d615327565b500190565b6000828210156157b4576157b4615327565b500390565b6001600160a01b039384168152919092166020820152604081019190915260600190565b828152604060208201526000614ec060408301846155d5565b60006020828403121561580857600080fd5b8135614a1c81614cc1565b80546001600160a01b0319166001600160a01b0392909216919091179055565b813561583e8161488f565b6158488183615813565b5060018101602083013561585b8161488f565b6158658183615813565b50604083013561587481614cc1565b815463ffffffff60a01b191660a09190911b63ffffffff60a01b161790555050565b60006117513683614dd0565b6020808252606e908201526000805160206159c883398151915260408201527f645769746864726177616c3a207769746864726177616c44656c6179426c6f6360608201527f6b7320706572696f6420686173206e6f74207965742070617373656420666f7260808201526d207468697320737472617465677960901b60a082015260c00190565b82815260006020604081840152835180604085015260005b8181101561595e57858101830151858201606001528201615942565b81811115615970576000606083870101525b50601f01601f191692909201606001949350505050565b60006020828403121561599957600080fd5b81516001600160e01b031981168114614a1c57600080fd5b634e487b7160e01b600052602160045260246000fdfe44656c65676174696f6e4d616e616765722e5f636f6d706c6574655175657565a2646970667358221220a9274be1541ac1bbade78c3ef90445860166062b6ee409ed0f0e56600eb34d0964736f6c634300080c0033", } // DelegationManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go index 13f14ddf7..f421d0a34 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -62,7 +62,7 @@ type IEigenPodValidatorInfo struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_delayedWithdrawalRouter\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"_GENESIS_TIME\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"GENESIS_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activateRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delayedWithdrawalRouter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelayedWithdrawalRouter\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasRestaked\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mostRecentWithdrawalTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nonBeaconChainETHBalanceWei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"provenWithdrawal\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recoverTokens\",\"inputs\":[{\"name\":\"tokenList\",\"type\":\"address[]\",\"internalType\":\"contractIERC20[]\"},{\"name\":\"amountsToWithdraw\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"sumOfPartialWithdrawalsClaimedGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPod.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"mostRecentBalanceUpdateTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPod.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyAndProcessWithdrawals\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"withdrawalProofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.WithdrawalProof[]\",\"components\":[{\"name\":\"withdrawalProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"slotProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"executionPayloadProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"timestampProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"historicalSummaryBlockRootProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"blockRootIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"historicalSummaryIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"withdrawalIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"slotRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestampRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"executionPayloadRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"},{\"name\":\"withdrawalFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyBalanceUpdates\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"oracleTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"stateRootProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.StateRootProof\",\"components\":[{\"name\":\"beaconStateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"validatorIndices\",\"type\":\"uint40[]\",\"internalType\":\"uint40[]\"},{\"name\":\"validatorFieldsProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"validatorFields\",\"type\":\"bytes32[][]\",\"internalType\":\"bytes32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawBeforeRestaking\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawNonBeaconChainETHBalanceWei\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountToWithdraw\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amountWei\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"indexed\":false,\"internalType\":\"bytes\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"FullWithdrawalRedeemed\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"withdrawalTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amountWithdrawn\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PartialWithdrawalRedeemed\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"withdrawalTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"partialWithdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakedBeaconChainETHWithdrawn\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RestakingActivated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"validatorIndex\",\"type\":\"uint40\",\"indexed\":false,\"internalType\":\"uint40\"}],\"anonymous\":false}]", - Bin: "0x6101206040523480156200001257600080fd5b5060405162005fc038038062005fc083398101604081905262000035916200016f565b6001600160a01b0380861660805284811660a052831660c0526001600160401b0380831660e0528116610100526200006c62000077565b5050505050620001e7565b600054610100900460ff1615620000e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000137576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014f57600080fd5b50565b80516001600160401b03811681146200016a57600080fd5b919050565b600080600080600060a086880312156200018857600080fd5b8551620001958162000139565b6020870151909550620001a88162000139565b6040870151909450620001bb8162000139565b9250620001cb6060870162000152565b9150620001db6080870162000152565b90509295509295909350565b60805160a05160c05160e05161010051615cde620002e2600039600081816105b501528181612030015281816120e7015261213f015260008181610275015281816125d00152818161260401528181612c3001528181612c5d015281816143a401526143df01526000818161036d01528181610614015281816107a701528181610aef01528181610c4401528181610dcc01528181610f87015281816111680152818161129c0152818161146d015281816118ba01528181611a6201528181611ba101528181611d6e01528181611e58015261315401526000818161024101526133c60152600081816104520152610e970152615cde6000f3fe6080604052600436106101855760003560e01c806374cdd798116100d1578063c49074421161008a578063e251ef5211610064578063e251ef5214610563578063e2c8344514610583578063f2882461146105a3578063fe80b087146105d757600080fd5b8063c490744214610503578063c4d66de814610523578063dda3346c1461054357600080fd5b806374cdd7981461044057806387e0d289146104745780639b4e46341461049b578063a50600f4146104ae578063b522538a146104ce578063baa7145a146104ee57600080fd5b806334bea20a1161013e57806358eaee791161011857806358eaee791461038f5780635d3f65b6146103bc5780636fcd0e53146103dc5780637439841f1461040957600080fd5b806334bea20a146103005780633f65cf191461033b5780634665bcda1461035b57600080fd5b80630b18ff66146101db5780630cd4649e146102185780631a5057be1461022f5780631d905d5c146102635780633106ab53146102af5780633474aa16146102e057600080fd5b366101d657346037600082825461019c9190614c9f565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101e757600080fd5b506033546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561022457600080fd5b5061022d6105fb565b005b34801561023b57600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160401b03909116815260200161020f565b3480156102bb57600080fd5b506034546102d090600160401b900460ff1681565b604051901515815260200161020f565b3480156102ec57600080fd5b50603454610297906001600160401b031681565b34801561030c57600080fd5b506102d061031b366004614cdc565b603560209081526000928352604080842090915290825290205460ff1681565b34801561034757600080fd5b5061022d610356366004614d6f565b610764565b34801561036757600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561039b57600080fd5b506103af6103aa366004614e80565b610caf565b60405161020f9190614ef9565b3480156103c857600080fd5b50603854610297906001600160401b031681565b3480156103e857600080fd5b506103fc6103f7366004614f07565b610d14565b60405161020f9190614f20565b34801561041557600080fd5b506103af610424366004614f07565b600090815260366020526040902054600160c01b900460ff1690565b34801561044c57600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561048057600080fd5b5060335461029790600160a01b90046001600160401b031681565b61022d6104a9366004614f68565b610dc1565b3480156104ba57600080fd5b5061022d6104c9366004614fdb565b610f6e565b3480156104da57600080fd5b506103fc6104e9366004614e80565b611304565b3480156104fa57600080fd5b5061022d6113f7565b34801561050f57600080fd5b5061022d61051e366004615085565b611462565b34801561052f57600080fd5b5061022d61053e3660046150b1565b61169f565b34801561054f57600080fd5b5061022d61055e3660046151cb565b611877565b34801561056f57600080fd5b5061022d61057e36600461529c565b611a4a565b34801561058f57600080fd5b5061022d61059e366004615085565b611e15565b3480156105af57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e357600080fd5b506105ed60375481565b60405190815260200161020f565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106879190615397565b156106ad5760405162461bcd60e51b81526004016106a4906153b9565b60405180910390fd5b6033546001600160a01b031633146106d75760405162461bcd60e51b81526004016106a490615416565b603454600160401b900460ff16156107015760405162461bcd60e51b81526004016106a49061545e565b6034805460ff60401b1916600160401b179055603354610729906001600160a01b0316611ff8565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b0316331461078e5760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190615397565b156108375760405162461bcd60e51b81526004016106a4906153b9565b603454600160401b900460ff166108af5760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60648201526084016106a4565b85841480156108bd57508382145b61094d5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a4016106a4565b603354600160a01b90046001600160401b031615806109a2575060335461098c9061098790600160a01b90046001600160401b031661202c565b612116565b6001600160401b0316896001600160401b031610155b610a2e5760405162461bcd60e51b815260206004820152605160248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2070726f6f66206d75737420626520696e207468652065706f63686064820152701030b33a32b91030b1ba34bb30ba34b7b760791b608482015260a4016106a4565b42610a44613f486001600160401b038c16614c9f565b1015610acd5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a166004820152610b76907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6291906154ad565b8935610b7160208c018c6154c6565b612163565b6000805b87811015610c1a57610bfc8b8b358b8b85818110610b9a57610b9a61550c565b9050602002016020810190610baf9190615522565b8a8a86818110610bc157610bc161550c565b9050602002810190610bd391906154c6565b8a8a88818110610be557610be561550c565b9050602002810190610bf79190615549565b6122f1565b610c069083614c9f565b915080610c1281615592565b915050610b7a565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c40906044015b600060405180830381600087803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b5050505050505050505050505050565b600080610cf184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127ab92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610d3c6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610da757610da7614ec1565b6002811115610db857610db8614ec1565b90525092915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e095760405162461bcd60e51b81526004016106a4906155ad565b346801bc16d674ec80000014610e955760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a4016106a4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610ed86128a5565b8888886040518863ffffffff1660e01b8152600401610efc9695949392919061567f565b6000604051808303818588803b158015610f1557600080fd5b505af1158015610f29573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610f5f9291906156ce565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190615397565b156110175760405162461bcd60e51b81526004016106a4906153b9565b868414801561102557508382145b6110ae5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207660448201527f616c696461746f72496e646963657320616e642070726f6f6673206d7573742060648201526d0c4ca40e6c2daca40d8cadccee8d60931b608482015260a4016106a4565b426110c4613f486001600160401b038c16614c9f565b10156111465760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207360448201527f70656369666965642074696d657374616d7020697320746f6f2066617220696e606482015264081c185cdd60da1b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a1660048201526111ea907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa1580156111b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111db91906154ad565b8735610b7160208a018a6154c6565b6000805b8881101561128e576112708b8b8b8481811061120c5761120c61550c565b90506020020160208101906112219190615522565b8a358a8a868181106112355761123561550c565b905060200281019061124791906154c6565b8a8a888181106112595761125961550c565b905060200281019061126b9190615549565b6128ea565b61127a90836156e2565b91508061128681615592565b9150506111ee565b506033546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163c2c51c4091166112d3633b9aca0085615723565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610c71565b61132c6040805160808101825260008082526020820181905291810182905290606082015290565b6036600061136f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127ab92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156113dc576113dc614ec1565b60028111156113ed576113ed614ec1565b9052509392505050565b6033546001600160a01b031633146114215760405162461bcd60e51b81526004016106a490615416565b603454600160401b900460ff161561144b5760405162461bcd60e51b81526004016106a49061545e565b603354611460906001600160a01b0316611ff8565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114aa5760405162461bcd60e51b81526004016106a4906155ad565b6114b8633b9aca00826157be565b156115425760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a4016106a4565b6000611552633b9aca00836157d2565b6034549091506001600160401b03908116908216111561160b5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c4016106a4565b603480548291906000906116299084906001600160401b03166157e6565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161168891815260200190565b60405180910390a261169a8383612dc8565b505050565b600054610100900460ff16158080156116bf5750600054600160ff909116105b806116d95750303b1580156116d9575060005460ff166001145b61173c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106a4565b6000805460ff19166001179055801561175f576000805461ff0019166101001790555b6001600160a01b0382166117d25760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b60648201526084016106a4565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611873576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118a15760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192d9190615397565b1561194a5760405162461bcd60e51b81526004016106a4906153b9565b82518451146119d55760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a4016106a4565b60005b8451811015611a4357611a31838583815181106119f7576119f761550c565b6020026020010151878481518110611a1157611a1161550c565b60200260200101516001600160a01b0316612dd29092919063ffffffff16565b80611a3b81615592565b9150506119d8565b5050505050565b604051635ac86ab760e01b81526004808201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad59190615397565b15611af25760405162461bcd60e51b81526004016106a4906153b9565b8386148015611b0057508588145b8015611b0b57508782145b611b7f576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e67746860648201526084016106a4565b60405163d1c64cc960e01b81526001600160401b038c166004820152611c23907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1491906154ad565b8b35610b7160208e018e6154c6565b604080518082019091526000808252602082015260005b83811015611d23576000611cde8d358d8d85818110611c5b57611c5b61550c565b9050602002810190611c6d919061580e565b8c8c86818110611c7f57611c7f61550c565b9050602002810190611c9191906154c6565b8c8c88818110611ca357611ca361550c565b9050602002810190611cb59190615549565b8c8c8a818110611cc757611cc761550c565b9050602002810190611cd99190615549565b612e24565b80518451919250908490611cf3908390614c9f565b9052506020808201519084018051611d0c9083906156e2565b905250819050611d1b81615592565b915050611c3a565b50805115611d52576033548151611d52916001600160a01b031690611d4d90633b9aca009061582f565b61339c565b602081015115611e075760335460208201516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263c2c51c4092911690611da890633b9aca0090615723565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611dee57600080fd5b505af1158015611e02573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611e3f5760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecb9190615397565b15611ee85760405162461bcd60e51b81526004016106a4906153b9565b603754821115611f995760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c4016106a4565b8160376000828254611fab919061584e565b90915550506040518281526001600160a01b038416907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a261169a838361339c565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755612029814761339c565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160401b0316826001600160401b031610156120d65760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e6573697300000000000000000060648201526084016106a4565b6120e2600c6020615865565b61210c7f0000000000000000000000000000000000000000000000000000000000000000846157e6565b610d0e9190615894565b6000612124600c6020615865565b61212f8360016158ba565b6121399190615865565b610d0e907f00000000000000000000000000000000000000000000000000000000000000006158ba565b61216f6003602061582f565b81146121ff5760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a4016106a4565b61224482828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506003905061342a565b6122eb5760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c4016106a4565b50505050565b60008061233084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561239f5761239f614ec1565b60028111156123b0576123b0614ec1565b90525090506000816060015160028111156123cd576123cd614ec1565b146124765760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c4016106a4565b61247e6128a5565b612487906158e5565b6124c386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061346692505050565b1461254a5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a4016106a4565b600061258886868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061347b92505050565b90506125988a87878b8b8e6134a0565b603980549060006125a883615592565b90915550506001606083015264ffffffffff891682526001600160401b038b811660408401527f00000000000000000000000000000000000000000000000000000000000000008116908216111561262e576001600160401b037f000000000000000000000000000000000000000000000000000000000000000016602083015261263e565b6001600160401b03811660208301525b6000838152603660209081526040918290208451815492860151938601516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060850151859391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360028111156126dc576126dc614ec1565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516127779392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b031661279c919061582f565b9b9a5050505050505050505050565b600081516030146128345760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a4016106a4565b60405160029061284b908490600090602001615909565b60408051601f198184030181529082905261286591615938565b602060405180830381855afa158015612882573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610d0e91906154ad565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b60008061292984848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061347b92505050565b9050600061296985858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156129d8576129d8614ec1565b60028111156129e9576129e9614ec1565b8152505090508a6001600160401b031681604001516001600160401b031610612aa05760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a4016106a4565b600181606001516002811115612ab857612ab8614ec1565b14612b205760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b60648201526084016106a4565b612b298b61202c565b6001600160401b0316612b6e8787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136f792505050565b6001600160401b031611612c11576000836001600160401b031611612c115760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a4016106a4565b612c1f8987878b8b8f6134a0565b602081015160006001600160401b037f000000000000000000000000000000000000000000000000000000000000000081169086161115612c8157507f0000000000000000000000000000000000000000000000000000000000000000612c84565b50835b6001600160401b0380821660208086019182528f831660408088019182526000898152603690935290912086518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606086015186939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612d2c57612d2c614ec1565b0217905550905050816001600160401b0316816001600160401b031614612db8577f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df8c8e83604051612da39392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1612db5818361370f565b95505b5050505050979650505050505050565b611873828261372e565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261169a908490613847565b6040805180820190915260008082526020820152612e49612e44896159b9565b613919565b6033546001600160401b03600160a01b90910481169082161015612f0b5760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60448201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520617460648201527f206f72206166746572206d6f7374526563656e745769746864726177616c546960848201526606d657374616d760cc1b60a482015260c4016106a4565b6000612f19612e448b6159b9565b90506000612f5988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612f8657612f86614ec1565b141561303d5760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c4016106a4565b60008181526035602090815260408083206001600160401b038616845290915290205460ff16156130fc5760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a4016106a4565b6001603560008381526020019081526020016000206000846001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506131d98c87878e7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166344e71c806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d49190615af5565b613929565b600061321787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061434a92505050565b90506132278d8a8a8e8e866134a0565b600061326588888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061436292505050565b90506132a38a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136f792505050565b6001600160401b03166132bd6132b88f6159b9565b61437a565b6001600160401b03161061337557603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b81049093169381019390935261336a93869388938a936001600160a01b03909316928892916060830190600160c01b900460ff16600281111561335157613351614ec1565b600281111561336257613362614ec1565b90525061438c565b95505050505061338f565b60335461336a90839086906001600160a01b0316846145ca565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063c0db354c9083906044016000604051808303818588803b15801561340d57600080fd5b505af1158015613421573d6000803e3d6000fd5b50505050505050565b6000836134388685856146a8565b1495945050505050565b6000816000815181106134575761345761550c565b60200260200101519050919050565b6000816001815181106134575761345761550c565b6000610d0e826002815181106134935761349361550c565b60200260200101516147f4565b6134ac60036002615bf6565b84146135375760405162461bcd60e51b815260206004820152604e60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b600561354560286001614c9f565b61354f9190614c9f565b61355a90602061582f565b82146135da5760405162461bcd60e51b815260206004820152604360248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a4016106a4565b600064ffffffffff82166135f060286001614c9f565b600b901b179050600061363587878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061485b92505050565b905061367b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c925085915086905061342a565b6136ed5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f6600000060648201526084016106a4565b5050505050505050565b6000610d0e826007815181106134935761349361550c565b60006137276001600160401b03808416908516615c02565b9392505050565b8047101561377e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106a4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137cb576040519150601f19603f3d011682016040523d82523d6000602084013e6137d0565b606091505b505090508061169a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106a4565b600061389c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614b089092919063ffffffff16565b80519091501561169a57808060200190518101906138ba9190615397565b61169a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a4565b6000610d0e8261014001516147f4565b613934600280615bf6565b83146139a85760405162461bcd60e51b81526020600482015260496024820152600080516020615c8983398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a4016106a4565b6139b4600d6002615bf6565b6139c460c0840160a08501615c41565b6001600160401b031610613a2e5760405162461bcd60e51b815260206004820152603f6024820152600080516020615c8983398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c617267650060648201526084016106a4565b613a3a60046002615bf6565b613a4b610100840160e08501615c41565b6001600160401b031610613ab7576040805162461bcd60e51b8152602060048201526024810191909152600080516020615c8983398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c6172676560648201526084016106a4565b613ac360186002615bf6565b613ad360e0840160c08501615c41565b6001600160401b031610613b4d5760405162461bcd60e51b81526020600482015260476024820152600080516020615c8983398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a4016106a4565b60006001600160401b038216613b65612e44856159b9565b6001600160401b031610613b7a576005613b7d565b60045b9050613b8a600482614c9f565b613b95906001614c9f565b613ba090602061582f565b613baa84806154c6565b905014613c1e5760405162461bcd60e51b81526020600482015260486024820152600080516020615c8983398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a4016106a4565b613c2a60046003614c9f565b613c3590602061582f565b613c4260408501856154c6565b905014613cbc5760405162461bcd60e51b815260206004820152604e6024820152600080516020615c8983398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b613cc86003602061582f565b613cd560208501856154c6565b905014613d435760405162461bcd60e51b81526020600482015260426024820152600080516020615c8983398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a4016106a4565b613d4e81602061582f565b613d5b60608501856154c6565b905014613dce5760405162461bcd60e51b81526020600482015260476024820152600080516020615c8983398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a4016106a4565b600d613ddc60186001614c9f565b613de7906005614c9f565b613df2906001614c9f565b613dfc9190614c9f565b613e0790602061582f565b613e1460808501856154c6565b905014613e9d5760405162461bcd60e51b81526020600482015260586024820152600080516020615c8983398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a4016106a4565b6000613eaf60c0850160a08601615c41565b6001600160401b03166000613ec6600d6001614c9f565b613ed660e0880160c08901615c41565b6001600160401b0316901b600d613eef60186001614c9f565b613efa906001614c9f565b613f049190614c9f565b601b901b1717179050613f5f613f1d60808601866154c6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925050506101008701358461342a565b613fd25760405162461bcd60e51b815260206004820152604a6024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a4016106a4565b614029613fe260208601866154c6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506101008a013593506101208a01359250905061342a565b6140895760405162461bcd60e51b815260206004820152603d6024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f6600000060648201526084016106a4565b60496140e161409b60408701876154c6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101008701356101608801358461342a565b6141535760405162461bcd60e51b81526020600482015260496024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a4016106a4565b506141ab61416460608601866154c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160860135610140870135600961342a565b6142165760405162461bcd60e51b81526020600482015260426024820152600080516020615c8983398151915260448201527f616c3a20496e76616c69642074696d657374616d70206d65726b6c652070726f60648201526137b360f11b608482015260a4016106a4565b6000614229610100860160e08701615c41565b6001600160401b031661423e60046001614c9f565b600e901b179050600061428388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061485b92505050565b90506142d361429287806154c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160880135838561342a565b61433f5760405162461bcd60e51b81526020600482015260436024820152600080516020615c8983398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a4016106a4565b505050505050505050565b6000610d0e826001815181106134935761349361550c565b6000610d0e826003815181106134935761349361550c565b6000602061210c8361012001516147f4565b604080518082019091526000808252602082015260007f00000000000000000000000000000000000000000000000000000000000000006001600160401b0316846001600160401b0316111561440357507f0000000000000000000000000000000000000000000000000000000000000000614406565b50825b604080518082019091526000808252602082015261442482866157e6565b6001600160401b039081168252603480548492600091614446918591166158ba565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555061447882856020015161370f565b602082015260028460600151600281111561449557614495614ec1565b146144b757603980549060006144aa83615c5e565b9091555050600260608501525b600060208086018281528a83526036909152604091829020865181549251938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516929091169190911792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600281111561455c5761455c614ec1565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a26038805483919060009061465b9084906001600160401b03166158ba565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b600083516000141580156146c75750602084516146c591906157be565b155b6147565760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a4016106a4565b604080516020808201909252848152905b855181116147ea5761477a6002856157be565b6147ad578151600052808601516020526020826040600060026107d05a03fa6147a257600080fd5b6002840493506147d8565b8086015160005281516020526020826040600060026107d05a03fa6147d157600080fd5b6002840493505b6147e3602082614c9f565b9050614767565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6000806002835161486c91906157d2565b90506000816001600160401b03811115614888576148886150ce565b6040519080825280602002602001820160405280156148b1578160200160208202803683370190505b50905060005b828110156149b8576002856148cc838361582f565b815181106148dc576148dc61550c565b6020026020010151868360026148f2919061582f565b6148fd906001614c9f565b8151811061490d5761490d61550c565b602002602001015160405160200161492f929190918252602082015260400190565b60408051601f198184030181529082905261494991615938565b602060405180830381855afa158015614966573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061498991906154ad565b82828151811061499b5761499b61550c565b6020908102919091010152806149b081615592565b9150506148b7565b506149c46002836157d2565b91505b8115614ae45760005b82811015614ad1576002826149e5838361582f565b815181106149f5576149f561550c565b602002602001015183836002614a0b919061582f565b614a16906001614c9f565b81518110614a2657614a2661550c565b6020026020010151604051602001614a48929190918252602082015260400190565b60408051601f1981840301815290829052614a6291615938565b602060405180830381855afa158015614a7f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614aa291906154ad565b828281518110614ab457614ab461550c565b602090810291909101015280614ac981615592565b9150506149d0565b50614add6002836157d2565b91506149c7565b80600081518110614af757614af761550c565b602002602001015192505050919050565b6060614b178484600085614b1f565b949350505050565b606082471015614b805760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a4565b6001600160a01b0385163b614bd75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a4565b600080866001600160a01b03168587604051614bf39190615938565b60006040518083038185875af1925050503d8060008114614c30576040519150601f19603f3d011682016040523d82523d6000602084013e614c35565b606091505b5091509150614c45828286614c50565b979650505050505050565b60608315614c5f575081613727565b825115614c6f5782518084602001fd5b8160405162461bcd60e51b81526004016106a49190615c75565b634e487b7160e01b600052601160045260246000fd5b60008219821115614cb257614cb2614c89565b500190565b6001600160401b038116811461202957600080fd5b8035614cd781614cb7565b919050565b60008060408385031215614cef57600080fd5b823591506020830135614d0181614cb7565b809150509250929050565b600060408284031215614d1e57600080fd5b50919050565b60008083601f840112614d3657600080fd5b5081356001600160401b03811115614d4d57600080fd5b6020830191508360208260051b8501011115614d6857600080fd5b9250929050565b60008060008060008060008060a0898b031215614d8b57600080fd5b8835614d9681614cb7565b975060208901356001600160401b0380821115614db257600080fd5b614dbe8c838d01614d0c565b985060408b0135915080821115614dd457600080fd5b614de08c838d01614d24565b909850965060608b0135915080821115614df957600080fd5b614e058c838d01614d24565b909650945060808b0135915080821115614e1e57600080fd5b50614e2b8b828c01614d24565b999c989b5096995094979396929594505050565b60008083601f840112614e5157600080fd5b5081356001600160401b03811115614e6857600080fd5b602083019150836020828501011115614d6857600080fd5b60008060208385031215614e9357600080fd5b82356001600160401b03811115614ea957600080fd5b614eb585828601614e3f565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110614ef557634e487b7160e01b600052602160045260246000fd5b9052565b60208101610d0e8284614ed7565b600060208284031215614f1957600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151614f616060840182614ed7565b5092915050565b600080600080600060608688031215614f8057600080fd5b85356001600160401b0380821115614f9757600080fd5b614fa389838a01614e3f565b90975095506020880135915080821115614fbc57600080fd5b50614fc988828901614e3f565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614ff757600080fd5b883561500281614cb7565b975060208901356001600160401b038082111561501e57600080fd5b61502a8c838d01614d24565b909950975060408b013591508082111561504357600080fd5b61504f8c838d01614d0c565b965060608b0135915080821115614df957600080fd5b6001600160a01b038116811461202957600080fd5b8035614cd781615065565b6000806040838503121561509857600080fd5b82356150a381615065565b946020939093013593505050565b6000602082840312156150c357600080fd5b813561372781615065565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715615107576151076150ce565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615135576151356150ce565b604052919050565b60006001600160401b03821115615156576151566150ce565b5060051b60200190565b600082601f83011261517157600080fd5b813560206151866151818361513d565b61510d565b82815260059290921b840181019181810190868411156151a557600080fd5b8286015b848110156151c057803583529183019183016151a9565b509695505050505050565b6000806000606084860312156151e057600080fd5b83356001600160401b03808211156151f757600080fd5b818601915086601f83011261520b57600080fd5b8135602061521b6151818361513d565b82815260059290921b8401810191818101908a84111561523a57600080fd5b948201945b8386101561526157853561525281615065565b8252948201949082019061523f565b9750508701359250508082111561527757600080fd5b5061528486828701615160565b9250506152936040850161507a565b90509250925092565b60008060008060008060008060008060c08b8d0312156152bb57600080fd5b6152c48b614ccc565b995060208b01356001600160401b03808211156152e057600080fd5b6152ec8e838f01614d0c565b9a5060408d013591508082111561530257600080fd5b61530e8e838f01614d24565b909a50985060608d013591508082111561532757600080fd5b6153338e838f01614d24565b909850965060808d013591508082111561534c57600080fd5b6153588e838f01614d24565b909650945060a08d013591508082111561537157600080fd5b5061537e8d828e01614d24565b915080935050809150509295989b9194979a5092959850565b6000602082840312156153a957600080fd5b8151801515811461372757600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b6000602082840312156154bf57600080fd5b5051919050565b6000808335601e198436030181126154dd57600080fd5b8301803591506001600160401b038211156154f757600080fd5b602001915036819003821315614d6857600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561553457600080fd5b813564ffffffffff8116811461372757600080fd5b6000808335601e1984360301811261556057600080fd5b8301803591506001600160401b0382111561557a57600080fd5b6020019150600581901b3603821315614d6857600080fd5b60006000198214156155a6576155a6614c89565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561564257818101518382015260200161562a565b838111156122eb5750506000910152565b6000815180845261566b816020860160208601615627565b601f01601f19169290920160200192915050565b60808152600061569360808301888a6155fe565b82810360208401526156a58188615653565b905082810360408401526156ba8186886155fe565b915050826060830152979650505050505050565b602081526000614b176020830184866155fe565b600080821280156001600160ff1b038490038513161561570457615704614c89565b600160ff1b839003841281161561571d5761571d614c89565b50500190565b60006001600160ff1b038184138284138082168684048611161561574957615749614c89565b600160ff1b600087128281168783058912161561576857615768614c89565b6000871292508782058712848416161561578457615784614c89565b8785058712818416161561579a5761579a614c89565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b6000826157cd576157cd6157a8565b500690565b6000826157e1576157e16157a8565b500490565b60006001600160401b038381169083168181101561580657615806614c89565b039392505050565b6000823561017e1983360301811261582557600080fd5b9190910192915050565b600081600019048311821515161561584957615849614c89565b500290565b60008282101561586057615860614c89565b500390565b60006001600160401b038083168185168183048111821515161561588b5761588b614c89565b02949350505050565b60006001600160401b03808416806158ae576158ae6157a8565b92169190910492915050565b60006001600160401b038083168185168083038211156158dc576158dc614c89565b01949350505050565b80516020808301519190811015614d1e5760001960209190910360031b1b16919050565b6000835161591b818460208801615627565b6001600160801b0319939093169190920190815260100192915050565b60008251615825818460208701615627565b600082601f83011261595b57600080fd5b81356001600160401b03811115615974576159746150ce565b615987601f8201601f191660200161510d565b81815284602083860101111561599c57600080fd5b816020850160208301376000918101602001919091529392505050565b600061018082360312156159cc57600080fd5b6159d46150e4565b82356001600160401b03808211156159eb57600080fd5b6159f73683870161594a565b83526020850135915080821115615a0d57600080fd5b615a193683870161594a565b60208401526040850135915080821115615a3257600080fd5b615a3e3683870161594a565b60408401526060850135915080821115615a5757600080fd5b615a633683870161594a565b60608401526080850135915080821115615a7c57600080fd5b50615a893682860161594a565b608083015250615a9b60a08401614ccc565b60a0820152615aac60c08401614ccc565b60c0820152615abd60e08401614ccc565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b600060208284031215615b0757600080fd5b815161372781614cb7565b600181815b80851115615b4d578160001904821115615b3357615b33614c89565b80851615615b4057918102915b93841c9390800290615b17565b509250929050565b600082615b6457506001610d0e565b81615b7157506000610d0e565b8160018114615b875760028114615b9157615bad565b6001915050610d0e565b60ff841115615ba257615ba2614c89565b50506001821b610d0e565b5060208310610133831016604e8410600b8410161715615bd0575081810a610d0e565b615bda8383615b12565b8060001904821115615bee57615bee614c89565b029392505050565b60006137278383615b55565b60008083128015600160ff1b850184121615615c2057615c20614c89565b6001600160ff1b0384018313811615615c3b57615c3b614c89565b50500390565b600060208284031215615c5357600080fd5b813561372781614cb7565b600081615c6d57615c6d614c89565b506000190190565b602081526000613727602083018461565356fe426561636f6e436861696e50726f6f66732e7665726966795769746864726177a26469706673582212202cf491430d836cae9ba97e269c22bdbaca25b43574c5f33c7abb74cb222c0c1b64736f6c634300080c0033", + Bin: "0x6101206040523480156200001257600080fd5b5060405162005fc038038062005fc083398101604081905262000035916200016f565b6001600160a01b0380861660805284811660a052831660c0526001600160401b0380831660e0528116610100526200006c62000077565b5050505050620001e7565b600054610100900460ff1615620000e45760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000137576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014f57600080fd5b50565b80516001600160401b03811681146200016a57600080fd5b919050565b600080600080600060a086880312156200018857600080fd5b8551620001958162000139565b6020870151909550620001a88162000139565b6040870151909450620001bb8162000139565b9250620001cb6060870162000152565b9150620001db6080870162000152565b90509295509295909350565b60805160a05160c05160e05161010051615cde620002e2600039600081816105b501528181612030015281816120e7015261213f015260008181610275015281816125d00152818161260401528181612c3001528181612c5d015281816143a401526143df01526000818161036d01528181610614015281816107a701528181610aef01528181610c4401528181610dcc01528181610f87015281816111680152818161129c0152818161146d015281816118ba01528181611a6201528181611ba101528181611d6e01528181611e58015261315401526000818161024101526133c60152600081816104520152610e970152615cde6000f3fe6080604052600436106101855760003560e01c806374cdd798116100d1578063c49074421161008a578063e251ef5211610064578063e251ef5214610563578063e2c8344514610583578063f2882461146105a3578063fe80b087146105d757600080fd5b8063c490744214610503578063c4d66de814610523578063dda3346c1461054357600080fd5b806374cdd7981461044057806387e0d289146104745780639b4e46341461049b578063a50600f4146104ae578063b522538a146104ce578063baa7145a146104ee57600080fd5b806334bea20a1161013e57806358eaee791161011857806358eaee791461038f5780635d3f65b6146103bc5780636fcd0e53146103dc5780637439841f1461040957600080fd5b806334bea20a146103005780633f65cf191461033b5780634665bcda1461035b57600080fd5b80630b18ff66146101db5780630cd4649e146102185780631a5057be1461022f5780631d905d5c146102635780633106ab53146102af5780633474aa16146102e057600080fd5b366101d657346037600082825461019c9190614c9f565b90915550506040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b600080fd5b3480156101e757600080fd5b506033546101fb906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561022457600080fd5b5061022d6105fb565b005b34801561023b57600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160401b03909116815260200161020f565b3480156102bb57600080fd5b506034546102d090600160401b900460ff1681565b604051901515815260200161020f565b3480156102ec57600080fd5b50603454610297906001600160401b031681565b34801561030c57600080fd5b506102d061031b366004614cdc565b603560209081526000928352604080842090915290825290205460ff1681565b34801561034757600080fd5b5061022d610356366004614d6f565b610764565b34801561036757600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561039b57600080fd5b506103af6103aa366004614e80565b610caf565b60405161020f9190614ef9565b3480156103c857600080fd5b50603854610297906001600160401b031681565b3480156103e857600080fd5b506103fc6103f7366004614f07565b610d14565b60405161020f9190614f20565b34801561041557600080fd5b506103af610424366004614f07565b600090815260366020526040902054600160c01b900460ff1690565b34801561044c57600080fd5b506101fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561048057600080fd5b5060335461029790600160a01b90046001600160401b031681565b61022d6104a9366004614f68565b610dc1565b3480156104ba57600080fd5b5061022d6104c9366004614fdb565b610f6e565b3480156104da57600080fd5b506103fc6104e9366004614e80565b611304565b3480156104fa57600080fd5b5061022d6113f7565b34801561050f57600080fd5b5061022d61051e366004615085565b611462565b34801561052f57600080fd5b5061022d61053e3660046150b1565b61169f565b34801561054f57600080fd5b5061022d61055e3660046151cb565b611877565b34801561056f57600080fd5b5061022d61057e36600461529c565b611a4a565b34801561058f57600080fd5b5061022d61059e366004615085565b611e15565b3480156105af57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b3480156105e357600080fd5b506105ed60375481565b60405190815260200161020f565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610663573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106879190615397565b156106ad5760405162461bcd60e51b81526004016106a4906153b9565b60405180910390fd5b6033546001600160a01b031633146106d75760405162461bcd60e51b81526004016106a490615416565b603454600160401b900460ff16156107015760405162461bcd60e51b81526004016106a49061545e565b6034805460ff60401b1916600160401b179055603354610729906001600160a01b0316611ff8565b6033546040516001600160a01b03909116907fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a250565b6033546001600160a01b0316331461078e5760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081a9190615397565b156108375760405162461bcd60e51b81526004016106a4906153b9565b603454600160401b900460ff166108af5760405162461bcd60e51b815260206004820152603660248201527f456967656e506f642e686173456e61626c656452657374616b696e673a2072656044820152751cdd185ada5b99c81a5cc81b9bdd08195b98589b195960521b60648201526084016106a4565b85841480156108bd57508382145b61094d5760405162461bcd60e51b815260206004820152605560248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2076616c696461746f72496e646963657320616e642070726f6f666064820152740e640daeae6e840c4ca40e6c2daca40d8cadccee8d605b1b608482015260a4016106a4565b603354600160a01b90046001600160401b031615806109a2575060335461098c9061098790600160a01b90046001600160401b031661202c565b612116565b6001600160401b0316896001600160401b031610155b610a2e5760405162461bcd60e51b815260206004820152605160248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a2070726f6f66206d75737420626520696e207468652065706f63686064820152701030b33a32b91030b1ba34bb30ba34b7b760791b608482015260a4016106a4565b42610a44613f486001600160401b038c16614c9f565b1015610acd5760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f642e7665726966795769746864726177616c43726564656e7460448201527f69616c733a207370656369666965642074696d657374616d7020697320746f6f60648201526b0819985c881a5b881c185cdd60a21b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a166004820152610b76907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa158015610b3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6291906154ad565b8935610b7160208c018c6154c6565b612163565b6000805b87811015610c1a57610bfc8b8b358b8b85818110610b9a57610b9a61550c565b9050602002016020810190610baf9190615522565b8a8a86818110610bc157610bc161550c565b9050602002810190610bd391906154c6565b8a8a88818110610be557610be561550c565b9050602002810190610bf79190615549565b6122f1565b610c069083614c9f565b915080610c1281615592565b915050610b7a565b5060335460405163030b147160e61b81526001600160a01b039182166004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063c2c51c40906044015b600060405180830381600087803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b5050505050505050505050505050565b600080610cf184848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127ab92505050565b600090815260366020526040902054600160c01b900460ff169150505b92915050565b610d3c6040805160808101825260008082526020820181905291810182905290606082015290565b600082815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff166002811115610da757610da7614ec1565b6002811115610db857610db8614ec1565b90525092915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e095760405162461bcd60e51b81526004016106a4906155ad565b346801bc16d674ec80000014610e955760405162461bcd60e51b8152602060048201526044602482018190527f456967656e506f642e7374616b653a206d75737420696e697469616c6c792073908201527f74616b6520666f7220616e792076616c696461746f72207769746820333220656064820152633a3432b960e11b608482015260a4016106a4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787610ed86128a5565b8888886040518863ffffffff1660e01b8152600401610efc9695949392919061567f565b6000604051808303818588803b158015610f1557600080fd5b505af1158015610f29573d6000803e3d6000fd5b50505050507f606865b7934a25d4aed43f6cdb426403353fa4b3009c4d228407474581b01e238585604051610f5f9291906156ce565b60405180910390a15050505050565b604051635ac86ab760e01b8152600360048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffa9190615397565b156110175760405162461bcd60e51b81526004016106a4906153b9565b868414801561102557508382145b6110ae5760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207660448201527f616c696461746f72496e646963657320616e642070726f6f6673206d7573742060648201526d0c4ca40e6c2daca40d8cadccee8d60931b608482015260a4016106a4565b426110c4613f486001600160401b038c16614c9f565b10156111465760405162461bcd60e51b815260206004820152604560248201527f456967656e506f642e76657269667942616c616e6365557064617465733a207360448201527f70656369666965642074696d657374616d7020697320746f6f2066617220696e606482015264081c185cdd60da1b608482015260a4016106a4565b60405163d1c64cc960e01b81526001600160401b038a1660048201526111ea907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa1580156111b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111db91906154ad565b8735610b7160208a018a6154c6565b6000805b8881101561128e576112708b8b8b8481811061120c5761120c61550c565b90506020020160208101906112219190615522565b8a358a8a868181106112355761123561550c565b905060200281019061124791906154c6565b8a8a888181106112595761125961550c565b905060200281019061126b9190615549565b6128ea565b61127a90836156e2565b91508061128681615592565b9150506111ee565b506033546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163c2c51c4091166112d3633b9aca0085615723565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610c71565b61132c6040805160808101825260008082526020820181905291810182905290606082015290565b6036600061136f85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506127ab92505050565b81526020808201929092526040908101600020815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156113dc576113dc614ec1565b60028111156113ed576113ed614ec1565b9052509392505050565b6033546001600160a01b031633146114215760405162461bcd60e51b81526004016106a490615416565b603454600160401b900460ff161561144b5760405162461bcd60e51b81526004016106a49061545e565b603354611460906001600160a01b0316611ff8565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114aa5760405162461bcd60e51b81526004016106a4906155ad565b6114b8633b9aca00826157be565b156115425760405162461bcd60e51b815260206004820152604e60248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74576569206d75737420626520612077686f60648201526d1b194811ddd95a48185b5bdd5b9d60921b608482015260a4016106a4565b6000611552633b9aca00836157d2565b6034549091506001600160401b03908116908216111561160b5760405162461bcd60e51b815260206004820152606260248201527f456967656e506f642e776974686472617752657374616b6564426561636f6e4360448201527f6861696e4554483a20616d6f756e74477765692065786365656473207769746860648201527f6472617761626c6552657374616b6564457865637574696f6e4c617965724777608482015261656960f01b60a482015260c4016106a4565b603480548291906000906116299084906001600160401b03166157e6565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e8360405161168891815260200190565b60405180910390a261169a8383612dc8565b505050565b600054610100900460ff16158080156116bf5750600054600160ff909116105b806116d95750303b1580156116d9575060005460ff166001145b61173c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106a4565b6000805460ff19166001179055801561175f576000805461ff0019166101001790555b6001600160a01b0382166117d25760405162461bcd60e51b815260206004820152603460248201527f456967656e506f642e696e697469616c697a653a20706f644f776e65722063616044820152736e6e6f74206265207a65726f206164647265737360601b60648201526084016106a4565b603380546001600160a01b0384166001600160a01b031990911681179091556034805460ff60401b1916600160401b1790556040517fca8dfc8c5e0a67a74501c072a3325f685259bebbae7cfd230ab85198a78b70cd90600090a28015611873576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6033546001600160a01b031633146118a15760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192d9190615397565b1561194a5760405162461bcd60e51b81526004016106a4906153b9565b82518451146119d55760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e7265636f766572546f6b656e733a20746f6b656e4c697360448201527f7420616e6420616d6f756e7473546f5769746864726177206d7573742062652060648201526a0e6c2daca40d8cadccee8d60ab1b608482015260a4016106a4565b60005b8451811015611a4357611a31838583815181106119f7576119f761550c565b6020026020010151878481518110611a1157611a1161550c565b60200260200101516001600160a01b0316612dd29092919063ffffffff16565b80611a3b81615592565b9150506119d8565b5050505050565b604051635ac86ab760e01b81526004808201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad59190615397565b15611af25760405162461bcd60e51b81526004016106a4906153b9565b8386148015611b0057508588145b8015611b0b57508782145b611b7f576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f642e766572696679416e6450726f636573735769746864726160448201527f77616c733a20696e70757473206d7573742062652073616d65206c656e67746860648201526084016106a4565b60405163d1c64cc960e01b81526001600160401b038c166004820152611c23907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d1c64cc990602401602060405180830381865afa158015611bf0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1491906154ad565b8b35610b7160208e018e6154c6565b604080518082019091526000808252602082015260005b83811015611d23576000611cde8d358d8d85818110611c5b57611c5b61550c565b9050602002810190611c6d919061580e565b8c8c86818110611c7f57611c7f61550c565b9050602002810190611c9191906154c6565b8c8c88818110611ca357611ca361550c565b9050602002810190611cb59190615549565b8c8c8a818110611cc757611cc761550c565b9050602002810190611cd99190615549565b612e24565b80518451919250908490611cf3908390614c9f565b9052506020808201519084018051611d0c9083906156e2565b905250819050611d1b81615592565b915050611c3a565b50805115611d52576033548151611d52916001600160a01b031690611d4d90633b9aca009061582f565b61339c565b602081015115611e075760335460208201516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263c2c51c4092911690611da890633b9aca0090615723565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611dee57600080fd5b505af1158015611e02573d6000803e3d6000fd5b505050505b505050505050505050505050565b6033546001600160a01b03163314611e3f5760405162461bcd60e51b81526004016106a490615416565b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecb9190615397565b15611ee85760405162461bcd60e51b81526004016106a4906153b9565b603754821115611f995760405162461bcd60e51b815260206004820152606a60248201527f456967656e506f642e77697468647261776e6f6e426561636f6e436861696e4560448201527f544842616c616e63655765693a20616d6f756e74546f5769746864726177206960648201527f732067726561746572207468616e206e6f6e426561636f6e436861696e45544860848201526942616c616e636557656960b01b60a482015260c4016106a4565b8160376000828254611fab919061584e565b90915550506040518281526001600160a01b038416907f30420aacd028abb3c1fd03aba253ae725d6ddd52d16c9ac4cb5742cd43f530969060200160405180910390a261169a838361339c565b6033805467ffffffffffffffff60a01b19164263ffffffff16600160a01b021790556000603755612029814761339c565b50565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160401b0316826001600160401b031610156120d65760405162461bcd60e51b815260206004820152603760248201527f456967656e506f642e5f74696d657374616d70546f45706f63683a2074696d6560448201527f7374616d70206973206265666f72652067656e6573697300000000000000000060648201526084016106a4565b6120e2600c6020615865565b61210c7f0000000000000000000000000000000000000000000000000000000000000000846157e6565b610d0e9190615894565b6000612124600c6020615865565b61212f8360016158ba565b6121399190615865565b610d0e907f00000000000000000000000000000000000000000000000000000000000000006158ba565b61216f6003602061582f565b81146121ff5760405162461bcd60e51b815260206004820152605360248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a2050726f6f6620686064820152720c2e640d2dcc6dee4e4cac6e840d8cadccee8d606b1b608482015260a4016106a4565b61224482828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508892508791506003905061342a565b6122eb5760405162461bcd60e51b815260206004820152606660248201527f426561636f6e436861696e50726f6f66732e7665726966795374617465526f6f60448201527f74416761696e73744c6174657374426c6f636b526f6f743a20496e76616c696460648201527f206c617465737420626c6f636b2068656164657220726f6f74206d65726b6c6560848201526510383937b7b360d11b60a482015260c4016106a4565b50505050565b60008061233084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561239f5761239f614ec1565b60028111156123b0576123b0614ec1565b90525090506000816060015160028111156123cd576123cd614ec1565b146124765760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2056616c696461746f72206d757374206265206960648201527f6e61637469766520746f2070726f7665207769746864726177616c2063726564608482015266656e7469616c7360c81b60a482015260c4016106a4565b61247e6128a5565b612487906158e5565b6124c386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061346692505050565b1461254a5760405162461bcd60e51b815260206004820152604b60248201527f456967656e506f642e766572696679436f72726563745769746864726177616c60448201527f43726564656e7469616c733a2050726f6f66206973206e6f7420666f7220746860648201526a1a5cc8115a59d95b941bd960aa1b608482015260a4016106a4565b600061258886868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061347b92505050565b90506125988a87878b8b8e6134a0565b603980549060006125a883615592565b90915550506001606083015264ffffffffff891682526001600160401b038b811660408401527f00000000000000000000000000000000000000000000000000000000000000008116908216111561262e576001600160401b037f000000000000000000000000000000000000000000000000000000000000000016602083015261263e565b6001600160401b03811660208301525b6000838152603660209081526040918290208451815492860151938601516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060850151859391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360028111156126dc576126dc614ec1565b02179055505060405164ffffffffff8b1681527f2d0800bbc377ea54a08c5db6a87aafff5e3e9c8fead0eda110e40e0c10441449915060200160405180910390a17f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df898c84602001516040516127779392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1633b9aca0082602001516001600160401b031661279c919061582f565b9b9a5050505050505050505050565b600081516030146128345760405162461bcd60e51b815260206004820152604760248201527f456967656e506f642e5f63616c63756c61746556616c696461746f725075626b60448201527f657948617368206d75737420626520612034382d6279746520424c53207075626064820152666c6963206b657960c81b608482015260a4016106a4565b60405160029061284b908490600090602001615909565b60408051601f198184030181529082905261286591615938565b602060405180830381855afa158015612882573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190610d0e91906154ad565b60408051600160f81b60208201526000602182015230606090811b6bffffffffffffffffffffffff1916602c8301529101604051602081830303815290604052905090565b60008061292984848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061347b92505050565b9050600061296985858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b6000818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156129d8576129d8614ec1565b60028111156129e9576129e9614ec1565b8152505090508a6001600160401b031681604001516001600160401b031610612aa05760405162461bcd60e51b815260206004820152605c60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20566160448201527f6c696461746f72732062616c616e63652068617320616c72656164792062656560648201527f6e207570646174656420666f7220746869732074696d657374616d7000000000608482015260a4016106a4565b600181606001516002811115612ab857612ab8614ec1565b14612b205760405162461bcd60e51b815260206004820152603260248201527f456967656e506f642e76657269667942616c616e63655570646174653a2056616044820152716c696461746f72206e6f742061637469766560701b60648201526084016106a4565b612b298b61202c565b6001600160401b0316612b6e8787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136f792505050565b6001600160401b031611612c11576000836001600160401b031611612c115760405162461bcd60e51b815260206004820152604d60248201527f456967656e506f642e76657269667942616c616e63655570646174653a20766160448201527f6c696461746f7220697320776974686472617761626c6520627574206861732060648201526c3737ba103bb4ba34323930bbb760991b608482015260a4016106a4565b612c1f8987878b8b8f6134a0565b602081015160006001600160401b037f000000000000000000000000000000000000000000000000000000000000000081169086161115612c8157507f0000000000000000000000000000000000000000000000000000000000000000612c84565b50835b6001600160401b0380821660208086019182528f831660408088019182526000898152603690935290912086518154935192518516600160801b0267ffffffffffffffff60801b19938616600160401b026001600160801b031990951691909516179290921790811683178255606086015186939091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836002811115612d2c57612d2c614ec1565b0217905550905050816001600160401b0316816001600160401b031614612db8577f0e5fac175b83177cc047381e030d8fb3b42b37bd1c025e22c280facad62c32df8c8e83604051612da39392919064ffffffffff9390931683526001600160401b03918216602084015216604082015260600190565b60405180910390a1612db5818361370f565b95505b5050505050979650505050505050565b611873828261372e565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261169a908490613847565b6040805180820190915260008082526020820152612e49612e44896159b9565b613919565b6033546001600160401b03600160a01b90910481169082161015612f0b5760405162461bcd60e51b815260206004820152606760248201527f456967656e506f642e70726f6f664973466f7256616c696454696d657374616d60448201527f703a20626561636f6e20636861696e2070726f6f66206d75737420626520617460648201527f206f72206166746572206d6f7374526563656e745769746864726177616c546960848201526606d657374616d760cc1b60a482015260c4016106a4565b6000612f19612e448b6159b9565b90506000612f5988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061344292505050565b905060008082815260366020526040902054600160c01b900460ff166002811115612f8657612f86614ec1565b141561303d5760405162461bcd60e51b815260206004820152607460248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a2056616c696461746f72206e657665722070726f76656e20746f2060648201527f68617665207769746864726177616c2063726564656e7469616c7320706f696e6084820152731d1959081d1bc81d1a1a5cc818dbdb9d1c9858dd60621b60a482015260c4016106a4565b60008181526035602090815260408083206001600160401b038616845290915290205460ff16156130fc5760405162461bcd60e51b815260206004820152605b60248201527f456967656e506f642e5f766572696679416e6450726f6365737357697468647260448201527f6177616c3a207769746864726177616c2068617320616c72656164792062656560648201527f6e2070726f76656e20666f7220746869732074696d657374616d700000000000608482015260a4016106a4565b6001603560008381526020019081526020016000206000846001600160401b03166001600160401b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506131d98c87878e7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166344e71c806040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131d49190615af5565b613929565b600061321787878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061434a92505050565b90506132278d8a8a8e8e866134a0565b600061326588888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061436292505050565b90506132a38a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506136f792505050565b6001600160401b03166132bd6132b88f6159b9565b61437a565b6001600160401b03161061337557603354600084815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b81049093169381019390935261336a93869388938a936001600160a01b03909316928892916060830190600160c01b900460ff16600281111561335157613351614ec1565b600281111561336257613362614ec1565b90525061438c565b95505050505061338f565b60335461336a90839086906001600160a01b0316846145ca565b5098975050505050505050565b603354604051633036cd5360e21b81526001600160a01b03918216600482015283821660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063c0db354c9083906044016000604051808303818588803b15801561340d57600080fd5b505af1158015613421573d6000803e3d6000fd5b50505050505050565b6000836134388685856146a8565b1495945050505050565b6000816000815181106134575761345761550c565b60200260200101519050919050565b6000816001815181106134575761345761550c565b6000610d0e826002815181106134935761349361550c565b60200260200101516147f4565b6134ac60036002615bf6565b84146135375760405162461bcd60e51b815260206004820152604e60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2056616c696461746f72206669656c64732068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b600561354560286001614c9f565b61354f9190614c9f565b61355a90602061582f565b82146135da5760405162461bcd60e51b815260206004820152604360248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a2050726f6f662068617320696e636f7272656374206c656e6064820152620cee8d60eb1b608482015260a4016106a4565b600064ffffffffff82166135f060286001614c9f565b600b901b179050600061363587878080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061485b92505050565b905061367b85858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c925085915086905061342a565b6136ed5760405162461bcd60e51b815260206004820152603d60248201527f426561636f6e436861696e50726f6f66732e76657269667956616c696461746f60448201527f724669656c64733a20496e76616c6964206d65726b6c652070726f6f6600000060648201526084016106a4565b5050505050505050565b6000610d0e826007815181106134935761349361550c565b60006137276001600160401b03808416908516615c02565b9392505050565b8047101561377e5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016106a4565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146137cb576040519150601f19603f3d011682016040523d82523d6000602084013e6137d0565b606091505b505090508061169a5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016106a4565b600061389c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614b089092919063ffffffff16565b80519091501561169a57808060200190518101906138ba9190615397565b61169a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016106a4565b6000610d0e8261014001516147f4565b613934600280615bf6565b83146139a85760405162461bcd60e51b81526020600482015260496024820152600080516020615c8983398151915260448201527f616c3a207769746864726177616c4669656c64732068617320696e636f7272656064820152680c6e840d8cadccee8d60bb1b608482015260a4016106a4565b6139b4600d6002615bf6565b6139c460c0840160a08501615c41565b6001600160401b031610613a2e5760405162461bcd60e51b815260206004820152603f6024820152600080516020615c8983398151915260448201527f616c3a20626c6f636b526f6f74496e64657820697320746f6f206c617267650060648201526084016106a4565b613a3a60046002615bf6565b613a4b610100840160e08501615c41565b6001600160401b031610613ab7576040805162461bcd60e51b8152602060048201526024810191909152600080516020615c8983398151915260448201527f616c3a207769746864726177616c496e64657820697320746f6f206c6172676560648201526084016106a4565b613ac360186002615bf6565b613ad360e0840160c08501615c41565b6001600160401b031610613b4d5760405162461bcd60e51b81526020600482015260476024820152600080516020615c8983398151915260448201527f616c3a20686973746f726963616c53756d6d617279496e64657820697320746f6064820152666f206c6172676560c81b608482015260a4016106a4565b60006001600160401b038216613b65612e44856159b9565b6001600160401b031610613b7a576005613b7d565b60045b9050613b8a600482614c9f565b613b95906001614c9f565b613ba090602061582f565b613baa84806154c6565b905014613c1e5760405162461bcd60e51b81526020600482015260486024820152600080516020615c8983398151915260448201527f616c3a207769746864726177616c50726f6f662068617320696e636f727265636064820152670e840d8cadccee8d60c31b608482015260a4016106a4565b613c2a60046003614c9f565b613c3590602061582f565b613c4260408501856154c6565b905014613cbc5760405162461bcd60e51b815260206004820152604e6024820152600080516020615c8983398151915260448201527f616c3a20657865637574696f6e5061796c6f616450726f6f662068617320696e60648201526d0c6dee4e4cac6e840d8cadccee8d60931b608482015260a4016106a4565b613cc86003602061582f565b613cd560208501856154c6565b905014613d435760405162461bcd60e51b81526020600482015260426024820152600080516020615c8983398151915260448201527f616c3a20736c6f7450726f6f662068617320696e636f7272656374206c656e676064820152610e8d60f31b608482015260a4016106a4565b613d4e81602061582f565b613d5b60608501856154c6565b905014613dce5760405162461bcd60e51b81526020600482015260476024820152600080516020615c8983398151915260448201527f616c3a2074696d657374616d7050726f6f662068617320696e636f7272656374606482015266040d8cadccee8d60cb1b608482015260a4016106a4565b600d613ddc60186001614c9f565b613de7906005614c9f565b613df2906001614c9f565b613dfc9190614c9f565b613e0790602061582f565b613e1460808501856154c6565b905014613e9d5760405162461bcd60e51b81526020600482015260586024820152600080516020615c8983398151915260448201527f616c3a20686973746f726963616c53756d6d617279426c6f636b526f6f74507260648201527f6f6f662068617320696e636f7272656374206c656e6774680000000000000000608482015260a4016106a4565b6000613eaf60c0850160a08601615c41565b6001600160401b03166000613ec6600d6001614c9f565b613ed660e0880160c08901615c41565b6001600160401b0316901b600d613eef60186001614c9f565b613efa906001614c9f565b613f049190614c9f565b601b901b1717179050613f5f613f1d60808601866154c6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b925050506101008701358461342a565b613fd25760405162461bcd60e51b815260206004820152604a6024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420686973746f726963616c73756d6d617279206d656064820152693935b63290383937b7b360b11b608482015260a4016106a4565b614029613fe260208601866154c6565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052506101008a013593506101208a01359250905061342a565b6140895760405162461bcd60e51b815260206004820152603d6024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420736c6f74206d65726b6c652070726f6f6600000060648201526084016106a4565b60496140e161409b60408701876154c6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050506101008701356101608801358461342a565b6141535760405162461bcd60e51b81526020600482015260496024820152600080516020615c8983398151915260448201527f616c3a20496e76616c696420657865637574696f6e5061796c6f6164206d657260648201526835b63290383937b7b360b91b608482015260a4016106a4565b506141ab61416460608601866154c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160860135610140870135600961342a565b6142165760405162461bcd60e51b81526020600482015260426024820152600080516020615c8983398151915260448201527f616c3a20496e76616c69642074696d657374616d70206d65726b6c652070726f60648201526137b360f11b608482015260a4016106a4565b6000614229610100860160e08701615c41565b6001600160401b031661423e60046001614c9f565b600e901b179050600061428388888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061485b92505050565b90506142d361429287806154c6565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505050610160880135838561342a565b61433f5760405162461bcd60e51b81526020600482015260436024820152600080516020615c8983398151915260448201527f616c3a20496e76616c6964207769746864726177616c206d65726b6c6520707260648201526237b7b360e91b608482015260a4016106a4565b505050505050505050565b6000610d0e826001815181106134935761349361550c565b6000610d0e826003815181106134935761349361550c565b6000602061210c8361012001516147f4565b604080518082019091526000808252602082015260007f00000000000000000000000000000000000000000000000000000000000000006001600160401b0316846001600160401b0316111561440357507f0000000000000000000000000000000000000000000000000000000000000000614406565b50825b604080518082019091526000808252602082015261442482866157e6565b6001600160401b039081168252603480548492600091614446918591166158ba565b92506101000a8154816001600160401b0302191690836001600160401b0316021790555061447882856020015161370f565b602082015260028460600151600281111561449557614495614ec1565b146144b757603980549060006144aa83615c5e565b9091555050600260608501525b600060208086018281528a83526036909152604091829020865181549251938801516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516929091169190911792909217928316821781556060870151879391929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600281111561455c5761455c614ec1565b0217905550506040805164ffffffffff8c1681526001600160401b038a8116602083015288168183015290516001600160a01b03891692507fb76a93bb649ece524688f1a01d184e0bbebcda58eae80c28a898bec3fb5a09639181900360600190a298975050505050505050565b60408051808201909152600080825260208201526040805164ffffffffff871681526001600160401b0380871660208301528416918101919091526001600160a01b038416907f8a7335714231dbd551aaba6314f4a97a14c201e53a3e25e1140325cdf67d7a4e9060600160405180910390a26038805483919060009061465b9084906001600160401b03166158ba565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506040518060400160405280836001600160401b0316815260200160008152509050949350505050565b600083516000141580156146c75750602084516146c591906157be565b155b6147565760405162461bcd60e51b815260206004820152605460248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f665368613260448201527f35363a2070726f6f66206c656e6774682073686f756c642062652061206e6f6e60648201527316bd32b9379036bab63a34b836329037b310199960611b608482015260a4016106a4565b604080516020808201909252848152905b855181116147ea5761477a6002856157be565b6147ad578151600052808601516020526020826040600060026107d05a03fa6147a257600080fd5b6002840493506147d8565b8086015160005281516020526020826040600060026107d05a03fa6147d157600080fd5b6002840493505b6147e3602082614c9f565b9050614767565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b6000806002835161486c91906157d2565b90506000816001600160401b03811115614888576148886150ce565b6040519080825280602002602001820160405280156148b1578160200160208202803683370190505b50905060005b828110156149b8576002856148cc838361582f565b815181106148dc576148dc61550c565b6020026020010151868360026148f2919061582f565b6148fd906001614c9f565b8151811061490d5761490d61550c565b602002602001015160405160200161492f929190918252602082015260400190565b60408051601f198184030181529082905261494991615938565b602060405180830381855afa158015614966573d6000803e3d6000fd5b5050506040513d601f19601f8201168201806040525081019061498991906154ad565b82828151811061499b5761499b61550c565b6020908102919091010152806149b081615592565b9150506148b7565b506149c46002836157d2565b91505b8115614ae45760005b82811015614ad1576002826149e5838361582f565b815181106149f5576149f561550c565b602002602001015183836002614a0b919061582f565b614a16906001614c9f565b81518110614a2657614a2661550c565b6020026020010151604051602001614a48929190918252602082015260400190565b60408051601f1981840301815290829052614a6291615938565b602060405180830381855afa158015614a7f573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190614aa291906154ad565b828281518110614ab457614ab461550c565b602090810291909101015280614ac981615592565b9150506149d0565b50614add6002836157d2565b91506149c7565b80600081518110614af757614af761550c565b602002602001015192505050919050565b6060614b178484600085614b1f565b949350505050565b606082471015614b805760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016106a4565b6001600160a01b0385163b614bd75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106a4565b600080866001600160a01b03168587604051614bf39190615938565b60006040518083038185875af1925050503d8060008114614c30576040519150601f19603f3d011682016040523d82523d6000602084013e614c35565b606091505b5091509150614c45828286614c50565b979650505050505050565b60608315614c5f575081613727565b825115614c6f5782518084602001fd5b8160405162461bcd60e51b81526004016106a49190615c75565b634e487b7160e01b600052601160045260246000fd5b60008219821115614cb257614cb2614c89565b500190565b6001600160401b038116811461202957600080fd5b8035614cd781614cb7565b919050565b60008060408385031215614cef57600080fd5b823591506020830135614d0181614cb7565b809150509250929050565b600060408284031215614d1e57600080fd5b50919050565b60008083601f840112614d3657600080fd5b5081356001600160401b03811115614d4d57600080fd5b6020830191508360208260051b8501011115614d6857600080fd5b9250929050565b60008060008060008060008060a0898b031215614d8b57600080fd5b8835614d9681614cb7565b975060208901356001600160401b0380821115614db257600080fd5b614dbe8c838d01614d0c565b985060408b0135915080821115614dd457600080fd5b614de08c838d01614d24565b909850965060608b0135915080821115614df957600080fd5b614e058c838d01614d24565b909650945060808b0135915080821115614e1e57600080fd5b50614e2b8b828c01614d24565b999c989b5096995094979396929594505050565b60008083601f840112614e5157600080fd5b5081356001600160401b03811115614e6857600080fd5b602083019150836020828501011115614d6857600080fd5b60008060208385031215614e9357600080fd5b82356001600160401b03811115614ea957600080fd5b614eb585828601614e3f565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60038110614ef557634e487b7160e01b600052602160045260246000fd5b9052565b60208101610d0e8284614ed7565b600060208284031215614f1957600080fd5b5035919050565b60006080820190506001600160401b03808451168352806020850151166020840152806040850151166040840152506060830151614f616060840182614ed7565b5092915050565b600080600080600060608688031215614f8057600080fd5b85356001600160401b0380821115614f9757600080fd5b614fa389838a01614e3f565b90975095506020880135915080821115614fbc57600080fd5b50614fc988828901614e3f565b96999598509660400135949350505050565b60008060008060008060008060a0898b031215614ff757600080fd5b883561500281614cb7565b975060208901356001600160401b038082111561501e57600080fd5b61502a8c838d01614d24565b909950975060408b013591508082111561504357600080fd5b61504f8c838d01614d0c565b965060608b0135915080821115614df957600080fd5b6001600160a01b038116811461202957600080fd5b8035614cd781615065565b6000806040838503121561509857600080fd5b82356150a381615065565b946020939093013593505050565b6000602082840312156150c357600080fd5b813561372781615065565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b0381118282101715615107576151076150ce565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615135576151356150ce565b604052919050565b60006001600160401b03821115615156576151566150ce565b5060051b60200190565b600082601f83011261517157600080fd5b813560206151866151818361513d565b61510d565b82815260059290921b840181019181810190868411156151a557600080fd5b8286015b848110156151c057803583529183019183016151a9565b509695505050505050565b6000806000606084860312156151e057600080fd5b83356001600160401b03808211156151f757600080fd5b818601915086601f83011261520b57600080fd5b8135602061521b6151818361513d565b82815260059290921b8401810191818101908a84111561523a57600080fd5b948201945b8386101561526157853561525281615065565b8252948201949082019061523f565b9750508701359250508082111561527757600080fd5b5061528486828701615160565b9250506152936040850161507a565b90509250925092565b60008060008060008060008060008060c08b8d0312156152bb57600080fd5b6152c48b614ccc565b995060208b01356001600160401b03808211156152e057600080fd5b6152ec8e838f01614d0c565b9a5060408d013591508082111561530257600080fd5b61530e8e838f01614d24565b909a50985060608d013591508082111561532757600080fd5b6153338e838f01614d24565b909850965060808d013591508082111561534c57600080fd5b6153588e838f01614d24565b909650945060a08d013591508082111561537157600080fd5b5061537e8d828e01614d24565b915080935050809150509295989b9194979a5092959850565b6000602082840312156153a957600080fd5b8151801515811461372757600080fd5b6020808252603e908201527f456967656e506f642e6f6e6c795768656e4e6f745061757365643a20696e646560408201527f782069732070617573656420696e20456967656e506f644d616e616765720000606082015260800190565b60208082526028908201527f456967656e506f642e6f6e6c79456967656e506f644f776e65723a206e6f74206040820152673837b227bbb732b960c11b606082015260800190565b6020808252602f908201527f456967656e506f642e6861734e6576657252657374616b65643a20726573746160408201526e1ada5b99c81a5cc8195b98589b1959608a1b606082015260800190565b6000602082840312156154bf57600080fd5b5051919050565b6000808335601e198436030181126154dd57600080fd5b8301803591506001600160401b038211156154f757600080fd5b602001915036819003821315614d6857600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561553457600080fd5b813564ffffffffff8116811461372757600080fd5b6000808335601e1984360301811261556057600080fd5b8301803591506001600160401b0382111561557a57600080fd5b6020019150600581901b3603821315614d6857600080fd5b60006000198214156155a6576155a6614c89565b5060010190565b60208082526031908201527f456967656e506f642e6f6e6c79456967656e506f644d616e616765723a206e6f6040820152703a1032b4b3b2b72837b226b0b730b3b2b960791b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b8381101561564257818101518382015260200161562a565b838111156122eb5750506000910152565b6000815180845261566b816020860160208601615627565b601f01601f19169290920160200192915050565b60808152600061569360808301888a6155fe565b82810360208401526156a58188615653565b905082810360408401526156ba8186886155fe565b915050826060830152979650505050505050565b602081526000614b176020830184866155fe565b600080821280156001600160ff1b038490038513161561570457615704614c89565b600160ff1b839003841281161561571d5761571d614c89565b50500190565b60006001600160ff1b038184138284138082168684048611161561574957615749614c89565b600160ff1b600087128281168783058912161561576857615768614c89565b6000871292508782058712848416161561578457615784614c89565b8785058712818416161561579a5761579a614c89565b505050929093029392505050565b634e487b7160e01b600052601260045260246000fd5b6000826157cd576157cd6157a8565b500690565b6000826157e1576157e16157a8565b500490565b60006001600160401b038381169083168181101561580657615806614c89565b039392505050565b6000823561017e1983360301811261582557600080fd5b9190910192915050565b600081600019048311821515161561584957615849614c89565b500290565b60008282101561586057615860614c89565b500390565b60006001600160401b038083168185168183048111821515161561588b5761588b614c89565b02949350505050565b60006001600160401b03808416806158ae576158ae6157a8565b92169190910492915050565b60006001600160401b038083168185168083038211156158dc576158dc614c89565b01949350505050565b80516020808301519190811015614d1e5760001960209190910360031b1b16919050565b6000835161591b818460208801615627565b6001600160801b0319939093169190920190815260100192915050565b60008251615825818460208701615627565b600082601f83011261595b57600080fd5b81356001600160401b03811115615974576159746150ce565b615987601f8201601f191660200161510d565b81815284602083860101111561599c57600080fd5b816020850160208301376000918101602001919091529392505050565b600061018082360312156159cc57600080fd5b6159d46150e4565b82356001600160401b03808211156159eb57600080fd5b6159f73683870161594a565b83526020850135915080821115615a0d57600080fd5b615a193683870161594a565b60208401526040850135915080821115615a3257600080fd5b615a3e3683870161594a565b60408401526060850135915080821115615a5757600080fd5b615a633683870161594a565b60608401526080850135915080821115615a7c57600080fd5b50615a893682860161594a565b608083015250615a9b60a08401614ccc565b60a0820152615aac60c08401614ccc565b60c0820152615abd60e08401614ccc565b60e082015261010083810135908201526101208084013590820152610140808401359082015261016092830135928101929092525090565b600060208284031215615b0757600080fd5b815161372781614cb7565b600181815b80851115615b4d578160001904821115615b3357615b33614c89565b80851615615b4057918102915b93841c9390800290615b17565b509250929050565b600082615b6457506001610d0e565b81615b7157506000610d0e565b8160018114615b875760028114615b9157615bad565b6001915050610d0e565b60ff841115615ba257615ba2614c89565b50506001821b610d0e565b5060208310610133831016604e8410600b8410161715615bd0575081810a610d0e565b615bda8383615b12565b8060001904821115615bee57615bee614c89565b029392505050565b60006137278383615b55565b60008083128015600160ff1b850184121615615c2057615c20614c89565b6001600160ff1b0384018313811615615c3b57615c3b614c89565b50500390565b600060208284031215615c5357600080fd5b813561372781614cb7565b600081615c6d57615c6d614c89565b506000190190565b602081526000613727602083018461565356fe426561636f6e436861696e50726f6f66732e7665726966795769746864726177a2646970667358221220e5f0580eaf920c7bb34bd03d57402971f7a2c3f15a9ab7d5abe6370698a66e8964736f6c634300080c0033", } // EigenPodABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenPodManager/binding.go b/pkg/bindings/EigenPodManager/binding.go index ffa57eda7..a47a9bfde 100644 --- a/pkg/bindings/EigenPodManager/binding.go +++ b/pkg/bindings/EigenPodManager/binding.go @@ -32,11 +32,7 @@ var ( // EigenPodManagerMetaData contains all meta data concerning the EigenPodManager contract. var EigenPodManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodBeacon\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"},{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainOracle\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createPod\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"denebForkTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodBeacon\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIBeacon\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ethPOS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBlockRootAtTimestamp\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"hasPod\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_beaconChainOracle\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_initPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"numPods\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ownerToPod\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPod\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwnerShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recordBeaconChainETHBalanceUpdate\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"internalType\":\"int256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setDenebForkTimestamp\",\"inputs\":[{\"name\":\"newDenebForkTimestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stake\",\"inputs\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"depositDataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateBeaconChainOracle\",\"inputs\":[{\"name\":\"newBeaconChainOracle\",\"type\":\"address\",\"internalType\":\"contractIBeaconChainOracle\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"destination\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BeaconChainETHDeposited\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconChainETHWithdrawalCompleted\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint96\",\"indexed\":false,\"internalType\":\"uint96\"},{\"name\":\"delegatedAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawer\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"withdrawalRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BeaconOracleUpdated\",\"inputs\":[{\"name\":\"newOracleAddress\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DenebForkTimestampUpdated\",\"inputs\":[{\"name\":\"newValue\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodDeployed\",\"inputs\":[{\"name\":\"eigenPod\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PodSharesUpdated\",\"inputs\":[{\"name\":\"podOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sharesDelta\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", -<<<<<<< HEAD - Bin: "0x6101206040523480156200001257600080fd5b50604051620034e7380380620034e783398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e051610100516132a66200024160003960008181610636015281816106e001528181610b0e015281816113e70152818161187c015261196c01526000610542015260006102e601526000818161027a01528181611366015261203a0152600061041401526132a66000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063c052bd61116100a0578063d1c64cc91161006f578063d1c64cc914610604578063ea4d3c9b14610624578063f2fde38b14610658578063f6848d2414610678578063fabc1cbc146106b357600080fd5b8063c052bd6114610584578063c1de3aef146105a4578063c2c51c40146105c4578063cf756fdf146105e457600080fd5b8063a38406a3116100dc578063a38406a3146104fa578063a6a509be1461051a578063b134427114610530578063beffbb891461056457600080fd5b80638da5cb5b1461046b5780639104c319146104895780639b4e4634146104b15780639ba06275146104c457600080fd5b8063595c6a6711610185578063715018a611610154578063715018a6146103ed57806374cdd7981461040257806384d8106214610436578063886f11951461044b57600080fd5b8063595c6a67146103565780635ac86ab71461036b5780635c975abb146103ab57806360f4062b146103c057600080fd5b8063387b1300116101c1578063387b1300146102b457806339b70e38146102d457806344e71c8014610308578063463db0381461033657600080fd5b80630e81073c146101f357806310d67a2f14610226578063136439dd14610248578063292b7b2b14610268575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612406565b6106d3565b6040519081526020015b60405180910390f35b34801561023257600080fd5b50610246610241366004612432565b610911565b005b34801561025457600080fd5b5061024661026336600461244f565b6109c4565b34801561027457600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161021d565b3480156102c057600080fd5b506102466102cf366004612468565b610b03565b3480156102e057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031457600080fd5b5061031d610ea1565b60405167ffffffffffffffff909116815260200161021d565b34801561034257600080fd5b506102466103513660046124a9565b610eca565b34801561036257600080fd5b50610246611056565b34801561037757600080fd5b5061039b6103863660046124d3565b606654600160ff9092169190911b9081161490565b604051901515815260200161021d565b3480156103b757600080fd5b50606654610213565b3480156103cc57600080fd5b506102136103db366004612432565b609b6020526000908152604090205481565b3480156103f957600080fd5b5061024661111d565b34801561040e57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561044257600080fd5b5061029c611131565b34801561045757600080fd5b5060655461029c906001600160a01b031681565b34801561047757600080fd5b506033546001600160a01b031661029c565b34801561049557600080fd5b5061029c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102466104bf36600461253f565b61121b565b3480156104d057600080fd5b5061029c6104df366004612432565b6098602052600090815260409020546001600160a01b031681565b34801561050657600080fd5b5061029c610515366004612432565b61130a565b34801561052657600080fd5b5061021360995481565b34801561053c57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561057057600080fd5b5061024661057f366004612406565b6113dc565b34801561059057600080fd5b5060975461029c906001600160a01b031681565b3480156105b057600080fd5b506102466105bf366004612432565b6115f3565b3480156105d057600080fd5b506102466105df366004612406565b611604565b3480156105f057600080fd5b506102466105ff3660046125b3565b611a07565b34801561061057600080fd5b5061021361061f3660046124a9565b611b30565b34801561063057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066457600080fd5b50610246610673366004612432565b611c3b565b34801561068457600080fd5b5061039b610693366004612432565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156106bf57600080fd5b506102466106ce36600461244f565b611cb1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107265760405162461bcd60e51b815260040161071d90612604565b60405180910390fd5b6001600160a01b0383166107a25760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f2061646472657373000000000000606482015260840161071d565b60008212156108105760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b606482015260840161071d565b61081e633b9aca0083612678565b156108915760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e74000000606482015260840161071d565b6001600160a01b0383166000908152609b6020526040812054906108b584836126a2565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020613231833981519152906108f49087815260200190565b60405180910390a26109068282611e0d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610964573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098891906126e3565b6001600160a01b0316336001600160a01b0316146109b85760405162461bcd60e51b815260040161071d90612700565b6109c181611e4f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a30919061274a565b610a4c5760405162461bcd60e51b815260040161071d9061276c565b60665481811614610ac55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b4b5760405162461bcd60e51b815260040161071d90612604565b6001600160a01b038316610bc55760405162461bcd60e51b8152602060048201526047602482015260008051602061325183398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a40161071d565b6001600160a01b038216610c425760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a40161071d565b6000811215610cb15760405162461bcd60e51b8152602060048201526041602482015260008051602061325183398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a40161071d565b610cbf633b9aca0082612678565b15610d335760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a40161071d565b6001600160a01b0383166000908152609b602052604081205490811215610e26576000610d5f826127b4565b905080831115610dc4576001600160a01b0385166000908152609b6020526040812055610d8c81846127d1565b9250846001600160a01b031660008051602061323183398151915282604051610db791815260200190565b60405180910390a2610e24565b6001600160a01b0385166000908152609b602052604081208054859290610dec9084906126a2565b90915550506040518381526001600160a01b038616906000805160206132318339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b5050505050505050565b609c5460009067ffffffffffffffff1680610ec55767ffffffffffffffff91505090565b919050565b610ed2611f46565b67ffffffffffffffff8116610f645760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f7420736574206e657744656e6562466f726b546960648201526b06d657374616d7020746f20360a41b608482015260a40161071d565b609c5467ffffffffffffffff16156110005760405162461bcd60e51b815260206004820152605360248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f74207365742064656e6562466f726b54696d657360648201527274616d70206d6f7265207468616e206f6e636560681b608482015260a40161071d565b609c805467ffffffffffffffff191667ffffffffffffffff83169081179091556040519081527f19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db9060200160405180910390a150565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561109e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c2919061274a565b6110de5760405162461bcd60e51b815260040161071d9061276c565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b611125611f46565b61112f6000611fa0565b565b6066546000908190600190811614156111885760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03161561120a5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b606482015260840161071d565b6000611214611ff2565b9250505090565b606654600090600190811614156112705760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03168061129957611296611ff2565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906112cf908b908b908b908b908b90600401612811565b6000604051808303818588803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061090b576113d5836001600160a01b031660001b60405180610940016040528061090e815260200161292361090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f19818403018152908290526113ba9291602001612886565b60405160208183030381529060405280519060200120612157565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114245760405162461bcd60e51b815260040161071d90612604565b600081121561149b5760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e65676174697665000000000000000000606482015260840161071d565b6114a9633b9aca0082612678565b1561151e576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e74606482015260840161071d565b6001600160a01b0382166000908152609b602052604081205461154290839061289b565b905060008112156115d35760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a40161071d565b6001600160a01b039092166000908152609b602052604090209190915550565b6115fb611f46565b6109c1816121b3565b6001600160a01b03808316600090815260986020526040902054839116331461167f5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b606482015260840161071d565b600260c95414156116d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b600260c9556001600160a01b03831661176e5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a40161071d565b61177c633b9aca00836128da565b156118155760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a40161071d565b6001600160a01b0383166000908152609b60205260408120549061183984836126a2565b6001600160a01b0386166000908152609b602052604081208290559091506118618383611e0d565b905080156119c957600081121561192c576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06118c0856127b4565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506119c9565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020613231833981519152866040516119f291815260200190565b60405180910390a25050600160c95550505050565b600054610100900460ff1615808015611a275750600054600160ff909116105b80611a415750303b158015611a41575060005460ff166001145b611aa45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071d565b6000805460ff191660011790558015611ac7576000805461ff0019166101001790555b611ad0856121b3565b611ad984611fa0565b611ae383836121fd565b8015611b29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa158015611b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bab91906128ee565b90508061090b5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a40161071d565b611c43611f46565b6001600160a01b038116611ca85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161071d565b6109c181611fa0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2891906126e3565b6001600160a01b0316336001600160a01b031614611d585760405162461bcd60e51b815260040161071d90612700565b606654198119606654191614611dd65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610af8565b6000808313611e2d5760008213611e265750600061090b565b508061090b565b60008213611e4557611e3e836127b4565b905061090b565b611e3e838361289b565b6001600160a01b038116611edd5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161071d565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461112f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060996000815461200390612907565b9091555060408051610940810190915261090e8082526000916120a291839133916129236020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261208e9291602001612886565b6040516020818303038152906040526122e7565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b1580156120e657600080fd5b505af11580156120fa573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b16602183015260358201859052605580830185905283518084039091018152607590920190925280519101206000906113d5565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561221e57506001600160a01b03821615155b6122a05760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26122e382611e4f565b5050565b6000808447101561233a5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161071d565b82516123885760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161071d565b8383516020850187f590506001600160a01b0381166123e95760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161071d565b949350505050565b6001600160a01b03811681146109c157600080fd5b6000806040838503121561241957600080fd5b8235612424816123f1565b946020939093013593505050565b60006020828403121561244457600080fd5b81356113d5816123f1565b60006020828403121561246157600080fd5b5035919050565b60008060006060848603121561247d57600080fd5b8335612488816123f1565b92506020840135612498816123f1565b929592945050506040919091013590565b6000602082840312156124bb57600080fd5b813567ffffffffffffffff811681146113d557600080fd5b6000602082840312156124e557600080fd5b813560ff811681146113d557600080fd5b60008083601f84011261250857600080fd5b50813567ffffffffffffffff81111561252057600080fd5b60208301915083602082850101111561253857600080fd5b9250929050565b60008060008060006060868803121561255757600080fd5b853567ffffffffffffffff8082111561256f57600080fd5b61257b89838a016124f6565b9097509550602088013591508082111561259457600080fd5b506125a1888289016124f6565b96999598509660400135949350505050565b600080600080608085870312156125c957600080fd5b84356125d4816123f1565b935060208501356125e4816123f1565b925060408501356125f4816123f1565b9396929550929360600135925050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261268757612687612662565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156126c4576126c461268c565b600160ff1b83900384128116156126dd576126dd61268c565b50500190565b6000602082840312156126f557600080fd5b81516113d5816123f1565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561275c57600080fd5b815180151581146113d557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156127ca576127ca61268c565b5060000390565b6000828210156127e3576127e361268c565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006128256060830187896127e8565b82810360208401526128388186886127e8565b9150508260408301529695505050505050565b6000815160005b8181101561286c5760208185018101518683015201612852565b8181111561287b576000828601525b509290920192915050565b60006123e9612895838661284b565b8461284b565b60008083128015600160ff1b8501841216156128b9576128b961268c565b6001600160ff1b03840183138116156128d4576128d461268c565b50500390565b6000826128e9576128e9612662565b500790565b60006020828403121561290057600080fd5b5051919050565b600060001982141561291b5761291b61268c565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a264697066735822122004788f8dd07899132ea5c1e14eaf911cee4bc9c2c0086e0b752d9b98d2a1d56864736f6c634300080c0033", -======= - Bin: "0x6101206040523480156200001257600080fd5b50604051620034e7380380620034e783398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e051610100516132a66200024160003960008181610636015281816106e001528181610b0e015281816113e70152818161187c015261196c01526000610542015260006102e601526000818161027a01528181611366015261203a0152600061041401526132a66000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063c052bd61116100a0578063d1c64cc91161006f578063d1c64cc914610604578063ea4d3c9b14610624578063f2fde38b14610658578063f6848d2414610678578063fabc1cbc146106b357600080fd5b8063c052bd6114610584578063c1de3aef146105a4578063c2c51c40146105c4578063cf756fdf146105e457600080fd5b8063a38406a3116100dc578063a38406a3146104fa578063a6a509be1461051a578063b134427114610530578063beffbb891461056457600080fd5b80638da5cb5b1461046b5780639104c319146104895780639b4e4634146104b15780639ba06275146104c457600080fd5b8063595c6a6711610185578063715018a611610154578063715018a6146103ed57806374cdd7981461040257806384d8106214610436578063886f11951461044b57600080fd5b8063595c6a67146103565780635ac86ab71461036b5780635c975abb146103ab57806360f4062b146103c057600080fd5b8063387b1300116101c1578063387b1300146102b457806339b70e38146102d457806344e71c8014610308578063463db0381461033657600080fd5b80630e81073c146101f357806310d67a2f14610226578063136439dd14610248578063292b7b2b14610268575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612406565b6106d3565b6040519081526020015b60405180910390f35b34801561023257600080fd5b50610246610241366004612432565b610911565b005b34801561025457600080fd5b5061024661026336600461244f565b6109c4565b34801561027457600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161021d565b3480156102c057600080fd5b506102466102cf366004612468565b610b03565b3480156102e057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031457600080fd5b5061031d610ea1565b60405167ffffffffffffffff909116815260200161021d565b34801561034257600080fd5b506102466103513660046124a9565b610eca565b34801561036257600080fd5b50610246611056565b34801561037757600080fd5b5061039b6103863660046124d3565b606654600160ff9092169190911b9081161490565b604051901515815260200161021d565b3480156103b757600080fd5b50606654610213565b3480156103cc57600080fd5b506102136103db366004612432565b609b6020526000908152604090205481565b3480156103f957600080fd5b5061024661111d565b34801561040e57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561044257600080fd5b5061029c611131565b34801561045757600080fd5b5060655461029c906001600160a01b031681565b34801561047757600080fd5b506033546001600160a01b031661029c565b34801561049557600080fd5b5061029c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102466104bf36600461253f565b61121b565b3480156104d057600080fd5b5061029c6104df366004612432565b6098602052600090815260409020546001600160a01b031681565b34801561050657600080fd5b5061029c610515366004612432565b61130a565b34801561052657600080fd5b5061021360995481565b34801561053c57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561057057600080fd5b5061024661057f366004612406565b6113dc565b34801561059057600080fd5b5060975461029c906001600160a01b031681565b3480156105b057600080fd5b506102466105bf366004612432565b6115f3565b3480156105d057600080fd5b506102466105df366004612406565b611604565b3480156105f057600080fd5b506102466105ff3660046125b3565b611a07565b34801561061057600080fd5b5061021361061f3660046124a9565b611b30565b34801561063057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066457600080fd5b50610246610673366004612432565b611c3b565b34801561068457600080fd5b5061039b610693366004612432565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156106bf57600080fd5b506102466106ce36600461244f565b611cb1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107265760405162461bcd60e51b815260040161071d90612604565b60405180910390fd5b6001600160a01b0383166107a25760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f2061646472657373000000000000606482015260840161071d565b60008212156108105760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b606482015260840161071d565b61081e633b9aca0083612678565b156108915760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e74000000606482015260840161071d565b6001600160a01b0383166000908152609b6020526040812054906108b584836126a2565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020613231833981519152906108f49087815260200190565b60405180910390a26109068282611e0d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610964573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098891906126e3565b6001600160a01b0316336001600160a01b0316146109b85760405162461bcd60e51b815260040161071d90612700565b6109c181611e4f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a30919061274a565b610a4c5760405162461bcd60e51b815260040161071d9061276c565b60665481811614610ac55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b4b5760405162461bcd60e51b815260040161071d90612604565b6001600160a01b038316610bc55760405162461bcd60e51b8152602060048201526047602482015260008051602061325183398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a40161071d565b6001600160a01b038216610c425760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a40161071d565b6000811215610cb15760405162461bcd60e51b8152602060048201526041602482015260008051602061325183398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a40161071d565b610cbf633b9aca0082612678565b15610d335760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a40161071d565b6001600160a01b0383166000908152609b602052604081205490811215610e26576000610d5f826127b4565b905080831115610dc4576001600160a01b0385166000908152609b6020526040812055610d8c81846127d1565b9250846001600160a01b031660008051602061323183398151915282604051610db791815260200190565b60405180910390a2610e24565b6001600160a01b0385166000908152609b602052604081208054859290610dec9084906126a2565b90915550506040518381526001600160a01b038616906000805160206132318339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b5050505050505050565b609c5460009067ffffffffffffffff1680610ec55767ffffffffffffffff91505090565b919050565b610ed2611f46565b67ffffffffffffffff8116610f645760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f7420736574206e657744656e6562466f726b546960648201526b06d657374616d7020746f20360a41b608482015260a40161071d565b609c5467ffffffffffffffff16156110005760405162461bcd60e51b815260206004820152605360248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f74207365742064656e6562466f726b54696d657360648201527274616d70206d6f7265207468616e206f6e636560681b608482015260a40161071d565b609c805467ffffffffffffffff191667ffffffffffffffff83169081179091556040519081527f19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db9060200160405180910390a150565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561109e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c2919061274a565b6110de5760405162461bcd60e51b815260040161071d9061276c565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b611125611f46565b61112f6000611fa0565b565b6066546000908190600190811614156111885760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03161561120a5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b606482015260840161071d565b6000611214611ff2565b9250505090565b606654600090600190811614156112705760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03168061129957611296611ff2565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906112cf908b908b908b908b908b90600401612811565b6000604051808303818588803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061090b576113d5836001600160a01b031660001b60405180610940016040528061090e815260200161292361090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f19818403018152908290526113ba9291602001612886565b60405160208183030381529060405280519060200120612157565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114245760405162461bcd60e51b815260040161071d90612604565b600081121561149b5760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e65676174697665000000000000000000606482015260840161071d565b6114a9633b9aca0082612678565b1561151e576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e74606482015260840161071d565b6001600160a01b0382166000908152609b602052604081205461154290839061289b565b905060008112156115d35760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a40161071d565b6001600160a01b039092166000908152609b602052604090209190915550565b6115fb611f46565b6109c1816121b3565b6001600160a01b03808316600090815260986020526040902054839116331461167f5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b606482015260840161071d565b600260c95414156116d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b600260c9556001600160a01b03831661176e5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a40161071d565b61177c633b9aca00836128da565b156118155760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a40161071d565b6001600160a01b0383166000908152609b60205260408120549061183984836126a2565b6001600160a01b0386166000908152609b602052604081208290559091506118618383611e0d565b905080156119c957600081121561192c576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06118c0856127b4565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506119c9565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020613231833981519152866040516119f291815260200190565b60405180910390a25050600160c95550505050565b600054610100900460ff1615808015611a275750600054600160ff909116105b80611a415750303b158015611a41575060005460ff166001145b611aa45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071d565b6000805460ff191660011790558015611ac7576000805461ff0019166101001790555b611ad0856121b3565b611ad984611fa0565b611ae383836121fd565b8015611b29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa158015611b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bab91906128ee565b90508061090b5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a40161071d565b611c43611f46565b6001600160a01b038116611ca85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161071d565b6109c181611fa0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2891906126e3565b6001600160a01b0316336001600160a01b031614611d585760405162461bcd60e51b815260040161071d90612700565b606654198119606654191614611dd65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610af8565b6000808313611e2d5760008213611e265750600061090b565b508061090b565b60008213611e4557611e3e836127b4565b905061090b565b611e3e838361289b565b6001600160a01b038116611edd5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161071d565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461112f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060996000815461200390612907565b9091555060408051610940810190915261090e8082526000916120a291839133916129236020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261208e9291602001612886565b6040516020818303038152906040526122e7565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b1580156120e657600080fd5b505af11580156120fa573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b16602183015260358201859052605580830185905283518084039091018152607590920190925280519101206000906113d5565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561221e57506001600160a01b03821615155b6122a05760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26122e382611e4f565b5050565b6000808447101561233a5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161071d565b82516123885760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161071d565b8383516020850187f590506001600160a01b0381166123e95760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161071d565b949350505050565b6001600160a01b03811681146109c157600080fd5b6000806040838503121561241957600080fd5b8235612424816123f1565b946020939093013593505050565b60006020828403121561244457600080fd5b81356113d5816123f1565b60006020828403121561246157600080fd5b5035919050565b60008060006060848603121561247d57600080fd5b8335612488816123f1565b92506020840135612498816123f1565b929592945050506040919091013590565b6000602082840312156124bb57600080fd5b813567ffffffffffffffff811681146113d557600080fd5b6000602082840312156124e557600080fd5b813560ff811681146113d557600080fd5b60008083601f84011261250857600080fd5b50813567ffffffffffffffff81111561252057600080fd5b60208301915083602082850101111561253857600080fd5b9250929050565b60008060008060006060868803121561255757600080fd5b853567ffffffffffffffff8082111561256f57600080fd5b61257b89838a016124f6565b9097509550602088013591508082111561259457600080fd5b506125a1888289016124f6565b96999598509660400135949350505050565b600080600080608085870312156125c957600080fd5b84356125d4816123f1565b935060208501356125e4816123f1565b925060408501356125f4816123f1565b9396929550929360600135925050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261268757612687612662565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156126c4576126c461268c565b600160ff1b83900384128116156126dd576126dd61268c565b50500190565b6000602082840312156126f557600080fd5b81516113d5816123f1565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561275c57600080fd5b815180151581146113d557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156127ca576127ca61268c565b5060000390565b6000828210156127e3576127e361268c565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006128256060830187896127e8565b82810360208401526128388186886127e8565b9150508260408301529695505050505050565b6000815160005b8181101561286c5760208185018101518683015201612852565b8181111561287b576000828601525b509290920192915050565b60006123e9612895838661284b565b8461284b565b60008083128015600160ff1b8501841216156128b9576128b961268c565b6001600160ff1b03840183138116156128d4576128d461268c565b50500390565b6000826128e9576128e9612662565b500790565b60006020828403121561290057600080fd5b5051919050565b600060001982141561291b5761291b61268c565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a264697066735822122004d8740e0cf9e5496208917d8d4cc564f420a5881e787d21f37ecebe90895cee64736f6c634300080c0033", ->>>>>>> 500e0254 (feat: operator commission bips (#627)) + Bin: "0x6101206040523480156200001257600080fd5b50604051620034e7380380620034e783398101604081905262000035916200014b565b6001600160a01b0380861660805280851660a05280841660c05280831660e0528116610100526200006562000070565b5050505050620001cb565b600054610100900460ff1615620000dd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000130576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200014857600080fd5b50565b600080600080600060a086880312156200016457600080fd5b8551620001718162000132565b6020870151909550620001848162000132565b6040870151909450620001978162000132565b6060870151909350620001aa8162000132565b6080870151909250620001bd8162000132565b809150509295509295909350565b60805160a05160c05160e051610100516132a66200024160003960008181610636015281816106e001528181610b0e015281816113e70152818161187c015261196c01526000610542015260006102e601526000818161027a01528181611366015261203a0152600061041401526132a66000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063c052bd61116100a0578063d1c64cc91161006f578063d1c64cc914610604578063ea4d3c9b14610624578063f2fde38b14610658578063f6848d2414610678578063fabc1cbc146106b357600080fd5b8063c052bd6114610584578063c1de3aef146105a4578063c2c51c40146105c4578063cf756fdf146105e457600080fd5b8063a38406a3116100dc578063a38406a3146104fa578063a6a509be1461051a578063b134427114610530578063beffbb891461056457600080fd5b80638da5cb5b1461046b5780639104c319146104895780639b4e4634146104b15780639ba06275146104c457600080fd5b8063595c6a6711610185578063715018a611610154578063715018a6146103ed57806374cdd7981461040257806384d8106214610436578063886f11951461044b57600080fd5b8063595c6a67146103565780635ac86ab71461036b5780635c975abb146103ab57806360f4062b146103c057600080fd5b8063387b1300116101c1578063387b1300146102b457806339b70e38146102d457806344e71c8014610308578063463db0381461033657600080fd5b80630e81073c146101f357806310d67a2f14610226578063136439dd14610248578063292b7b2b14610268575b600080fd5b3480156101ff57600080fd5b5061021361020e366004612406565b6106d3565b6040519081526020015b60405180910390f35b34801561023257600080fd5b50610246610241366004612432565b610911565b005b34801561025457600080fd5b5061024661026336600461244f565b6109c4565b34801561027457600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161021d565b3480156102c057600080fd5b506102466102cf366004612468565b610b03565b3480156102e057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561031457600080fd5b5061031d610ea1565b60405167ffffffffffffffff909116815260200161021d565b34801561034257600080fd5b506102466103513660046124a9565b610eca565b34801561036257600080fd5b50610246611056565b34801561037757600080fd5b5061039b6103863660046124d3565b606654600160ff9092169190911b9081161490565b604051901515815260200161021d565b3480156103b757600080fd5b50606654610213565b3480156103cc57600080fd5b506102136103db366004612432565b609b6020526000908152604090205481565b3480156103f957600080fd5b5061024661111d565b34801561040e57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561044257600080fd5b5061029c611131565b34801561045757600080fd5b5060655461029c906001600160a01b031681565b34801561047757600080fd5b506033546001600160a01b031661029c565b34801561049557600080fd5b5061029c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b6102466104bf36600461253f565b61121b565b3480156104d057600080fd5b5061029c6104df366004612432565b6098602052600090815260409020546001600160a01b031681565b34801561050657600080fd5b5061029c610515366004612432565b61130a565b34801561052657600080fd5b5061021360995481565b34801561053c57600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561057057600080fd5b5061024661057f366004612406565b6113dc565b34801561059057600080fd5b5060975461029c906001600160a01b031681565b3480156105b057600080fd5b506102466105bf366004612432565b6115f3565b3480156105d057600080fd5b506102466105df366004612406565b611604565b3480156105f057600080fd5b506102466105ff3660046125b3565b611a07565b34801561061057600080fd5b5061021361061f3660046124a9565b611b30565b34801561063057600080fd5b5061029c7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066457600080fd5b50610246610673366004612432565b611c3b565b34801561068457600080fd5b5061039b610693366004612432565b6001600160a01b0390811660009081526098602052604090205416151590565b3480156106bf57600080fd5b506102466106ce36600461244f565b611cb1565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107265760405162461bcd60e51b815260040161071d90612604565b60405180910390fd5b6001600160a01b0383166107a25760405162461bcd60e51b815260206004820152603a60248201527f456967656e506f644d616e616765722e6164645368617265733a20706f644f7760448201527f6e65722063616e6e6f74206265207a65726f2061646472657373000000000000606482015260840161071d565b60008212156108105760405162461bcd60e51b815260206004820152603460248201527f456967656e506f644d616e616765722e6164645368617265733a207368617265604482015273732063616e6e6f74206265206e6567617469766560601b606482015260840161071d565b61081e633b9aca0083612678565b156108915760405162461bcd60e51b815260206004820152603d60248201527f456967656e506f644d616e616765722e6164645368617265733a20736861726560448201527f73206d75737420626520612077686f6c65204777656920616d6f756e74000000606482015260840161071d565b6001600160a01b0383166000908152609b6020526040812054906108b584836126a2565b6001600160a01b0386166000818152609b6020526040908190208390555191925090600080516020613231833981519152906108f49087815260200190565b60405180910390a26109068282611e0d565b925050505b92915050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610964573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098891906126e3565b6001600160a01b0316336001600160a01b0316146109b85760405162461bcd60e51b815260040161071d90612700565b6109c181611e4f565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a30919061274a565b610a4c5760405162461bcd60e51b815260040161071d9061276c565b60665481811614610ac55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b4b5760405162461bcd60e51b815260040161071d90612604565b6001600160a01b038316610bc55760405162461bcd60e51b8152602060048201526047602482015260008051602061325183398151915260448201527f546f6b656e733a20706f644f776e65722063616e6e6f74206265207a65726f206064820152666164647265737360c81b608482015260a40161071d565b6001600160a01b038216610c425760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a2064657374696e6174696f6e2063616e6e6f74206265207a65606482015269726f206164647265737360b01b608482015260a40161071d565b6000811215610cb15760405162461bcd60e51b8152602060048201526041602482015260008051602061325183398151915260448201527f546f6b656e733a207368617265732063616e6e6f74206265206e6567617469766064820152606560f81b608482015260a40161071d565b610cbf633b9aca0082612678565b15610d335760405162461bcd60e51b815260206004820152604a602482015260008051602061325183398151915260448201527f546f6b656e733a20736861726573206d75737420626520612077686f6c6520476064820152691dd95a48185b5bdd5b9d60b21b608482015260a40161071d565b6001600160a01b0383166000908152609b602052604081205490811215610e26576000610d5f826127b4565b905080831115610dc4576001600160a01b0385166000908152609b6020526040812055610d8c81846127d1565b9250846001600160a01b031660008051602061323183398151915282604051610db791815260200190565b60405180910390a2610e24565b6001600160a01b0385166000908152609b602052604081208054859290610dec9084906126a2565b90915550506040518381526001600160a01b038616906000805160206132318339815191529060200160405180910390a25050505050565b505b6001600160a01b03848116600090815260986020526040908190205490516362483a2160e11b815285831660048201526024810185905291169063c490744290604401600060405180830381600087803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b5050505050505050565b609c5460009067ffffffffffffffff1680610ec55767ffffffffffffffff91505090565b919050565b610ed2611f46565b67ffffffffffffffff8116610f645760405162461bcd60e51b815260206004820152604c60248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f7420736574206e657744656e6562466f726b546960648201526b06d657374616d7020746f20360a41b608482015260a40161071d565b609c5467ffffffffffffffff16156110005760405162461bcd60e51b815260206004820152605360248201527f456967656e506f644d616e616765722e73657444656e6562466f726b54696d6560448201527f7374616d703a2063616e6e6f74207365742064656e6562466f726b54696d657360648201527274616d70206d6f7265207468616e206f6e636560681b608482015260a40161071d565b609c805467ffffffffffffffff191667ffffffffffffffff83169081179091556040519081527f19200b6fdad58f91b2f496b0c444fc4be3eff74a7e24b07770e04a7137bfd9db9060200160405180910390a150565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa15801561109e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c2919061274a565b6110de5760405162461bcd60e51b815260040161071d9061276c565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b611125611f46565b61112f6000611fa0565b565b6066546000908190600190811614156111885760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03161561120a5760405162461bcd60e51b815260206004820152603360248201527f456967656e506f644d616e616765722e637265617465506f643a2053656e64656044820152721c88185b1c9958591e481a185cc818481c1bd9606a1b606482015260840161071d565b6000611214611ff2565b9250505090565b606654600090600190811614156112705760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b604482015260640161071d565b336000908152609860205260409020546001600160a01b03168061129957611296611ff2565b90505b6040516326d3918d60e21b81526001600160a01b03821690639b4e46349034906112cf908b908b908b908b908b90600401612811565b6000604051808303818588803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b505050505050505050505050565b6001600160a01b038082166000908152609860205260408120549091168061090b576113d5836001600160a01b031660001b60405180610940016040528061090e815260200161292361090e9139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f19818403018152908290526113ba9291602001612886565b60405160208183030381529060405280519060200120612157565b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114245760405162461bcd60e51b815260040161071d90612604565b600081121561149b5760405162461bcd60e51b815260206004820152603760248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f617265732063616e6e6f74206265206e65676174697665000000000000000000606482015260840161071d565b6114a9633b9aca0082612678565b1561151e576040805162461bcd60e51b81526020600482015260248101919091527f456967656e506f644d616e616765722e72656d6f76655368617265733a20736860448201527f61726573206d75737420626520612077686f6c65204777656920616d6f756e74606482015260840161071d565b6001600160a01b0382166000908152609b602052604081205461154290839061289b565b905060008112156115d35760405162461bcd60e51b815260206004820152604f60248201527f456967656e506f644d616e616765722e72656d6f76655368617265733a20636160448201527f6e6e6f7420726573756c7420696e20706f64206f776e657220686176696e672060648201526e6e656761746976652073686172657360881b608482015260a40161071d565b6001600160a01b039092166000908152609b602052604090209190915550565b6115fb611f46565b6109c1816121b3565b6001600160a01b03808316600090815260986020526040902054839116331461167f5760405162461bcd60e51b815260206004820152602760248201527f456967656e506f644d616e616765722e6f6e6c79456967656e506f643a206e6f6044820152661d0818481c1bd960ca1b606482015260840161071d565b600260c95414156116d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161071d565b600260c9556001600160a01b03831661176e5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a20706f644f776e65722063616e6e6064820152716f74206265207a65726f206164647265737360701b608482015260a40161071d565b61177c633b9aca00836128da565b156118155760405162461bcd60e51b815260206004820152605a60248201527f456967656e506f644d616e616765722e7265636f7264426561636f6e4368616960448201527f6e45544842616c616e63655570646174653a2073686172657344656c7461206d60648201527f75737420626520612077686f6c65204777656920616d6f756e74000000000000608482015260a40161071d565b6001600160a01b0383166000908152609b60205260408120549061183984836126a2565b6001600160a01b0386166000908152609b602052604081208290559091506118618383611e0d565b905080156119c957600081121561192c576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663132d49678773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06118c0856127b4565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506119c9565b604051631452b9d760e11b81526001600160a01b03878116600483015273beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac06024830152604482018390527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b1580156119b057600080fd5b505af11580156119c4573d6000803e3d6000fd5b505050505b856001600160a01b0316600080516020613231833981519152866040516119f291815260200190565b60405180910390a25050600160c95550505050565b600054610100900460ff1615808015611a275750600054600160ff909116105b80611a415750303b158015611a41575060005460ff166001145b611aa45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161071d565b6000805460ff191660011790558015611ac7576000805461ff0019166101001790555b611ad0856121b3565b611ad984611fa0565b611ae383836121fd565b8015611b29576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60975460405163321accf960e11b815267ffffffffffffffff8316600482015260009182916001600160a01b039091169063643599f290602401602060405180830381865afa158015611b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bab91906128ee565b90508061090b5760405162461bcd60e51b815260206004820152605260248201527f456967656e506f644d616e616765722e676574426c6f636b526f6f744174546960448201527f6d657374616d703a20737461746520726f6f742061742074696d657374616d70606482015271081b9bdd081e595d08199a5b985b1a5e995960721b608482015260a40161071d565b611c43611f46565b6001600160a01b038116611ca85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161071d565b6109c181611fa0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d2891906126e3565b6001600160a01b0316336001600160a01b031614611d585760405162461bcd60e51b815260040161071d90612700565b606654198119606654191614611dd65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c6974790000000000000000606482015260840161071d565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610af8565b6000808313611e2d5760008213611e265750600061090b565b508061090b565b60008213611e4557611e3e836127b4565b905061090b565b611e3e838361289b565b6001600160a01b038116611edd5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a40161071d565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b0316331461112f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161071d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060996000815461200390612907565b9091555060408051610940810190915261090e8082526000916120a291839133916129236020830139604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166020820152808201919091526000606082015260800160408051601f198184030181529082905261208e9291602001612886565b6040516020818303038152906040526122e7565b60405163189acdbd60e31b81523360048201529091506001600160a01b0382169063c4d66de890602401600060405180830381600087803b1580156120e657600080fd5b505af11580156120fa573d6000803e3d6000fd5b50503360008181526098602052604080822080546001600160a01b0319166001600160a01b038816908117909155905192945092507f21c99d0db02213c32fff5b05cf0a718ab5f858802b91498f80d82270289d856a91a3919050565b604080516001600160f81b03196020808301919091526bffffffffffffffffffffffff193060601b16602183015260358201859052605580830185905283518084039091018152607590920190925280519101206000906113d5565b609780546001600160a01b0319166001600160a01b0383169081179091556040517f08f0470754946ccfbb446ff7fd2d6ae6af1bbdae19f85794c0cc5ed5e8ceb4f690600090a250565b6065546001600160a01b031615801561221e57506001600160a01b03821615155b6122a05760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a40161071d565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26122e382611e4f565b5050565b6000808447101561233a5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161071d565b82516123885760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161071d565b8383516020850187f590506001600160a01b0381166123e95760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161071d565b949350505050565b6001600160a01b03811681146109c157600080fd5b6000806040838503121561241957600080fd5b8235612424816123f1565b946020939093013593505050565b60006020828403121561244457600080fd5b81356113d5816123f1565b60006020828403121561246157600080fd5b5035919050565b60008060006060848603121561247d57600080fd5b8335612488816123f1565b92506020840135612498816123f1565b929592945050506040919091013590565b6000602082840312156124bb57600080fd5b813567ffffffffffffffff811681146113d557600080fd5b6000602082840312156124e557600080fd5b813560ff811681146113d557600080fd5b60008083601f84011261250857600080fd5b50813567ffffffffffffffff81111561252057600080fd5b60208301915083602082850101111561253857600080fd5b9250929050565b60008060008060006060868803121561255757600080fd5b853567ffffffffffffffff8082111561256f57600080fd5b61257b89838a016124f6565b9097509550602088013591508082111561259457600080fd5b506125a1888289016124f6565b96999598509660400135949350505050565b600080600080608085870312156125c957600080fd5b84356125d4816123f1565b935060208501356125e4816123f1565b925060408501356125f4816123f1565b9396929550929360600135925050565b602080825260409082018190527f456967656e506f644d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261268757612687612662565b500690565b634e487b7160e01b600052601160045260246000fd5b600080821280156001600160ff1b03849003851316156126c4576126c461268c565b600160ff1b83900384128116156126dd576126dd61268c565b50500190565b6000602082840312156126f557600080fd5b81516113d5816123f1565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561275c57600080fd5b815180151581146113d557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b6000600160ff1b8214156127ca576127ca61268c565b5060000390565b6000828210156127e3576127e361268c565b500390565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6060815260006128256060830187896127e8565b82810360208401526128388186886127e8565b9150508260408301529695505050505050565b6000815160005b8181101561286c5760208185018101518683015201612852565b8181111561287b576000828601525b509290920192915050565b60006123e9612895838661284b565b8461284b565b60008083128015600160ff1b8501841216156128b9576128b961268c565b6001600160ff1b03840183138116156128d4576128d461268c565b50500390565b6000826128e9576128e9612662565b500790565b60006020828403121561290057600080fd5b5051919050565b600060001982141561291b5761291b61268c565b506001019056fe608060405260405161090e38038061090e83398101604081905261002291610460565b61002e82826000610035565b505061058a565b61003e83610100565b6040516001600160a01b038416907f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e90600090a260008251118061007f5750805b156100fb576100f9836001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e99190610520565b836102a360201b6100291760201c565b505b505050565b610113816102cf60201b6100551760201c565b6101725760405162461bcd60e51b815260206004820152602560248201527f455243313936373a206e657720626561636f6e206973206e6f74206120636f6e6044820152641d1c9858dd60da1b60648201526084015b60405180910390fd5b6101e6816001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156101b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d79190610520565b6102cf60201b6100551760201c565b61024b5760405162461bcd60e51b815260206004820152603060248201527f455243313936373a20626561636f6e20696d706c656d656e746174696f6e206960448201526f1cc81b9bdd08184818dbdb9d1c9858dd60821b6064820152608401610169565b806102827fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5060001b6102de60201b6100641760201c565b80546001600160a01b0319166001600160a01b039290921691909117905550565b60606102c883836040518060600160405280602781526020016108e7602791396102e1565b9392505050565b6001600160a01b03163b151590565b90565b6060600080856001600160a01b0316856040516102fe919061053b565b600060405180830381855af49150503d8060008114610339576040519150601f19603f3d011682016040523d82523d6000602084013e61033e565b606091505b5090925090506103508683838761035a565b9695505050505050565b606083156103c65782516103bf576001600160a01b0385163b6103bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610169565b50816103d0565b6103d083836103d8565b949350505050565b8151156103e85781518083602001fd5b8060405162461bcd60e51b81526004016101699190610557565b80516001600160a01b038116811461041957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561044f578181015183820152602001610437565b838111156100f95750506000910152565b6000806040838503121561047357600080fd5b61047c83610402565b60208401519092506001600160401b038082111561049957600080fd5b818501915085601f8301126104ad57600080fd5b8151818111156104bf576104bf61041e565b604051601f8201601f19908116603f011681019083821181831017156104e7576104e761041e565b8160405282815288602084870101111561050057600080fd5b610511836020830160208801610434565b80955050505050509250929050565b60006020828403121561053257600080fd5b6102c882610402565b6000825161054d818460208701610434565b9190910192915050565b6020815260008251806020840152610576816040850160208701610434565b601f01601f19169190910160400192915050565b61034e806105996000396000f3fe60806040523661001357610011610017565b005b6100115b610027610022610067565b610100565b565b606061004e83836040518060600160405280602781526020016102f260279139610124565b9392505050565b6001600160a01b03163b151590565b90565b600061009a7fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50546001600160a01b031690565b6001600160a01b0316635c60da1b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100fb9190610249565b905090565b3660008037600080366000845af43d6000803e80801561011f573d6000f35b3d6000fd5b6060600080856001600160a01b03168560405161014191906102a2565b600060405180830381855af49150503d806000811461017c576040519150601f19603f3d011682016040523d82523d6000602084013e610181565b606091505b50915091506101928683838761019c565b9695505050505050565b6060831561020d578251610206576001600160a01b0385163b6102065760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064015b60405180910390fd5b5081610217565b610217838361021f565b949350505050565b81511561022f5781518083602001fd5b8060405162461bcd60e51b81526004016101fd91906102be565b60006020828403121561025b57600080fd5b81516001600160a01b038116811461004e57600080fd5b60005b8381101561028d578181015183820152602001610275565b8381111561029c576000848401525b50505050565b600082516102b4818460208701610272565b9190910192915050565b60208152600082518060208401526102dd816040850160208701610272565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d51e81d3bc5ed20a26aeb05dce7e825c503b2061aa78628027300c8d65b9d89a64736f6c634300080c0033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65644e2b791dedccd9fb30141b088cabf5c14a8912b52f59375c95c010700b8c6193456967656e506f644d616e616765722e77697468647261775368617265734173a2646970667358221220d1f3688b081185c96ff7d36a8f30a0ef4e07222eb5857817eb587e38c09f275864736f6c634300080c0033", } // EigenPodManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenStrategy/binding.go b/pkg/bindings/EigenStrategy/binding.go index 9eed05ef5..f3cd14664 100644 --- a/pkg/bindings/EigenStrategy/binding.go +++ b/pkg/bindings/EigenStrategy/binding.go @@ -31,8 +31,8 @@ var ( // EigenStrategyMetaData contains all meta data concerning the EigenStrategy contract. var EigenStrategyMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001bd238038062001bd2833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611a5962000179600039600081816101af015281816105ac01528181610a340152610aff0152611a596000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b610165610160366004611653565b61034c565b005b610165610175366004611670565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611689565b61054c565b6101656102093660046116b5565b6106f0565b6101da61021c366004611653565b6107be565b6101656107d2565b6102486102373660046116ee565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e366004611670565b61089e565b60005461018d906201000090046001600160a01b031681565b6101da61029a366004611670565b6108e9565b6101da6102ad366004611653565b6108f4565b6102ba610902565b6040516101a1919061173d565b6101656102d5366004611770565b610922565b6101da6102e8366004611653565b610a0c565b6101656102fb3660046117bb565b610aa1565b6101da61030e366004611670565b610c6a565b6101da610321366004611670565b610ca3565b610165610334366004611670565b610cae565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906117fc565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f390611819565b60405180910390fd5b61040581610e0a565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611863565b6104955760405162461bcd60e51b81526004016103f390611885565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610f0f565b60335460006106346103e8836118e3565b905060006103e8610643611023565b61064d91906118e3565b9050600061065b87836118fb565b9050806106688489611912565b6106729190611931565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e286856118e3565b603355505050505092915050565b600054610100900460ff16158080156107105750600054600160ff909116105b8061072a5750303b15801561072a575060005460ff166001145b6107465760405162461bcd60e51b81526004016103f390611953565b6000805460ff191660011790558015610769576000805461ff0019166101001790555b6107738383611095565b80156107b9576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107cc61026e83610a0c565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561081f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108439190611863565b61085f5760405162461bcd60e51b81526004016103f390611885565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108b191906118e3565b905060006103e86108c0611023565b6108ca91906118e3565b9050816108d78583611912565b6108e19190611931565b949350505050565b60006107cc82610c6a565b60006107cc61032183610a0c565b60606040518060800160405280604d81526020016119d7604d9139905090565b600054610100900460ff16158080156109425750600054600160ff909116105b8061095c5750303b15801561095c575060005460ff166001145b6109785760405162461bcd60e51b81526004016103f390611953565b6000805460ff19166001179055801561099b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b0386161790556109c08383611095565b8015610a06576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a7d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cc91906119a1565b6001805460029081161415610af45760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b6c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610b77848484611126565b60335480831115610c065760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610c146103e8836118e3565b905060006103e8610c23611023565b610c2d91906118e3565b9050600082610c3c8784611912565b610c469190611931565b9050610c5286856118fb565b603355610c608888836111c1565b5050505050505050565b6000806103e8603354610c7d91906118e3565b905060006103e8610c8c611023565b610c9691906118e3565b9050806108d78386611912565b60006107cc8261089e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2591906117fc565b6001600160a01b0316336001600160a01b031614610d555760405162461bcd60e51b81526004016103f390611819565b600154198119600154191614610dd35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610e985760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610f3857506064546001600160a01b038381169116145b610faa5760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b038381169116141561101f57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561106c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109091906119a1565b905090565b600054610100900460ff166111005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561101f8160006112c2565b6032546001600160a01b038381169116148061114f57506064546001600160a01b038381169116145b6107b95760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156112ae5760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af115801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e9190611863565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050505b6107b96001600160a01b03831684836113ae565b6000546201000090046001600160a01b03161580156112e957506001600160a01b03821615155b61136b5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261101f82610e0a565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107b99286929160009161143e9185169084906114bb565b8051909150156107b9578080602001905181019061145c9190611863565b6107b95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b60606114ca84846000856114d4565b90505b9392505050565b6060824710156115355760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b61158c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516115a891906119ba565b60006040518083038185875af1925050503d80600081146115e5576040519150601f19603f3d011682016040523d82523d6000602084013e6115ea565b606091505b50915091506115fa828286611605565b979650505050505050565b606083156116145750816114cd565b8251156116245782518084602001fd5b8160405162461bcd60e51b81526004016103f3919061173d565b6001600160a01b038116811461040557600080fd5b60006020828403121561166557600080fd5b81356114cd8161163e565b60006020828403121561168257600080fd5b5035919050565b6000806040838503121561169c57600080fd5b82356116a78161163e565b946020939093013593505050565b600080604083850312156116c857600080fd5b82356116d38161163e565b915060208301356116e38161163e565b809150509250929050565b60006020828403121561170057600080fd5b813560ff811681146114cd57600080fd5b60005b8381101561172c578181015183820152602001611714565b83811115610a065750506000910152565b602081526000825180602084015261175c816040850160208701611711565b601f01601f19169190910160400192915050565b60008060006060848603121561178557600080fd5b83356117908161163e565b925060208401356117a08161163e565b915060408401356117b08161163e565b809150509250925092565b6000806000606084860312156117d057600080fd5b83356117db8161163e565b925060208401356117eb8161163e565b929592945050506040919091013590565b60006020828403121561180e57600080fd5b81516114cd8161163e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561187557600080fd5b815180151581146114cd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156118f6576118f66118cd565b500190565b60008282101561190d5761190d6118cd565b500390565b600081600019048311821515161561192c5761192c6118cd565b500290565b60008261194e57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119b357600080fd5b5051919050565b600082516119cc818460208701611711565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220ff37e0acae61bc99fd745598626c9383648cff6624ee2ccbf39a7eae5679483e64736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"EIGEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigen\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_EIGEN\",\"type\":\"address\",\"internalType\":\"contractIEigen\"},{\"name\":\"_bEIGEN\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001dc338038062001dc3833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611c4a62000179600039600081816101af015281816105ac01528181610ad40152610b9f0152611c4a6000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80637a8b2637116100c3578063ce7c2ac21161007c578063ce7c2ac2146102da578063d9caed12146102ed578063e3dae51c14610300578063f3e7387514610313578063fabc1cbc14610326578063fdc371ce1461033957600080fd5b80637a8b263714610260578063886f1195146102735780638c8710191461028c5780638f6a62401461029f578063ab5921e1146102b2578063c0c53b8b146102c757600080fd5b806347e7ef241161011557806347e7ef24146101e8578063485cc955146101fb578063553ca5f81461020e578063595c6a67146102215780635ac86ab7146102295780635c975abb1461025857600080fd5b806310d67a2f14610152578063136439dd146101675780632495a5991461017a57806339b70e38146101aa5780633a98ef39146101d1575b600080fd5b61016561016036600461181e565b61034c565b005b61016561017536600461183b565b610408565b60325461018d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b61018d7f000000000000000000000000000000000000000000000000000000000000000081565b6101da60335481565b6040519081526020016101a1565b6101da6101f6366004611854565b61054c565b610165610209366004611880565b610790565b6101da61021c36600461181e565b61085e565b610165610872565b6102486102373660046118c8565b6001805460ff9092161b9081161490565b60405190151581526020016101a1565b6001546101da565b6101da61026e36600461183b565b61093e565b60005461018d906201000090046001600160a01b031681565b6101da61029a36600461183b565b610989565b6101da6102ad36600461181e565b610994565b6102ba6109a2565b6040516101a19190611911565b6101656102d5366004611944565b6109c2565b6101da6102e836600461181e565b610aac565b6101656102fb36600461198f565b610b41565b6101da61030e36600461183b565b610d27565b6101da61032136600461183b565b610d60565b61016561033436600461183b565b610d6b565b60645461018d906001600160a01b031681565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103c391906119d0565b6001600160a01b0316336001600160a01b0316146103fc5760405162461bcd60e51b81526004016103f3906119ed565b60405180910390fd5b61040581610ec7565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610455573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104799190611a37565b6104955760405162461bcd60e51b81526004016103f390611a59565b6001548181161461050e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105a15760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106195760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b6106238484610fcc565b60335460006106346103e883611ab7565b905060006103e86106436110e0565b61064d9190611ab7565b9050600061065b8783611acf565b9050806106688489611ae6565b6106729190611b05565b9550856106d85760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103f3565b6106e28685611ab7565b60338190556f4b3b4ca85a86c47a098a223fffffffff101561076c5760405162461bcd60e51b815260206004820152603c60248201527f5374726174656779426173652e6465706f7369743a20746f74616c536861726560448201527f73206578636565647320604d41585f544f54414c5f534841524553600000000060648201526084016103f3565b610785826103e86033546107809190611ab7565b611152565b505050505092915050565b600054610100900460ff16158080156107b05750600054600160ff909116105b806107ca5750303b1580156107ca575060005460ff166001145b6107e65760405162461bcd60e51b81526004016103f390611b27565b6000805460ff191660011790558015610809576000805461ff0019166101001790555b61081383836111a6565b8015610859576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b600061086c61026e83610aac565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156108bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e39190611a37565b6108ff5760405162461bcd60e51b81526004016103f390611a59565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546109519190611ab7565b905060006103e86109606110e0565b61096a9190611ab7565b9050816109778583611ae6565b6109819190611b05565b949350505050565b600061086c82610d27565b600061086c61032183610aac565b60606040518060800160405280604d8152602001611bc8604d9139905090565b600054610100900460ff16158080156109e25750600054600160ff909116105b806109fc5750303b1580156109fc575060005460ff166001145b610a185760405162461bcd60e51b81526004016103f390611b27565b6000805460ff191660011790558015610a3b576000805461ff0019166101001790555b606480546001600160a01b0319166001600160a01b038616179055610a6083836111a6565b8015610aa6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b1d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c9190611b75565b6001805460029081161415610b945760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103f3565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c0c5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103f3565b610c178484846112f1565b60335480831115610ca65760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103f3565b6000610cb46103e883611ab7565b905060006103e8610cc36110e0565b610ccd9190611ab7565b9050600082610cdc8784611ae6565b610ce69190611b05565b9050610cf28685611acf565b603355610d12610d028284611acf565b6103e86033546107809190611ab7565b610d1d88888361138c565b5050505050505050565b6000806103e8603354610d3a9190611ab7565b905060006103e8610d496110e0565b610d539190611ab7565b9050806109778386611ae6565b600061086c8261093e565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de291906119d0565b6001600160a01b0316336001600160a01b031614610e125760405162461bcd60e51b81526004016103f3906119ed565b600154198119600154191614610e905760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103f3565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610541565b6001600160a01b038116610f555760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103f3565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b0383811691161480610ff557506064546001600160a01b038381169116145b6110675760405162461bcd60e51b815260206004820152603760248201527f456967656e53747261746567792e6465706f7369743a2043616e206f6e6c792060448201527f6465706f7369742062454947454e206f7220454947454e00000000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156110dc57606454604051636f074d1f60e11b8152600481018390526001600160a01b039091169063de0e9a3e90602401600060405180830381600087803b1580156110c357600080fd5b505af11580156110d7573d6000803e3d6000fd5b505050505b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611129573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114d9190611b75565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be88161118684670de0b6b3a7640000611ae6565b6111909190611b05565b6040519081526020015b60405180910390a15050565b600054610100900460ff166112115760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103f3565b603280546001600160a01b0319166001600160a01b03841617905561123781600061148d565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112d09190611b8e565b604080516001600160a01b03909316835260ff90911660208301520161119a565b6032546001600160a01b038381169116148061131a57506064546001600160a01b038381169116145b6108595760405162461bcd60e51b815260206004820152603960248201527f456967656e53747261746567792e77697468647261773a2043616e206f6e6c7960448201527f2077697468647261772062454947454e206f7220454947454e0000000000000060648201526084016103f3565b6064546001600160a01b03838116911614156114795760325460405163095ea7b360e01b81526001600160a01b038481166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af11580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114199190611a37565b50606454604051630ea598cb60e41b8152600481018390526001600160a01b039091169063ea598cb090602401600060405180830381600087803b15801561146057600080fd5b505af1158015611474573d6000803e3d6000fd5b505050505b6108596001600160a01b0383168483611579565b6000546201000090046001600160a01b03161580156114b457506001600160a01b03821615155b6115365760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103f3565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26110dc82610ec7565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649084015261085992869291600091611609918516908490611686565b80519091501561085957808060200190518101906116279190611a37565b6108595760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103f3565b6060611695848460008561169f565b90505b9392505050565b6060824710156117005760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103f3565b6001600160a01b0385163b6117575760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103f3565b600080866001600160a01b031685876040516117739190611bab565b60006040518083038185875af1925050503d80600081146117b0576040519150601f19603f3d011682016040523d82523d6000602084013e6117b5565b606091505b50915091506117c58282866117d0565b979650505050505050565b606083156117df575081611698565b8251156117ef5782518084602001fd5b8160405162461bcd60e51b81526004016103f39190611911565b6001600160a01b038116811461040557600080fd5b60006020828403121561183057600080fd5b813561169881611809565b60006020828403121561184d57600080fd5b5035919050565b6000806040838503121561186757600080fd5b823561187281611809565b946020939093013593505050565b6000806040838503121561189357600080fd5b823561189e81611809565b915060208301356118ae81611809565b809150509250929050565b60ff8116811461040557600080fd5b6000602082840312156118da57600080fd5b8135611698816118b9565b60005b838110156119005781810151838201526020016118e8565b83811115610aa65750506000910152565b60208152600082518060208401526119308160408501602087016118e5565b601f01601f19169190910160400192915050565b60008060006060848603121561195957600080fd5b833561196481611809565b9250602084013561197481611809565b9150604084013561198481611809565b809150509250925092565b6000806000606084860312156119a457600080fd5b83356119af81611809565b925060208401356119bf81611809565b929592945050506040919091013590565b6000602082840312156119e257600080fd5b815161169881611809565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4957600080fd5b8151801515811461169857600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611aca57611aca611aa1565b500190565b600082821015611ae157611ae1611aa1565b500390565b6000816000190483118215151615611b0057611b00611aa1565b500290565b600082611b2257634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215611b8757600080fd5b5051919050565b600060208284031215611ba057600080fd5b8151611698816118b9565b60008251611bbd8184602087016118e5565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212202074643e1c48de2f1cf7fdbbfb7ef480d5862d718f96ac97960980c6ddc2381864736f6c634300080c0033", } // EigenStrategyABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go index f63b4f494..5434aa08c 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -95,7 +95,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_avsDirectory\",\"type\":\"address\",\"internalType\":\"contractIAVSDirectory\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_OPERATOR_SET_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsDirectory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSDirectory\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardOperatorSetForRange\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.OperatorSetRewardsSubmission[]\",\"components\":[{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetRewardCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.OperatorSetRewardsSubmission\",\"components\":[{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101e06040523480156200001257600080fd5b506040516200511f3803806200511f8339810160408190526200003591620003c0565b898989898989898989896200004b878462000497565b63ffffffff1615620000f05760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000ff620151808862000497565b63ffffffff1615620001a05760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e7565b620001ac878362000497565b63ffffffff1615620002635760405162461bcd60e51b815260206004820152606d60248201527f52657761726473436f6f7264696e61746f723a204f50455241544f525f53455460448201527f5f47454e455349535f524557415244535f54494d455354414d50206d7573742060648201527f62652061206d756c7469706c65206f662043414c43554c4154494f4e5f494e5460848201526c455256414c5f5345434f4e445360981b60a482015260c401620000e7565b6001600160a01b03998a166101605297891661018052959097166101a05263ffffffff93841660805291831660a052821661010052811660c05292831660e0528216610120521661014052620002b8620002ce565b5050466101c05250620004c99650505050505050565b600054610100900460ff1615620003385760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e7565b60005460ff90811610156200038b576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620003a357600080fd5b50565b805163ffffffff81168114620003bb57600080fd5b919050565b6000806000806000806000806000806101408b8d031215620003e157600080fd5b8a51620003ee816200038d565b60208c0151909a5062000401816200038d565b60408c015190995062000414816200038d565b97506200042460608c01620003a6565b96506200043460808c01620003a6565b95506200044460a08c01620003a6565b94506200045460c08c01620003a6565b93506200046460e08c01620003a6565b9250620004756101008c01620003a6565b9150620004866101208c01620003a6565b90509295989b9194979a5092959850565b600063ffffffff80841680620004bd57634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051614b896200059660003960006124e80152600081816106970152610e1c01526000818161059d01526130d9015260006108e801526000818161053c0152610f930152600081816108750152610fb4015260008181610576015261124701526000818161048d01526112680152600081816103b90152612fd601526000818161080d0152612cda0152600081816107b301528181612d8a0152612e540152614b896000f3fe608060405234801561001057600080fd5b50600436106103775760003560e01c8063715018a6116101d3578063c46db60611610104578063f2fde38b116100a2578063f96abf2e1161007c578063f96abf2e14610938578063fabc1cbc1461094b578063fbf1e2c11461095e578063fce36c7d1461097157600080fd5b8063f2fde38b1461090a578063f698da251461091d578063f8cd84481461092557600080fd5b8063de02e503116100de578063de02e503146108aa578063e221b245146108bd578063e810ce21146108d0578063ea4d3c9b146108e357600080fd5b8063c46db60614610842578063d11e9ae514610870578063d4540a551461089757600080fd5b80639104c31911610171578063a0169ddd1161014b578063a0169ddd146107d5578063bb7e451f146107e8578063bf21a8aa14610808578063c336f19d1461082f57600080fd5b80639104c3191461078b5780639be3d4e4146107a65780639d45c281146107ae57600080fd5b8063863cb9a9116101ad578063863cb9a914610729578063865c69531461073c578063886f1195146107675780638da5cb5b1461077a57600080fd5b8063715018a6146106e75780637adace91146106ef5780637b8f8b051461072157600080fd5b806339b70e38116102ad57806358baaa3e1161024b5780635c975abb116102255780635c975abb146106775780635e9d83481461067f5780636b3aa72e146106925780636d21117e146106b957600080fd5b806358baaa3e14610639578063595c6a671461064c5780635ac86ab71461065457600080fd5b80633ccc861d116102875780633ccc861d146105e95780633efe1db6146105fc5780634d18cc351461060f5780634d7a80d41461062657600080fd5b806339b70e38146105985780633a8c0786146105bf5780633c8fcf7c146105d657600080fd5b8063136439dd1161031a5780632c9c60cf116102f45780632c9c60cf146105245780633486e32e1461053757806336af41fa1461055e57806337838ed01461057157600080fd5b8063136439dd146104af578063149bc872146104c25780632b9f64a4146104e357600080fd5b80630e9a53cf116103565780630e9a53cf146104185780630eb383451461046057806310d67a2f14610475578063131433b41461048857600080fd5b806218572c1461037c57806304a0c502146103b4578063092db007146103f0575b600080fd5b61039f61038a366004613f70565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ab565b60cb5461040590600160e01b900461ffff1681565b60405161ffff90911681526020016103ab565b610420610984565b604080518251815260208084015163ffffffff908116918301919091528383015116918101919091526060918201511515918101919091526080016103ab565b61047361046e366004613f9b565b610a63565b005b610473610483366004613f70565b610ae5565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736104bd366004613fd4565b610ba1565b6104d56104d0366004614005565b610ce0565b6040519081526020016103ab565b61050c6104f1366004613f70565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ab565b61047361053236600461406d565b610d56565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61047361056c36600461406d565b61109e565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103db90600160a01b900463ffffffff1681565b6103db6105e43660046140d5565b611336565b6104736105f736600461412c565b6115c4565b61047361060a366004614187565b611986565b60cb546103db90600160c01b900463ffffffff1681565b6104056106343660046141b3565b611c57565b6104736106473660046141f0565b611e06565b610473611e17565b61039f61066236600461420b565b606654600160ff9092169190911b9081161490565b6066546104d5565b61039f61068d36600461422e565b611ede565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b61039f6106c7366004614263565b60cf60209081526000928352604080842090915290825290205460ff1681565b610473611f6b565b6107026106fd36600461428f565b611f7f565b6040805161ffff909316835263ffffffff9091166020830152016103ab565b60ca546104d5565b610473610737366004613f70565b611fe7565b6104d561074a3660046142ef565b60cd60209081526000928352604080842090915290825290205481565b60655461050c906001600160a01b031681565b6033546001600160a01b031661050c565b61050c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610420611ff8565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736107e3366004613f70565b612096565b6104d56107f6366004613f70565b60ce6020526000908152604090205481565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104d561083d3660046141b3565b6120f5565b61039f610850366004614263565b60d060209081526000928352604080842090915290825290205460ff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736108a536600461431d565b6121a8565b6104206108b8366004613fd4565b6122f0565b6104736108cb366004614390565b612382565b6103db6108de366004613fd4565b612393565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b610473610918366004613f70565b61246e565b6104d56124e4565b6104d5610933366004614005565b612522565b6104736109463660046141f0565b612533565b610473610959366004613fd4565b612769565b60cb5461050c906001600160a01b031681565b61047361097f36600461406d565b6128c5565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b8015610a5f57600060ca6109c16001846143c1565b815481106109d1576109d16143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a415750806040015163ffffffff164210155b15610a4c5792915050565b5080610a57816143ee565b9150506109ac565b5090565b610a6b612a42565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190614405565b6001600160a01b0316336001600160a01b031614610b955760405162461bcd60e51b8152600401610b8c90614422565b60405180910390fd5b610b9e81612a9c565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d919061446c565b610c295760405162461bcd60e51b8152600401610b8c90614489565b60665481811614610ca25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610b8c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610cf06020840184613f70565b8360200135604051602001610d399392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460049060109081161415610d7f5760405162461bcd60e51b8152600401610b8c906144d1565b60026097541415610da25760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b828110156110935736848483818110610dc557610dc56143d8565b9050602002810190610dd7919061453f565b33600081815260ce60209081526040808320549051949550939192610e0292909185918791016146fc565b6040516020818303038152906040528051906020012090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166384d76f7b33856020016020810190610e5d91906141f0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015263ffffffff166024820152604401602060405180830381865afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed0919061446c565b610f4c5760405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e7265776172644f70657261746f60448201527f72536574466f7252616e67653a20696e76616c6964206f70657261746f7253656064820152601d60fa1b608482015260a401610b8c565b610fd8610f5c604085018561472c565b610f6c6080870160608801613f70565b6080870135610f8160c0890160a08a016141f0565b610f9160e08a0160c08b016141f0565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b93565b33600090815260cf602090815260408083208484529091529020805460ff1916600190811790915561100b908390614776565b33600081815260ce602052604090819020929092559051829184917f29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b29061105390889061478e565b60405180910390a46110853330608086018035906110749060608901613f70565b6001600160a01b03169291906132ab565b836001019350505050610daa565b505060016097555050565b606654600190600290811614156110c75760405162461bcd60e51b8152600401610b8c906144d1565b33600090815260d1602052604090205460ff166111665760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a401610b8c565b600260975414156111895760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b8281101561109357368484838181106111ac576111ac6143d8565b90506020028101906111be91906147a1565b33600081815260ce602090815260408083205490519495509391926111e99290918591879101614836565b60408051601f198184030181529190528051602090910120905061128c611210848061472c565b6112206040870160208801613f70565b60408701356112356080890160608a016141f0565b61124560a08a0160808b016141f0565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b93565b33600090815260d0602090815260408083208484529091529020805460ff191660019081179091556112bf908390614776565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf2704829061130790889061485d565b60405180910390a46113283330604086018035906110749060208901613f70565b836001019350505050611191565b600061271061ffff831611156113c25760405162461bcd60e51b815260206004820152604560248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72436f60448201527f6d6d697373696f6e426970733a20636f6d6d697373696f6e4269707320746f6f606482015264040d0d2ced60db1b608482015260a401610b8c565b6113cf62093a8042614776565b33600090815260d360209081526040822092935090919082906113f490880188613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020600086602001602081019061142991906141f0565b63ffffffff1663ffffffff16815260200190815260200160002060008560008111156114575761145761455f565b80156114655761146561455f565b8152602081019190915260400160002080549091508015806114c0575063ffffffff8316826114956001846143c1565b815481106114a5576114a56143d8565b60009182526020909120015462010000900463ffffffff1614155b15611523576040805180820190915261ffff808616825263ffffffff808616602080850191825286546001810188556000888152919091209451940180549151909216620100000265ffffffffffff199091169390921692909217179055611560565b83826115306001846143c1565b81548110611540576115406143d8565b6000918252602090912001805461ffff191661ffff929092169190911790555b8560405161156e9190614870565b6040518091039020336001600160a01b03167f811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba8787876040516115b3939291906148a8565b60405180910390a350509392505050565b606654600290600490811614156115ed5760405162461bcd60e51b8152600401610b8c906144d1565b600260975414156116105760405162461bcd60e51b8152600401610b8c90614508565b6002609755600060ca61162660208601866141f0565b63ffffffff168154811061163c5761163c6143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061169d848261331c565b60006116af6080860160608701613f70565b6001600160a01b03808216600090815260cc602052604090205491925016806116d55750805b336001600160a01b038216146117535760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608401610b8c565b60005b61176360a08801886148d4565b9050811015611978573661177a60e089018961472c565b8381811061178a5761178a6143d8565b6001600160a01b038716600090815260cd6020908152604080832093029490940194509290915082906117bf90850185613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808260200135116118795760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a401610b8c565b60006118898260208501356143c1565b6001600160a01b038716600090815260cd602090815260408220929350850180359291906118b79087613f70565b6001600160a01b03168152602080820192909252604001600020919091556118f9908a9083906118e990870187613f70565b6001600160a01b031691906135ed565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061193d6020890189613f70565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050806119719061491e565b9050611756565b505060016097555050505050565b606654600390600890811614156119af5760405162461bcd60e51b8152600401610b8c906144d1565b60cb546001600160a01b031633146119d95760405162461bcd60e51b8152600401610b8c90614939565b60cb5463ffffffff600160c01b909104811690831611611a755760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a401610b8c565b428263ffffffff1610611b0e5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a401610b8c565b60ca5460cb54600090611b2e90600160a01b900463ffffffff164261498d565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b60cb546001600160a01b038416600090815260d36020908152604082209192600160e01b900461ffff169183918290611c9290880188613f70565b6001600160a01b03166001600160a01b031681526020019081526020016000206000866020016020810190611cc791906141f0565b63ffffffff1663ffffffff1681526020019081526020016000206000856000811115611cf557611cf561455f565b8015611d0357611d0361455f565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611d77576000848152602090819020604080518082019091529084015461ffff8116825262010000900463ffffffff1681830152825260019092019101611d31565b5050825192935050505b8015611df95763ffffffff421682611d9a6001846143c1565b81518110611daa57611daa6143d8565b60200260200101516020015163ffffffff1611611df05781611dcd6001836143c1565b81518110611ddd57611ddd6143d8565b6020026020010151600001519250611df9565b60001901611d81565b50909150505b9392505050565b611e0e612a42565b610b9e8161361d565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e83919061446c565b611e9f5760405162461bcd60e51b8152600401610b8c90614489565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000611f638260ca611ef360208301836141f0565b63ffffffff1681548110611f0957611f096143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015261331c565b506001919050565b611f73612a42565b611f7d600061368e565b565b60d36020528460005260406000206020528360005260406000206020528260005260406000206020528160005260406000208181548110611fbf57600080fd5b60009182526020909120015461ffff8116955062010000900463ffffffff1693508592505050565b611fef612a42565b610b9e816136e0565b60408051608081018252600080825260208201819052918101829052606081019190915260ca805461202c906001906143c1565b8154811061203c5761203c6143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b6001600160a01b038316600090815260d360209081526040822090829061211e90860186613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020600084602001602081019061215391906141f0565b63ffffffff1663ffffffff16815260200190815260200160002060008360008111156121815761218161455f565b801561218f5761218f61455f565b8152602081019190915260400160002054949350505050565b600054610100900460ff16158080156121c85750600054600160ff909116105b806121e25750303b1580156121e2575060005460ff166001145b6122455760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b8c565b6000805460ff191660011790558015612268576000805461ff0019166101001790555b61227061373c565b60c95561227d86866137d3565b6122868761368e565b61228f846136e0565b6122988361361d565b6122a1826138bd565b80156122e7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8281548110612327576123276143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b61238a612a42565b610b9e816138bd565b60ca546000905b63ffffffff8116156123ff578260ca6123b46001846149b5565b63ffffffff16815481106123ca576123ca6143d8565b90600052602060002090600202016000015414156123ed57611dff6001826149b5565b806123f7816149da565b91505061239a565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608401610b8c565b612476612a42565b6001600160a01b0381166124db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b8c565b610b9e8161368e565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612515575060c95490565b61251d61373c565b905090565b60006001610cf06020840184613f70565b6066546003906008908116141561255c5760405162461bcd60e51b8152600401610b8c906144d1565b60cb546001600160a01b031633146125865760405162461bcd60e51b8152600401610b8c90614939565b60ca5463ffffffff8316106125f75760405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608401610b8c565b600060ca8363ffffffff1681548110612612576126126143d8565b906000526020600020906002020190508060010160089054906101000a900460ff161561269f5760405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608401610b8c565b6001810154600160201b900463ffffffff16421061271e5760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608401610b8c565b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e09190614405565b6001600160a01b0316336001600160a01b0316146128105760405162461bcd60e51b8152600401610b8c90614422565b60665419811960665419161461288e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610b8c565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610cd5565b606654600090600190811614156128ee5760405162461bcd60e51b8152600401610b8c906144d1565b600260975414156129115760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b828110156110935736848483818110612934576129346143d8565b905060200281019061294691906147a1565b33600081815260ce602090815260408083205490519495509391926129719290918591879101614836565b60408051601f1981840301815291905280516020909101209050612998611210848061472c565b33600090815260cf602090815260408083208484529091529020805460ff191660019081179091556129cb908390614776565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612a1390889061485d565b60405180910390a4612a343330604086018035906110749060208901613f70565b836001019350505050612919565b6033546001600160a01b03163314611f7d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b8c565b6001600160a01b038116612b2a5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610b8c565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b86612bf6576040805162461bcd60e51b8152602060048201526024810191909152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206e6f2073747261746567696573207365746064820152608401610b8c565b60008511612c645760405162461bcd60e51b81526020600482015260416024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a401610b8c565b6f4b3b4ca85a86c47a098a223fffffffff851115612cd85760405162461bcd60e51b815260206004820152603f6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608401610b8c565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168363ffffffff161115612d855760405162461bcd60e51b81526020600482015260546024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a401610b8c565b612daf7f000000000000000000000000000000000000000000000000000000000000000084614a10565b63ffffffff1615612e4f5760405162461bcd60e51b815260206004820152606a6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c401610b8c565b612e797f000000000000000000000000000000000000000000000000000000000000000085614a10565b63ffffffff1615612f1f5760405162461bcd60e51b81526020600482015260706024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c401610b8c565b8363ffffffff168263ffffffff1642612f3891906143c1565b11158015612f5257508363ffffffff168163ffffffff1611155b612fcc5760405162461bcd60e51b81526020600482015260516024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a401610b8c565b612ffc63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614776565b8463ffffffff1611156130815760405162461bcd60e51b81526020600482015260536024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a401610b8c565b6000805b8881101561329f5760008a8a838181106130a1576130a16143d8565b6130b79260206040909202019081019150613f70565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613122573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613146919061446c565b8061316d57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6131e05760405162461bcd60e51b815260206004820152604a6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a401610b8c565b806001600160a01b0316836001600160a01b03161061328d5760405162461bcd60e51b81526020600482015260696024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c401610b8c565b91506132988161491e565b9050613085565b50505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526133169085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613928565b50505050565b8060600151156133755760405162461bcd60e51b81526020600482015260306024820152600080516020614b1483398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608401610b8c565b806040015163ffffffff164210156133dc5760405162461bcd60e51b81526020600482015260366024820152600080516020614b148339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608401610b8c565b6133e960c08301836148d4565b90506133f860a08401846148d4565b9050146134705760405162461bcd60e51b815260206004820152604c6024820152600080516020614b1483398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a401610b8c565b61347d60e083018361472c565b905061348c60c08401846148d4565b9050146135025760405162461bcd60e51b815260206004820152604a6024820152600080516020614b1483398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610b8c565b805161352e9061351860408501602086016141f0565b6135256040860186614a33565b866060016139fa565b60005b61353e60a08401846148d4565b90508110156135e8576135d8608084013561355c60a08601866148d4565b8481811061356c5761356c6143d8565b905060200201602081019061358191906141f0565b61358e60c08701876148d4565b8581811061359e5761359e6143d8565b90506020028101906135b09190614a33565b6135bd60e089018961472c565b878181106135cd576135cd6143d8565b905060400201613b6e565b6135e18161491e565b9050613531565b505050565b6040516001600160a01b0383166024820152604481018290526135e890849063a9059cbb60e01b906064016132df565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b03161580156137f457506001600160a01b03821615155b6138765760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610b8c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26138b982612a9c565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b600061397d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613cbf9092919063ffffffff16565b8051909150156135e8578080602001905181019061399b919061446c565b6135e85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b8c565b613a05602083614a7a565b6001901b8463ffffffff1610613a8f5760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a401610b8c565b6000613a9a82610ce0565b9050613ae584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916613cd6565b613b665760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a401610b8c565b505050505050565b613b79602083614a7a565b6001901b8463ffffffff1610613bf75760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608401610b8c565b6000613c0282612522565b9050613c4d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916613cd6565b613b665760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608401610b8c565b6060613cce8484600085613cee565b949350505050565b600083613ce4868585613e1f565b1495945050505050565b606082471015613d4f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b8c565b6001600160a01b0385163b613da65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b8c565b600080866001600160a01b03168587604051613dc29190614aba565b60006040518083038185875af1925050503d8060008114613dff576040519150601f19603f3d011682016040523d82523d6000602084013e613e04565b606091505b5091509150613e14828286613f22565b979650505050505050565b600060208451613e2f9190614acc565b15613eb65760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610b8c565b8260205b85518111613f1957613ecd600285614acc565b613eee57816000528086015160205260406000209150600284049350613f07565b8086015160005281602052604060002091506002840493505b613f12602082614776565b9050613eba565b50949350505050565b60608315613f31575081611dff565b825115613f415782518084602001fd5b8160405162461bcd60e51b8152600401610b8c9190614ae0565b6001600160a01b0381168114610b9e57600080fd5b600060208284031215613f8257600080fd5b8135611dff81613f5b565b8015158114610b9e57600080fd5b60008060408385031215613fae57600080fd5b8235613fb981613f5b565b91506020830135613fc981613f8d565b809150509250929050565b600060208284031215613fe657600080fd5b5035919050565b600060408284031215613fff57600080fd5b50919050565b60006040828403121561401757600080fd5b611dff8383613fed565b60008083601f84011261403357600080fd5b50813567ffffffffffffffff81111561404b57600080fd5b6020830191508360208260051b850101111561406657600080fd5b9250929050565b6000806020838503121561408057600080fd5b823567ffffffffffffffff81111561409757600080fd5b6140a385828601614021565b90969095509350505050565b8035600181106140be57600080fd5b919050565b803561ffff811681146140be57600080fd5b6000806000608084860312156140ea57600080fd5b6140f48585613fed565b9250614102604085016140af565b9150614110606085016140c3565b90509250925092565b60006101008284031215613fff57600080fd5b6000806040838503121561413f57600080fd5b823567ffffffffffffffff81111561415657600080fd5b61416285828601614119565b9250506020830135613fc981613f5b565b803563ffffffff811681146140be57600080fd5b6000806040838503121561419a57600080fd5b823591506141aa60208401614173565b90509250929050565b6000806000608084860312156141c857600080fd5b83356141d381613f5b565b92506141e28560208601613fed565b9150614110606085016140af565b60006020828403121561420257600080fd5b611dff82614173565b60006020828403121561421d57600080fd5b813560ff81168114611dff57600080fd5b60006020828403121561424057600080fd5b813567ffffffffffffffff81111561425757600080fd5b613cce84828501614119565b6000806040838503121561427657600080fd5b823561428181613f5b565b946020939093013593505050565b600080600080600060a086880312156142a757600080fd5b85356142b281613f5b565b945060208601356142c281613f5b565b93506142d060408701614173565b92506142de606087016140af565b949793965091946080013592915050565b6000806040838503121561430257600080fd5b823561430d81613f5b565b91506020830135613fc981613f5b565b60008060008060008060c0878903121561433657600080fd5b863561434181613f5b565b9550602087013561435181613f5b565b945060408701359350606087013561436881613f5b565b925061437660808801614173565b915061438460a088016140c3565b90509295509295509295565b6000602082840312156143a257600080fd5b611dff826140c3565b634e487b7160e01b600052601160045260246000fd5b6000828210156143d3576143d36143ab565b500390565b634e487b7160e01b600052603260045260246000fd5b6000816143fd576143fd6143ab565b506000190190565b60006020828403121561441757600080fd5b8151611dff81613f5b565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561447e57600080fd5b8151611dff81613f8d565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000823560de1983360301811261455557600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b6001811061459357634e487b7160e01b600052602160045260246000fd5b9052565b6000808335601e198436030181126145ae57600080fd5b830160208101925035905067ffffffffffffffff8111156145ce57600080fd5b8060061b360383131561406657600080fd5b818352600060208085019450826000805b8681101561464557823561460481613f5b565b6001600160a01b03168852828401356bffffffffffffffffffffffff811680821461462d578384fd5b898601525060409788019792909201916001016145f1565b50959695505050505050565b6146638261465e836140af565b614575565b600061467160208301614173565b63ffffffff808216602086015261468b6040850185614597565b925060e060408701526146a260e0870184836145e0565b92505060608401356146b381613f5b565b6001600160a01b0316606086015260808481013590860152806146d860a08601614173565b1660a0860152806146eb60c08601614173565b1660c0860152508091505092915050565b60018060a01b03841681528260208201526060604082015260006147236060830184614651565b95945050505050565b6000808335601e1984360301811261474357600080fd5b83018035915067ffffffffffffffff82111561475e57600080fd5b6020019150600681901b360382131561406657600080fd5b60008219821115614789576147896143ab565b500190565b602081526000611dff6020830184614651565b60008235609e1983360301811261455557600080fd5b60006147c38283614597565b60a085526147d560a0860182846145e0565b91505060208301356147e681613f5b565b6001600160a01b031660208501526040838101359085015261480a60608401614173565b63ffffffff80821660608701528061482460808701614173565b16608087015250508091505092915050565b60018060a01b038416815282602082015260606040820152600061472360608301846147b7565b602081526000611dff60208301846147b7565b6000823561487d81613f5b565b6001600160a01b0316825263ffffffff61489960208501614173565b16602083015250604001919050565b606081016148b68286614575565b61ffff8416602083015263ffffffff83166040830152949350505050565b6000808335601e198436030181126148eb57600080fd5b83018035915067ffffffffffffffff82111561490657600080fd5b6020019150600581901b360382131561406657600080fd5b6000600019821415614932576149326143ab565b5060010190565b60208082526034908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6040820152733a103a3432903932bbb0b93239aab83230ba32b960611b606082015260800190565b600063ffffffff8083168185168083038211156149ac576149ac6143ab565b01949350505050565b600063ffffffff838116908316818110156149d2576149d26143ab565b039392505050565b600063ffffffff8216806149f0576149f06143ab565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff80841680614a2757614a276149fa565b92169190910692915050565b6000808335601e19843603018112614a4a57600080fd5b83018035915067ffffffffffffffff821115614a6557600080fd5b60200191503681900382131561406657600080fd5b600082614a8957614a896149fa565b500490565b60005b83811015614aa9578181015183820152602001614a91565b838111156133165750506000910152565b60008251614555818460208701614a8e565b600082614adb57614adb6149fa565b500690565b6020815260008251806020840152614aff816040850160208701614a8e565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2052657761726473436f6f7264696e61746f722e5f76616c696461746552657761a264697066735822122023c7b0bd649c687da84f858145f7866b17ec2461ddb5db854c7f28d8a8847b6564736f6c634300080c0033", + Bin: "0x6101e06040523480156200001257600080fd5b506040516200511f3803806200511f8339810160408190526200003591620003c0565b898989898989898989896200004b878462000497565b63ffffffff1615620000f05760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000ff620151808862000497565b63ffffffff1615620001a05760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e7565b620001ac878362000497565b63ffffffff1615620002635760405162461bcd60e51b815260206004820152606d60248201527f52657761726473436f6f7264696e61746f723a204f50455241544f525f53455460448201527f5f47454e455349535f524557415244535f54494d455354414d50206d7573742060648201527f62652061206d756c7469706c65206f662043414c43554c4154494f4e5f494e5460848201526c455256414c5f5345434f4e445360981b60a482015260c401620000e7565b6001600160a01b03998a166101605297891661018052959097166101a05263ffffffff93841660805291831660a052821661010052811660c05292831660e0528216610120521661014052620002b8620002ce565b5050466101c05250620004c99650505050505050565b600054610100900460ff1615620003385760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e7565b60005460ff90811610156200038b576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620003a357600080fd5b50565b805163ffffffff81168114620003bb57600080fd5b919050565b6000806000806000806000806000806101408b8d031215620003e157600080fd5b8a51620003ee816200038d565b60208c0151909a5062000401816200038d565b60408c015190995062000414816200038d565b97506200042460608c01620003a6565b96506200043460808c01620003a6565b95506200044460a08c01620003a6565b94506200045460c08c01620003a6565b93506200046460e08c01620003a6565b9250620004756101008c01620003a6565b9150620004866101208c01620003a6565b90509295989b9194979a5092959850565b600063ffffffff80841680620004bd57634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051614b896200059660003960006124e80152600081816106970152610e1c01526000818161059d01526130d9015260006108e801526000818161053c0152610f930152600081816108750152610fb4015260008181610576015261124701526000818161048d01526112680152600081816103b90152612fd601526000818161080d0152612cda0152600081816107b301528181612d8a0152612e540152614b896000f3fe608060405234801561001057600080fd5b50600436106103775760003560e01c8063715018a6116101d3578063c46db60611610104578063f2fde38b116100a2578063f96abf2e1161007c578063f96abf2e14610938578063fabc1cbc1461094b578063fbf1e2c11461095e578063fce36c7d1461097157600080fd5b8063f2fde38b1461090a578063f698da251461091d578063f8cd84481461092557600080fd5b8063de02e503116100de578063de02e503146108aa578063e221b245146108bd578063e810ce21146108d0578063ea4d3c9b146108e357600080fd5b8063c46db60614610842578063d11e9ae514610870578063d4540a551461089757600080fd5b80639104c31911610171578063a0169ddd1161014b578063a0169ddd146107d5578063bb7e451f146107e8578063bf21a8aa14610808578063c336f19d1461082f57600080fd5b80639104c3191461078b5780639be3d4e4146107a65780639d45c281146107ae57600080fd5b8063863cb9a9116101ad578063863cb9a914610729578063865c69531461073c578063886f1195146107675780638da5cb5b1461077a57600080fd5b8063715018a6146106e75780637adace91146106ef5780637b8f8b051461072157600080fd5b806339b70e38116102ad57806358baaa3e1161024b5780635c975abb116102255780635c975abb146106775780635e9d83481461067f5780636b3aa72e146106925780636d21117e146106b957600080fd5b806358baaa3e14610639578063595c6a671461064c5780635ac86ab71461065457600080fd5b80633ccc861d116102875780633ccc861d146105e95780633efe1db6146105fc5780634d18cc351461060f5780634d7a80d41461062657600080fd5b806339b70e38146105985780633a8c0786146105bf5780633c8fcf7c146105d657600080fd5b8063136439dd1161031a5780632c9c60cf116102f45780632c9c60cf146105245780633486e32e1461053757806336af41fa1461055e57806337838ed01461057157600080fd5b8063136439dd146104af578063149bc872146104c25780632b9f64a4146104e357600080fd5b80630e9a53cf116103565780630e9a53cf146104185780630eb383451461046057806310d67a2f14610475578063131433b41461048857600080fd5b806218572c1461037c57806304a0c502146103b4578063092db007146103f0575b600080fd5b61039f61038a366004613f70565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ab565b60cb5461040590600160e01b900461ffff1681565b60405161ffff90911681526020016103ab565b610420610984565b604080518251815260208084015163ffffffff908116918301919091528383015116918101919091526060918201511515918101919091526080016103ab565b61047361046e366004613f9b565b610a63565b005b610473610483366004613f70565b610ae5565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736104bd366004613fd4565b610ba1565b6104d56104d0366004614005565b610ce0565b6040519081526020016103ab565b61050c6104f1366004613f70565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ab565b61047361053236600461406d565b610d56565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61047361056c36600461406d565b61109e565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103db90600160a01b900463ffffffff1681565b6103db6105e43660046140d5565b611336565b6104736105f736600461412c565b6115c4565b61047361060a366004614187565b611986565b60cb546103db90600160c01b900463ffffffff1681565b6104056106343660046141b3565b611c57565b6104736106473660046141f0565b611e06565b610473611e17565b61039f61066236600461420b565b606654600160ff9092169190911b9081161490565b6066546104d5565b61039f61068d36600461422e565b611ede565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b61039f6106c7366004614263565b60cf60209081526000928352604080842090915290825290205460ff1681565b610473611f6b565b6107026106fd36600461428f565b611f7f565b6040805161ffff909316835263ffffffff9091166020830152016103ab565b60ca546104d5565b610473610737366004613f70565b611fe7565b6104d561074a3660046142ef565b60cd60209081526000928352604080842090915290825290205481565b60655461050c906001600160a01b031681565b6033546001600160a01b031661050c565b61050c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610420611ff8565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736107e3366004613f70565b612096565b6104d56107f6366004613f70565b60ce6020526000908152604090205481565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104d561083d3660046141b3565b6120f5565b61039f610850366004614263565b60d060209081526000928352604080842090915290825290205460ff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736108a536600461431d565b6121a8565b6104206108b8366004613fd4565b6122f0565b6104736108cb366004614390565b612382565b6103db6108de366004613fd4565b612393565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b610473610918366004613f70565b61246e565b6104d56124e4565b6104d5610933366004614005565b612522565b6104736109463660046141f0565b612533565b610473610959366004613fd4565b612769565b60cb5461050c906001600160a01b031681565b61047361097f36600461406d565b6128c5565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b8015610a5f57600060ca6109c16001846143c1565b815481106109d1576109d16143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a415750806040015163ffffffff164210155b15610a4c5792915050565b5080610a57816143ee565b9150506109ac565b5090565b610a6b612a42565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190614405565b6001600160a01b0316336001600160a01b031614610b955760405162461bcd60e51b8152600401610b8c90614422565b60405180910390fd5b610b9e81612a9c565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d919061446c565b610c295760405162461bcd60e51b8152600401610b8c90614489565b60665481811614610ca25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610b8c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610cf06020840184613f70565b8360200135604051602001610d399392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460049060109081161415610d7f5760405162461bcd60e51b8152600401610b8c906144d1565b60026097541415610da25760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b828110156110935736848483818110610dc557610dc56143d8565b9050602002810190610dd7919061453f565b33600081815260ce60209081526040808320549051949550939192610e0292909185918791016146fc565b6040516020818303038152906040528051906020012090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166384d76f7b33856020016020810190610e5d91906141f0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015263ffffffff166024820152604401602060405180830381865afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed0919061446c565b610f4c5760405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e7265776172644f70657261746f60448201527f72536574466f7252616e67653a20696e76616c6964206f70657261746f7253656064820152601d60fa1b608482015260a401610b8c565b610fd8610f5c604085018561472c565b610f6c6080870160608801613f70565b6080870135610f8160c0890160a08a016141f0565b610f9160e08a0160c08b016141f0565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b93565b33600090815260cf602090815260408083208484529091529020805460ff1916600190811790915561100b908390614776565b33600081815260ce602052604090819020929092559051829184917f29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b29061105390889061478e565b60405180910390a46110853330608086018035906110749060608901613f70565b6001600160a01b03169291906132ab565b836001019350505050610daa565b505060016097555050565b606654600190600290811614156110c75760405162461bcd60e51b8152600401610b8c906144d1565b33600090815260d1602052604090205460ff166111665760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a401610b8c565b600260975414156111895760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b8281101561109357368484838181106111ac576111ac6143d8565b90506020028101906111be91906147a1565b33600081815260ce602090815260408083205490519495509391926111e99290918591879101614836565b60408051601f198184030181529190528051602090910120905061128c611210848061472c565b6112206040870160208801613f70565b60408701356112356080890160608a016141f0565b61124560a08a0160808b016141f0565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b93565b33600090815260d0602090815260408083208484529091529020805460ff191660019081179091556112bf908390614776565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf2704829061130790889061485d565b60405180910390a46113283330604086018035906110749060208901613f70565b836001019350505050611191565b600061271061ffff831611156113c25760405162461bcd60e51b815260206004820152604560248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72436f60448201527f6d6d697373696f6e426970733a20636f6d6d697373696f6e4269707320746f6f606482015264040d0d2ced60db1b608482015260a401610b8c565b6113cf62093a8042614776565b33600090815260d360209081526040822092935090919082906113f490880188613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020600086602001602081019061142991906141f0565b63ffffffff1663ffffffff16815260200190815260200160002060008560008111156114575761145761455f565b80156114655761146561455f565b8152602081019190915260400160002080549091508015806114c0575063ffffffff8316826114956001846143c1565b815481106114a5576114a56143d8565b60009182526020909120015462010000900463ffffffff1614155b15611523576040805180820190915261ffff808616825263ffffffff808616602080850191825286546001810188556000888152919091209451940180549151909216620100000265ffffffffffff199091169390921692909217179055611560565b83826115306001846143c1565b81548110611540576115406143d8565b6000918252602090912001805461ffff191661ffff929092169190911790555b8560405161156e9190614870565b6040518091039020336001600160a01b03167f811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba8787876040516115b3939291906148a8565b60405180910390a350509392505050565b606654600290600490811614156115ed5760405162461bcd60e51b8152600401610b8c906144d1565b600260975414156116105760405162461bcd60e51b8152600401610b8c90614508565b6002609755600060ca61162660208601866141f0565b63ffffffff168154811061163c5761163c6143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061169d848261331c565b60006116af6080860160608701613f70565b6001600160a01b03808216600090815260cc602052604090205491925016806116d55750805b336001600160a01b038216146117535760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608401610b8c565b60005b61176360a08801886148d4565b9050811015611978573661177a60e089018961472c565b8381811061178a5761178a6143d8565b6001600160a01b038716600090815260cd6020908152604080832093029490940194509290915082906117bf90850185613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808260200135116118795760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a401610b8c565b60006118898260208501356143c1565b6001600160a01b038716600090815260cd602090815260408220929350850180359291906118b79087613f70565b6001600160a01b03168152602080820192909252604001600020919091556118f9908a9083906118e990870187613f70565b6001600160a01b031691906135ed565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061193d6020890189613f70565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050806119719061491e565b9050611756565b505060016097555050505050565b606654600390600890811614156119af5760405162461bcd60e51b8152600401610b8c906144d1565b60cb546001600160a01b031633146119d95760405162461bcd60e51b8152600401610b8c90614939565b60cb5463ffffffff600160c01b909104811690831611611a755760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a401610b8c565b428263ffffffff1610611b0e5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a401610b8c565b60ca5460cb54600090611b2e90600160a01b900463ffffffff164261498d565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b60cb546001600160a01b038416600090815260d36020908152604082209192600160e01b900461ffff169183918290611c9290880188613f70565b6001600160a01b03166001600160a01b031681526020019081526020016000206000866020016020810190611cc791906141f0565b63ffffffff1663ffffffff1681526020019081526020016000206000856000811115611cf557611cf561455f565b8015611d0357611d0361455f565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611d77576000848152602090819020604080518082019091529084015461ffff8116825262010000900463ffffffff1681830152825260019092019101611d31565b5050825192935050505b8015611df95763ffffffff421682611d9a6001846143c1565b81518110611daa57611daa6143d8565b60200260200101516020015163ffffffff1611611df05781611dcd6001836143c1565b81518110611ddd57611ddd6143d8565b6020026020010151600001519250611df9565b60001901611d81565b50909150505b9392505050565b611e0e612a42565b610b9e8161361d565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e83919061446c565b611e9f5760405162461bcd60e51b8152600401610b8c90614489565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000611f638260ca611ef360208301836141f0565b63ffffffff1681548110611f0957611f096143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015261331c565b506001919050565b611f73612a42565b611f7d600061368e565b565b60d36020528460005260406000206020528360005260406000206020528260005260406000206020528160005260406000208181548110611fbf57600080fd5b60009182526020909120015461ffff8116955062010000900463ffffffff1693508592505050565b611fef612a42565b610b9e816136e0565b60408051608081018252600080825260208201819052918101829052606081019190915260ca805461202c906001906143c1565b8154811061203c5761203c6143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b6001600160a01b038316600090815260d360209081526040822090829061211e90860186613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020600084602001602081019061215391906141f0565b63ffffffff1663ffffffff16815260200190815260200160002060008360008111156121815761218161455f565b801561218f5761218f61455f565b8152602081019190915260400160002054949350505050565b600054610100900460ff16158080156121c85750600054600160ff909116105b806121e25750303b1580156121e2575060005460ff166001145b6122455760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b8c565b6000805460ff191660011790558015612268576000805461ff0019166101001790555b61227061373c565b60c95561227d86866137d3565b6122868761368e565b61228f846136e0565b6122988361361d565b6122a1826138bd565b80156122e7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8281548110612327576123276143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b61238a612a42565b610b9e816138bd565b60ca546000905b63ffffffff8116156123ff578260ca6123b46001846149b5565b63ffffffff16815481106123ca576123ca6143d8565b90600052602060002090600202016000015414156123ed57611dff6001826149b5565b806123f7816149da565b91505061239a565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608401610b8c565b612476612a42565b6001600160a01b0381166124db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b8c565b610b9e8161368e565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612515575060c95490565b61251d61373c565b905090565b60006001610cf06020840184613f70565b6066546003906008908116141561255c5760405162461bcd60e51b8152600401610b8c906144d1565b60cb546001600160a01b031633146125865760405162461bcd60e51b8152600401610b8c90614939565b60ca5463ffffffff8316106125f75760405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608401610b8c565b600060ca8363ffffffff1681548110612612576126126143d8565b906000526020600020906002020190508060010160089054906101000a900460ff161561269f5760405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608401610b8c565b6001810154600160201b900463ffffffff16421061271e5760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608401610b8c565b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e09190614405565b6001600160a01b0316336001600160a01b0316146128105760405162461bcd60e51b8152600401610b8c90614422565b60665419811960665419161461288e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610b8c565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610cd5565b606654600090600190811614156128ee5760405162461bcd60e51b8152600401610b8c906144d1565b600260975414156129115760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b828110156110935736848483818110612934576129346143d8565b905060200281019061294691906147a1565b33600081815260ce602090815260408083205490519495509391926129719290918591879101614836565b60408051601f1981840301815291905280516020909101209050612998611210848061472c565b33600090815260cf602090815260408083208484529091529020805460ff191660019081179091556129cb908390614776565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612a1390889061485d565b60405180910390a4612a343330604086018035906110749060208901613f70565b836001019350505050612919565b6033546001600160a01b03163314611f7d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b8c565b6001600160a01b038116612b2a5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610b8c565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b86612bf6576040805162461bcd60e51b8152602060048201526024810191909152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206e6f2073747261746567696573207365746064820152608401610b8c565b60008511612c645760405162461bcd60e51b81526020600482015260416024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a401610b8c565b6f4b3b4ca85a86c47a098a223fffffffff851115612cd85760405162461bcd60e51b815260206004820152603f6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608401610b8c565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168363ffffffff161115612d855760405162461bcd60e51b81526020600482015260546024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a401610b8c565b612daf7f000000000000000000000000000000000000000000000000000000000000000084614a10565b63ffffffff1615612e4f5760405162461bcd60e51b815260206004820152606a6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c401610b8c565b612e797f000000000000000000000000000000000000000000000000000000000000000085614a10565b63ffffffff1615612f1f5760405162461bcd60e51b81526020600482015260706024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c401610b8c565b8363ffffffff168263ffffffff1642612f3891906143c1565b11158015612f5257508363ffffffff168163ffffffff1611155b612fcc5760405162461bcd60e51b81526020600482015260516024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a401610b8c565b612ffc63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614776565b8463ffffffff1611156130815760405162461bcd60e51b81526020600482015260536024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a401610b8c565b6000805b8881101561329f5760008a8a838181106130a1576130a16143d8565b6130b79260206040909202019081019150613f70565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613122573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613146919061446c565b8061316d57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6131e05760405162461bcd60e51b815260206004820152604a6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a401610b8c565b806001600160a01b0316836001600160a01b03161061328d5760405162461bcd60e51b81526020600482015260696024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c401610b8c565b91506132988161491e565b9050613085565b50505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526133169085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613928565b50505050565b8060600151156133755760405162461bcd60e51b81526020600482015260306024820152600080516020614b1483398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608401610b8c565b806040015163ffffffff164210156133dc5760405162461bcd60e51b81526020600482015260366024820152600080516020614b148339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608401610b8c565b6133e960c08301836148d4565b90506133f860a08401846148d4565b9050146134705760405162461bcd60e51b815260206004820152604c6024820152600080516020614b1483398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a401610b8c565b61347d60e083018361472c565b905061348c60c08401846148d4565b9050146135025760405162461bcd60e51b815260206004820152604a6024820152600080516020614b1483398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610b8c565b805161352e9061351860408501602086016141f0565b6135256040860186614a33565b866060016139fa565b60005b61353e60a08401846148d4565b90508110156135e8576135d8608084013561355c60a08601866148d4565b8481811061356c5761356c6143d8565b905060200201602081019061358191906141f0565b61358e60c08701876148d4565b8581811061359e5761359e6143d8565b90506020028101906135b09190614a33565b6135bd60e089018961472c565b878181106135cd576135cd6143d8565b905060400201613b6e565b6135e18161491e565b9050613531565b505050565b6040516001600160a01b0383166024820152604481018290526135e890849063a9059cbb60e01b906064016132df565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b03161580156137f457506001600160a01b03821615155b6138765760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610b8c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26138b982612a9c565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b600061397d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613cbf9092919063ffffffff16565b8051909150156135e8578080602001905181019061399b919061446c565b6135e85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b8c565b613a05602083614a7a565b6001901b8463ffffffff1610613a8f5760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a401610b8c565b6000613a9a82610ce0565b9050613ae584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916613cd6565b613b665760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a401610b8c565b505050505050565b613b79602083614a7a565b6001901b8463ffffffff1610613bf75760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608401610b8c565b6000613c0282612522565b9050613c4d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916613cd6565b613b665760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608401610b8c565b6060613cce8484600085613cee565b949350505050565b600083613ce4868585613e1f565b1495945050505050565b606082471015613d4f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b8c565b6001600160a01b0385163b613da65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b8c565b600080866001600160a01b03168587604051613dc29190614aba565b60006040518083038185875af1925050503d8060008114613dff576040519150601f19603f3d011682016040523d82523d6000602084013e613e04565b606091505b5091509150613e14828286613f22565b979650505050505050565b600060208451613e2f9190614acc565b15613eb65760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610b8c565b8260205b85518111613f1957613ecd600285614acc565b613eee57816000528086015160205260406000209150600284049350613f07565b8086015160005281602052604060002091506002840493505b613f12602082614776565b9050613eba565b50949350505050565b60608315613f31575081611dff565b825115613f415782518084602001fd5b8160405162461bcd60e51b8152600401610b8c9190614ae0565b6001600160a01b0381168114610b9e57600080fd5b600060208284031215613f8257600080fd5b8135611dff81613f5b565b8015158114610b9e57600080fd5b60008060408385031215613fae57600080fd5b8235613fb981613f5b565b91506020830135613fc981613f8d565b809150509250929050565b600060208284031215613fe657600080fd5b5035919050565b600060408284031215613fff57600080fd5b50919050565b60006040828403121561401757600080fd5b611dff8383613fed565b60008083601f84011261403357600080fd5b50813567ffffffffffffffff81111561404b57600080fd5b6020830191508360208260051b850101111561406657600080fd5b9250929050565b6000806020838503121561408057600080fd5b823567ffffffffffffffff81111561409757600080fd5b6140a385828601614021565b90969095509350505050565b8035600181106140be57600080fd5b919050565b803561ffff811681146140be57600080fd5b6000806000608084860312156140ea57600080fd5b6140f48585613fed565b9250614102604085016140af565b9150614110606085016140c3565b90509250925092565b60006101008284031215613fff57600080fd5b6000806040838503121561413f57600080fd5b823567ffffffffffffffff81111561415657600080fd5b61416285828601614119565b9250506020830135613fc981613f5b565b803563ffffffff811681146140be57600080fd5b6000806040838503121561419a57600080fd5b823591506141aa60208401614173565b90509250929050565b6000806000608084860312156141c857600080fd5b83356141d381613f5b565b92506141e28560208601613fed565b9150614110606085016140af565b60006020828403121561420257600080fd5b611dff82614173565b60006020828403121561421d57600080fd5b813560ff81168114611dff57600080fd5b60006020828403121561424057600080fd5b813567ffffffffffffffff81111561425757600080fd5b613cce84828501614119565b6000806040838503121561427657600080fd5b823561428181613f5b565b946020939093013593505050565b600080600080600060a086880312156142a757600080fd5b85356142b281613f5b565b945060208601356142c281613f5b565b93506142d060408701614173565b92506142de606087016140af565b949793965091946080013592915050565b6000806040838503121561430257600080fd5b823561430d81613f5b565b91506020830135613fc981613f5b565b60008060008060008060c0878903121561433657600080fd5b863561434181613f5b565b9550602087013561435181613f5b565b945060408701359350606087013561436881613f5b565b925061437660808801614173565b915061438460a088016140c3565b90509295509295509295565b6000602082840312156143a257600080fd5b611dff826140c3565b634e487b7160e01b600052601160045260246000fd5b6000828210156143d3576143d36143ab565b500390565b634e487b7160e01b600052603260045260246000fd5b6000816143fd576143fd6143ab565b506000190190565b60006020828403121561441757600080fd5b8151611dff81613f5b565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561447e57600080fd5b8151611dff81613f8d565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000823560de1983360301811261455557600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b6001811061459357634e487b7160e01b600052602160045260246000fd5b9052565b6000808335601e198436030181126145ae57600080fd5b830160208101925035905067ffffffffffffffff8111156145ce57600080fd5b8060061b360383131561406657600080fd5b818352600060208085019450826000805b8681101561464557823561460481613f5b565b6001600160a01b03168852828401356bffffffffffffffffffffffff811680821461462d578384fd5b898601525060409788019792909201916001016145f1565b50959695505050505050565b6146638261465e836140af565b614575565b600061467160208301614173565b63ffffffff808216602086015261468b6040850185614597565b925060e060408701526146a260e0870184836145e0565b92505060608401356146b381613f5b565b6001600160a01b0316606086015260808481013590860152806146d860a08601614173565b1660a0860152806146eb60c08601614173565b1660c0860152508091505092915050565b60018060a01b03841681528260208201526060604082015260006147236060830184614651565b95945050505050565b6000808335601e1984360301811261474357600080fd5b83018035915067ffffffffffffffff82111561475e57600080fd5b6020019150600681901b360382131561406657600080fd5b60008219821115614789576147896143ab565b500190565b602081526000611dff6020830184614651565b60008235609e1983360301811261455557600080fd5b60006147c38283614597565b60a085526147d560a0860182846145e0565b91505060208301356147e681613f5b565b6001600160a01b031660208501526040838101359085015261480a60608401614173565b63ffffffff80821660608701528061482460808701614173565b16608087015250508091505092915050565b60018060a01b038416815282602082015260606040820152600061472360608301846147b7565b602081526000611dff60208301846147b7565b6000823561487d81613f5b565b6001600160a01b0316825263ffffffff61489960208501614173565b16602083015250604001919050565b606081016148b68286614575565b61ffff8416602083015263ffffffff83166040830152949350505050565b6000808335601e198436030181126148eb57600080fd5b83018035915067ffffffffffffffff82111561490657600080fd5b6020019150600581901b360382131561406657600080fd5b6000600019821415614932576149326143ab565b5060010190565b60208082526034908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6040820152733a103a3432903932bbb0b93239aab83230ba32b960611b606082015260800190565b600063ffffffff8083168185168083038211156149ac576149ac6143ab565b01949350505050565b600063ffffffff838116908316818110156149d2576149d26143ab565b039392505050565b600063ffffffff8216806149f0576149f06143ab565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff80841680614a2757614a276149fa565b92169190910692915050565b6000808335601e19843603018112614a4a57600080fd5b83018035915067ffffffffffffffff821115614a6557600080fd5b60200191503681900382131561406657600080fd5b600082614a8957614a896149fa565b500490565b60005b83811015614aa9578181015183820152602001614a91565b838111156133165750506000910152565b60008251614555818460208701614a8e565b600082614adb57614adb6149fa565b500690565b6020815260008251806020840152614aff816040850160208701614a8e565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2052657761726473436f6f7264696e61746f722e5f76616c696461746552657761a2646970667358221220a9636d70699ce75a19e01142faac9b11ad37a676fd0b1d4f22c1ba2b9cba410864736f6c634300080c0033", } // RewardsCoordinatorABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyBase/binding.go b/pkg/bindings/StrategyBase/binding.go index d28bad825..60855287e 100644 --- a/pkg/bindings/StrategyBase/binding.go +++ b/pkg/bindings/StrategyBase/binding.go @@ -31,8 +31,8 @@ var ( // StrategyBaseMetaData contains all meta data concerning the StrategyBase contract. var StrategyBaseMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a060405234801561001057600080fd5b50604051620018b9380380620018b98339810160408190526100319161010c565b6001600160a01b03811660805261004661004c565b5061013c565b600054610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101561010a576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60006020828403121561011e57600080fd5b81516001600160a01b038116811461013557600080fd5b9392505050565b60805161174c6200016d6000396000818161019901528181610570015281816109550152610a20015261174c6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046113db565b610310565b005b61014f61015f3660046113f8565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e0366004611411565b610510565b61014f6101f336600461143d565b6106b4565b6101c46102063660046113db565b6107c9565b61014f6107dd565b610232610221366004611476565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046113f8565b6108a9565b600054610177906201000090046001600160a01b031681565b6101c46102843660046113f8565b6108f4565b6101c46102973660046113db565b6108ff565b6102a461090d565b60405161018b91906114c9565b6101c46102bf3660046113db565b61092d565b61014f6102d23660046114fc565b6109c2565b6101c46102e53660046113f8565b610b8b565b6101c46102f83660046113f8565b610bc4565b61014f61030b3660046113f8565b610bcf565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610387919061153d565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061155a565b60405180910390fd5b6103c981610d2b565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d91906115a4565b6104595760405162461bcd60e51b81526004016103b7906115c6565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610e30565b60335460006105f86103e883611624565b905060006103e8610607610eb0565b6106119190611624565b9050600061061f878361163c565b90508061062c8489611653565b6106369190611672565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a68685611624565b603355505050505092915050565b600054610100900460ff16158080156106d45750600054600160ff909116105b806106ee5750303b1580156106ee575060005460ff166001145b6107515760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610774576000805461ff0019166101001790555b61077e8383610f22565b80156107c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006107d76102588361092d565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa15801561082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084e91906115a4565b61086a5760405162461bcd60e51b81526004016103b7906115c6565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e86033546108bc9190611624565b905060006103e86108cb610eb0565b6108d59190611624565b9050816108e28583611653565b6108ec9190611672565b949350505050565b60006107d782610b8b565b60006107d76102f88361092d565b60606040518060800160405280604d81526020016116ca604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d79190611694565b6001805460029081161415610a155760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a8d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610a98848484610fb3565b60335480831115610b275760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610b356103e883611624565b905060006103e8610b44610eb0565b610b4e9190611624565b9050600082610b5d8784611653565b610b679190611672565b9050610b73868561163c565b603355610b81888883611036565b5050505050505050565b6000806103e8603354610b9e9190611624565b905060006103e8610bad610eb0565b610bb79190611624565b9050806108e28386611653565b60006107d7826108a9565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c46919061153d565b6001600160a01b0316336001600160a01b031614610c765760405162461bcd60e51b81526004016103b79061155a565b600154198119600154191614610cf45760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610db95760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610eac5760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190611694565b905090565b600054610100900460ff16610f8d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b038416179055610eac81600061104a565b6032546001600160a01b038381169116146107c45760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6107c46001600160a01b0383168483611136565b6000546201000090046001600160a01b031615801561107157506001600160a01b03821615155b6110f35760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610eac82610d2b565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526107c4928692916000916111c6918516908490611243565b8051909150156107c457808060200190518101906111e491906115a4565b6107c45760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b6060611252848460008561125c565b90505b9392505050565b6060824710156112bd5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6113145760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b0316858760405161133091906116ad565b60006040518083038185875af1925050503d806000811461136d576040519150601f19603f3d011682016040523d82523d6000602084013e611372565b606091505b509150915061138282828661138d565b979650505050505050565b6060831561139c575081611255565b8251156113ac5782518084602001fd5b8160405162461bcd60e51b81526004016103b791906114c9565b6001600160a01b03811681146103c957600080fd5b6000602082840312156113ed57600080fd5b8135611255816113c6565b60006020828403121561140a57600080fd5b5035919050565b6000806040838503121561142457600080fd5b823561142f816113c6565b946020939093013593505050565b6000806040838503121561145057600080fd5b823561145b816113c6565b9150602083013561146b816113c6565b809150509250929050565b60006020828403121561148857600080fd5b813560ff8116811461125557600080fd5b60005b838110156114b457818101518382015260200161149c565b838111156114c3576000848401525b50505050565b60208152600082518060208401526114e8816040850160208701611499565b601f01601f19169190910160400192915050565b60008060006060848603121561151157600080fd5b833561151c816113c6565b9250602084013561152c816113c6565b929592945050506040919091013590565b60006020828403121561154f57600080fd5b8151611255816113c6565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b6000602082840312156115b657600080fd5b8151801515811461125557600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156116375761163761160e565b500190565b60008282101561164e5761164e61160e565b500390565b600081600019048311821515161561166d5761166d61160e565b500290565b60008261168f57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156116a657600080fd5b5051919050565b600082516116bf818460208701611499565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a264697066735822122067817aaf67e89a1f5f9fa8a01f03b36b6a04eaf1e7c6fb374e93554b0952ad7f64736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001ab438038062001ab4833981016040819052620000349162000114565b6001600160a01b0381166080526200004b62000052565b5062000146565b600054610100900460ff1615620000bf5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000112576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012757600080fd5b81516001600160a01b03811681146200013f57600080fd5b9392505050565b60805161193d620001776000396000818161019901528181610570015281816109f50152610ac0015261193d6000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80635c975abb116100b8578063ab5921e11161007c578063ab5921e11461029c578063ce7c2ac2146102b1578063d9caed12146102c4578063e3dae51c146102d7578063f3e73875146102ea578063fabc1cbc146102fd57600080fd5b80635c975abb146102425780637a8b26371461024a578063886f11951461025d5780638c871019146102765780638f6a62401461028957600080fd5b806347e7ef24116100ff57806347e7ef24146101d2578063485cc955146101e5578063553ca5f8146101f8578063595c6a671461020b5780635ac86ab71461021357600080fd5b806310d67a2f1461013c578063136439dd146101515780632495a5991461016457806339b70e38146101945780633a98ef39146101bb575b600080fd5b61014f61014a3660046115a6565b610310565b005b61014f61015f3660046115c3565b6103cc565b603254610177906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101777f000000000000000000000000000000000000000000000000000000000000000081565b6101c460335481565b60405190815260200161018b565b6101c46101e03660046115dc565b610510565b61014f6101f3366004611608565b610754565b6101c46102063660046115a6565b610869565b61014f61087d565b610232610221366004611650565b6001805460ff9092161b9081161490565b604051901515815260200161018b565b6001546101c4565b6101c46102583660046115c3565b610949565b600054610177906201000090046001600160a01b031681565b6101c46102843660046115c3565b610994565b6101c46102973660046115a6565b61099f565b6102a46109ad565b60405161018b919061169d565b6101c46102bf3660046115a6565b6109cd565b61014f6102d23660046116d0565b610a62565b6101c46102e53660046115c3565b610c48565b6101c46102f83660046115c3565b610c81565b61014f61030b3660046115c3565b610c8c565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610363573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103879190611711565b6001600160a01b0316336001600160a01b0316146103c05760405162461bcd60e51b81526004016103b79061172e565b60405180910390fd5b6103c981610de8565b50565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610419573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061043d9190611778565b6104595760405162461bcd60e51b81526004016103b79061179a565b600154818116146104d25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600180546000918291811614156105655760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105dd5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b6105e78484610eed565b60335460006105f86103e8836117f8565b905060006103e8610607610f6d565b61061191906117f8565b9050600061061f8783611810565b90508061062c8489611827565b6106369190611846565b95508561069c5760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b60648201526084016103b7565b6106a686856117f8565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156107305760405162461bcd60e51b815260206004820152603c60248201527f5374726174656779426173652e6465706f7369743a20746f74616c536861726560448201527f73206578636565647320604d41585f544f54414c5f534841524553600000000060648201526084016103b7565b610749826103e860335461074491906117f8565b610fdf565b505050505092915050565b600054610100900460ff16158080156107745750600054600160ff909116105b8061078e5750303b15801561078e575060005460ff166001145b6107f15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b7565b6000805460ff191660011790558015610814576000805461ff0019166101001790555b61081e8383611033565b8015610864576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000610877610258836109cd565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa1580156108ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ee9190611778565b61090a5760405162461bcd60e51b81526004016103b79061179a565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e860335461095c91906117f8565b905060006103e861096b610f6d565b61097591906117f8565b9050816109828583611827565b61098c9190611846565b949350505050565b600061087782610c48565b60006108776102f8836109cd565b60606040518060800160405280604d81526020016118bb604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610a3e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108779190611868565b6001805460029081161415610ab55760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b60448201526064016103b7565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b2d5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e6167657260448201526064016103b7565b610b3884848461117e565b60335480831115610bc75760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a4016103b7565b6000610bd56103e8836117f8565b905060006103e8610be4610f6d565b610bee91906117f8565b9050600082610bfd8784611827565b610c079190611846565b9050610c138685611810565b603355610c33610c238284611810565b6103e860335461074491906117f8565b610c3e888883611201565b5050505050505050565b6000806103e8603354610c5b91906117f8565b905060006103e8610c6a610f6d565b610c7491906117f8565b9050806109828386611827565b600061087782610949565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d039190611711565b6001600160a01b0316336001600160a01b031614610d335760405162461bcd60e51b81526004016103b79061172e565b600154198119600154191614610db15760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016103b7565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610505565b6001600160a01b038116610e765760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016103b7565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6032546001600160a01b03838116911614610f695760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b60648201526084016103b7565b5050565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610fb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fda9190611868565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be88161101384670de0b6b3a7640000611827565b61101d9190611846565b6040519081526020015b60405180910390a15050565b600054610100900460ff1661109e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016103b7565b603280546001600160a01b0319166001600160a01b0384161790556110c4816000611215565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115d9190611881565b604080516001600160a01b03909316835260ff909116602083015201611027565b6032546001600160a01b038381169116146108645760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e000000000060648201526084016103b7565b6108646001600160a01b0383168483611301565b6000546201000090046001600160a01b031615801561123c57506001600160a01b03821615155b6112be5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016103b7565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610f6982610de8565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526108649286929160009161139191851690849061140e565b80519091501561086457808060200190518101906113af9190611778565b6108645760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103b7565b606061141d8484600085611427565b90505b9392505050565b6060824710156114885760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103b7565b6001600160a01b0385163b6114df5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103b7565b600080866001600160a01b031685876040516114fb919061189e565b60006040518083038185875af1925050503d8060008114611538576040519150601f19603f3d011682016040523d82523d6000602084013e61153d565b606091505b509150915061154d828286611558565b979650505050505050565b60608315611567575081611420565b8251156115775782518084602001fd5b8160405162461bcd60e51b81526004016103b7919061169d565b6001600160a01b03811681146103c957600080fd5b6000602082840312156115b857600080fd5b813561142081611591565b6000602082840312156115d557600080fd5b5035919050565b600080604083850312156115ef57600080fd5b82356115fa81611591565b946020939093013593505050565b6000806040838503121561161b57600080fd5b823561162681611591565b9150602083013561163681611591565b809150509250929050565b60ff811681146103c957600080fd5b60006020828403121561166257600080fd5b813561142081611641565b60005b83811015611688578181015183820152602001611670565b83811115611697576000848401525b50505050565b60208152600082518060208401526116bc81604085016020870161166d565b601f01601f19169190910160400192915050565b6000806000606084860312156116e557600080fd5b83356116f081611591565b9250602084013561170081611591565b929592945050506040919091013590565b60006020828403121561172357600080fd5b815161142081611591565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561178a57600080fd5b8151801515811461142057600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561180b5761180b6117e2565b500190565b600082821015611822576118226117e2565b500390565b6000816000190483118215151615611841576118416117e2565b500290565b60008261186357634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561187a57600080fd5b5051919050565b60006020828403121561189357600080fd5b815161142081611641565b600082516118b081846020870161166d565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220fdb1cf41dad704373536b605ad5d3c82b532af827f4ae30f7139f31ec1f8ee7064736f6c634300080c0033", } // StrategyBaseABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyBaseTVLLimits/binding.go b/pkg/bindings/StrategyBaseTVLLimits/binding.go index 2c04bdf21..063817b1a 100644 --- a/pkg/bindings/StrategyBaseTVLLimits/binding.go +++ b/pkg/bindings/StrategyBaseTVLLimits/binding.go @@ -31,8 +31,8 @@ var ( // StrategyBaseTVLLimitsMetaData contains all meta data concerning the StrategyBaseTVLLimits contract. var StrategyBaseTVLLimitsMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60a06040523480156200001157600080fd5b5060405162001d5c38038062001d5c833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611be36200017960003960008181610216015281816107a901528181610b470152610c120152611be36000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a13660046117b8565b6103ba565b005b6101a66101b6366004611802565b61049d565b6101a66101c936600461181f565b610550565b6101a66101dc366004611841565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b61024161026636600461185a565b610749565b6101a6610279366004611886565b6108ed565b61024161028c366004611802565b6109bb565b6101a66109cf565b6102b86102a73660046118bf565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611841565b610a9b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611841565b610ae6565b610241610326366004611802565b610af1565b610333610aff565b6040516102089190611912565b61024161034e366004611802565b610b1f565b6101a6610361366004611945565b610bb4565b60645460655460408051928352602083019190915201610208565b61024161038f366004611841565b610d7d565b6102416103a2366004611841565b610db6565b6101a66103b5366004611841565b610dc1565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611986565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610f1d565b610450838361102a565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051491906119d4565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b8152600401610410906119f1565b61054d816110bb565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c791906119d4565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b8152600401610410906119f1565b6106018282610f1d565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611a3b565b6106925760405162461bcd60e51b815260040161041090611a5d565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b61082084846111c0565b60335460006108316103e883611abb565b905060006103e86108406112a2565b61084a9190611abb565b905060006108588783611ad3565b9050806108658489611aea565b61086f9190611b09565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611abb565b603355505050505092915050565b600054610100900460ff161580801561090d5750600054600160ff909116105b806109275750303b158015610927575060005460ff166001145b6109435760405162461bcd60e51b815260040161041090611986565b6000805460ff191660011790558015610966576000805461ff0019166101001790555b610970838361102a565b80156109b6576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b60006109c96102e783610b1f565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a409190611a3b565b610a5c5760405162461bcd60e51b815260040161041090611a5d565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610aae9190611abb565b905060006103e8610abd6112a2565b610ac79190611abb565b905081610ad48583611aea565b610ade9190611b09565b949350505050565b60006109c982610d7d565b60006109c96103a283610b1f565b60606040518060800160405280604d8152602001611b61604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610b90573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c99190611b2b565b6001805460029081161415610c075760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c7f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610c8a848484611314565b60335480831115610d195760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610d276103e883611abb565b905060006103e8610d366112a2565b610d409190611abb565b9050600082610d4f8784611aea565b610d599190611b09565b9050610d658685611ad3565b603355610d73888883611397565b5050505050505050565b6000806103e8603354610d909190611abb565b905060006103e8610d9f6112a2565b610da99190611abb565b905080610ad48386611aea565b60006109c982610a9b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3891906119d4565b6001600160a01b0316336001600160a01b031614610e685760405162461bcd60e51b8152600401610410906119f1565b600154198119600154191614610ee65760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a18082111561101f5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166110955760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b0384161790556106018160006113ab565b6001600160a01b0381166111495760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60645481111561122a5760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546112356112a2565b11156112985760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611497565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130f9190611b2b565b905090565b6032546001600160a01b038381169116146109b65760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b6109b66001600160a01b0383168483611513565b6000546201000090046001600160a01b03161580156113d257506001600160a01b03821615155b6114545760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610601826110bb565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908401526109b6928692916000916115a3918516908490611620565b8051909150156109b657808060200190518101906115c19190611a3b565b6109b65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b606061162f8484600085611639565b90505b9392505050565b60608247101561169a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6116f15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b0316858760405161170d9190611b44565b60006040518083038185875af1925050503d806000811461174a576040519150601f19603f3d011682016040523d82523d6000602084013e61174f565b606091505b509150915061175f82828661176a565b979650505050505050565b60608315611779575081611632565b8251156117895782518084602001fd5b8160405162461bcd60e51b81526004016104109190611912565b6001600160a01b038116811461054d57600080fd5b600080600080608085870312156117ce57600080fd5b843593506020850135925060408501356117e7816117a3565b915060608501356117f7816117a3565b939692955090935050565b60006020828403121561181457600080fd5b8135611632816117a3565b6000806040838503121561183257600080fd5b50508035926020909101359150565b60006020828403121561185357600080fd5b5035919050565b6000806040838503121561186d57600080fd5b8235611878816117a3565b946020939093013593505050565b6000806040838503121561189957600080fd5b82356118a4816117a3565b915060208301356118b4816117a3565b809150509250929050565b6000602082840312156118d157600080fd5b813560ff8116811461163257600080fd5b60005b838110156118fd5781810151838201526020016118e5565b8381111561190c576000848401525b50505050565b60208152600082518060208401526119318160408501602087016118e2565b601f01601f19169190910160400192915050565b60008060006060848603121561195a57600080fd5b8335611965816117a3565b92506020840135611975816117a3565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000602082840312156119e657600080fd5b8151611632816117a3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611a4d57600080fd5b8151801515811461163257600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ace57611ace611aa5565b500190565b600082821015611ae557611ae5611aa5565b500390565b6000816000190483118215151615611b0457611b04611aa5565b500290565b600082611b2657634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611b3d57600080fd5b5051919050565b60008251611b568184602087016118e2565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a2646970667358221220b2454432a91a098d2f8ccb362475b556e7ed812c69079faaf360088c552a38c264736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"newShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"explanation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"getTVLLimits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_maxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_underlyingToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"maxPerDeposit\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"maxTotalDeposits\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setTVLLimits\",\"inputs\":[{\"name\":\"newMaxPerDeposit\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"newMaxTotalDeposits\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlying\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"sharesToUnderlyingView\",\"inputs\":[{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToShares\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToSharesView\",\"inputs\":[{\"name\":\"amountUnderlying\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"underlyingToken\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlying\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"userUnderlyingView\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amountShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"ExchangeRateEmitted\",\"inputs\":[{\"name\":\"rate\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxPerDepositUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxTotalDepositsUpdated\",\"inputs\":[{\"name\":\"previousValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newValue\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyTokenSet\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"decimals\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162001f4d38038062001f4d833981016040819052620000349162000116565b6001600160a01b038116608052806200004c62000054565b505062000148565b600054610100900460ff1615620000c15760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000114576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012957600080fd5b81516001600160a01b03811681146200014157600080fd5b9392505050565b608051611dd46200017960003960008181610216015281816107a901528181610be70152610cb20152611dd46000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c80635c975abb116100de578063ab5921e111610097578063df6fadc111610071578063df6fadc114610366578063e3dae51c14610381578063f3e7387514610394578063fabc1cbc146103a757600080fd5b8063ab5921e11461032b578063ce7c2ac214610340578063d9caed121461035357600080fd5b80635c975abb146102c857806361b01b5d146102d05780637a8b2637146102d9578063886f1195146102ec5780638c871019146103055780638f6a62401461031857600080fd5b80633a98ef391161014b578063485cc95511610125578063485cc9551461026b578063553ca5f81461027e578063595c6a67146102915780635ac86ab71461029957600080fd5b80633a98ef391461023857806343fe08b01461024f57806347e7ef241461025857600080fd5b8063019e27291461019357806310d67a2f146101a857806311c70c9d146101bb578063136439dd146101ce5780632495a599146101e157806339b70e3814610211575b600080fd5b6101a66101a1366004611983565b6103ba565b005b6101a66101b63660046119cd565b61049d565b6101a66101c93660046119ea565b610550565b6101a66101dc366004611a0c565b610605565b6032546101f4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6101f47f000000000000000000000000000000000000000000000000000000000000000081565b61024160335481565b604051908152602001610208565b61024160645481565b610241610266366004611a25565b610749565b6101a6610279366004611a51565b61098d565b61024161028c3660046119cd565b610a5b565b6101a6610a6f565b6102b86102a7366004611a99565b6001805460ff9092161b9081161490565b6040519015158152602001610208565b600154610241565b61024160655481565b6102416102e7366004611a0c565b610b3b565b6000546101f4906201000090046001600160a01b031681565b610241610313366004611a0c565b610b86565b6102416103263660046119cd565b610b91565b610333610b9f565b6040516102089190611ae6565b61024161034e3660046119cd565b610bbf565b6101a6610361366004611b19565b610c54565b60645460655460408051928352602083019190915201610208565b61024161038f366004611a0c565b610e3a565b6102416103a2366004611a0c565b610e73565b6101a66103b5366004611a0c565b610e7e565b600054610100900460ff16158080156103da5750600054600160ff909116105b806103f45750303b1580156103f4575060005460ff166001145b6104195760405162461bcd60e51b815260040161041090611b5a565b60405180910390fd5b6000805460ff19166001179055801561043c576000805461ff0019166101001790555b6104468585610fda565b61045083836110e7565b8015610496576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105149190611ba8565b6001600160a01b0316336001600160a01b0316146105445760405162461bcd60e51b815260040161041090611bc5565b61054d8161123a565b50565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105c79190611ba8565b6001600160a01b0316336001600160a01b0316146105f75760405162461bcd60e51b815260040161041090611bc5565b6106018282610fda565b5050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610652573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106769190611c0f565b6106925760405162461bcd60e51b815260040161041090611c31565b6001548181161461070b5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6001805460009182918116141561079e5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108165760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610820848461133f565b60335460006108316103e883611c8f565b905060006103e8610840611421565b61084a9190611c8f565b905060006108588783611ca7565b9050806108658489611cbe565b61086f9190611cdd565b9550856108d55760405162461bcd60e51b815260206004820152602e60248201527f5374726174656779426173652e6465706f7369743a206e65775368617265732060448201526d63616e6e6f74206265207a65726f60901b6064820152608401610410565b6108df8685611c8f565b60338190556f4b3b4ca85a86c47a098a223fffffffff10156109695760405162461bcd60e51b815260206004820152603c60248201527f5374726174656779426173652e6465706f7369743a20746f74616c536861726560448201527f73206578636565647320604d41585f544f54414c5f53484152455360000000006064820152608401610410565b610982826103e860335461097d9190611c8f565b611493565b505050505092915050565b600054610100900460ff16158080156109ad5750600054600160ff909116105b806109c75750303b1580156109c7575060005460ff166001145b6109e35760405162461bcd60e51b815260040161041090611b5a565b6000805460ff191660011790558015610a06576000805461ff0019166101001790555b610a1083836110e7565b8015610a56576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6000610a696102e783610bbf565b92915050565b60005460405163237dfb4760e11b8152336004820152620100009091046001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610abc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae09190611c0f565b610afc5760405162461bcd60e51b815260040161041090611c31565b600019600181905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000806103e8603354610b4e9190611c8f565b905060006103e8610b5d611421565b610b679190611c8f565b905081610b748583611cbe565b610b7e9190611cdd565b949350505050565b6000610a6982610e3a565b6000610a696103a283610bbf565b60606040518060800160405280604d8152602001611d52604d9139905090565b604051633d3f06c960e11b81526001600160a01b0382811660048301523060248301526000917f000000000000000000000000000000000000000000000000000000000000000090911690637a7e0d9290604401602060405180830381865afa158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a699190611cff565b6001805460029081161415610ca75760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610410565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d1f5760405162461bcd60e51b815260206004820181905260248201527f5374726174656779426173652e6f6e6c7953747261746567794d616e616765726044820152606401610410565b610d2a8484846114df565b60335480831115610db95760405162461bcd60e51b815260206004820152604d60248201527f5374726174656779426173652e77697468647261773a20616d6f756e7453686160448201527f726573206d757374206265206c657373207468616e206f7220657175616c207460648201526c6f20746f74616c53686172657360981b608482015260a401610410565b6000610dc76103e883611c8f565b905060006103e8610dd6611421565b610de09190611c8f565b9050600082610def8784611cbe565b610df99190611cdd565b9050610e058685611ca7565b603355610e25610e158284611ca7565b6103e860335461097d9190611c8f565b610e30888883611562565b5050505050505050565b6000806103e8603354610e4d9190611c8f565b905060006103e8610e5c611421565b610e669190611c8f565b905080610b748386611cbe565b6000610a6982610b3b565b600060029054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef59190611ba8565b6001600160a01b0316336001600160a01b031614610f255760405162461bcd60e51b815260040161041090611bc5565b600154198119600154191614610fa35760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610410565b600181905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161073e565b60645460408051918252602082018490527ff97ed4e083acac67830025ecbc756d8fe847cdbdca4cee3fe1e128e98b54ecb5910160405180910390a160655460408051918252602082018390527f6ab181e0440bfbf4bacdf2e99674735ce6638005490688c5f994f5399353e452910160405180910390a1808211156110dc5760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794261736554564c4c696d6974732e5f73657454564c4c696d60448201527f6974733a206d61785065724465706f7369742065786365656473206d6178546f60648201526a74616c4465706f7369747360a81b608482015260a401610410565b606491909155606555565b600054610100900460ff166111525760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610410565b603280546001600160a01b0319166001600160a01b038416179055611178816000611576565b7f1c540707b00eb5427b6b774fc799d756516a54aee108b64b327acc55af557507603260009054906101000a90046001600160a01b0316836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112119190611d18565b604080516001600160a01b03909316835260ff9091166020830152015b60405180910390a15050565b6001600160a01b0381166112c85760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610410565b600054604080516001600160a01b03620100009093048316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6064548111156113a95760405162461bcd60e51b815260206004820152602f60248201527f53747261746567794261736554564c4c696d6974733a206d617820706572206460448201526e195c1bdcda5d08195e18d959591959608a1b6064820152608401610410565b6065546113b4611421565b11156114175760405162461bcd60e51b815260206004820152602c60248201527f53747261746567794261736554564c4c696d6974733a206d6178206465706f7360448201526b1a5d1cc8195e18d95959195960a21b6064820152608401610410565b6106018282611662565b6032546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561146a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148e9190611cff565b905090565b7fd2494f3479e5da49d386657c292c610b5b01df313d07c62eb0cfa49924a31be8816114c784670de0b6b3a7640000611cbe565b6114d19190611cdd565b60405190815260200161122e565b6032546001600160a01b03838116911614610a565760405162461bcd60e51b815260206004820152603b60248201527f5374726174656779426173652e77697468647261773a2043616e206f6e6c792060448201527f77697468647261772074686520737472617465677920746f6b656e00000000006064820152608401610410565b610a566001600160a01b03831684836116de565b6000546201000090046001600160a01b031615801561159d57506001600160a01b03821615155b61161f5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610410565b600181905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26106018261123a565b6032546001600160a01b038381169116146106015760405162461bcd60e51b815260206004820152603660248201527f5374726174656779426173652e6465706f7369743a2043616e206f6e6c79206460448201527532b837b9b4ba103ab73232b9363cb4b733aa37b5b2b760511b6064820152608401610410565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b17905283518085019094528084527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490840152610a569286929160009161176e9185169084906117eb565b805190915015610a56578080602001905181019061178c9190611c0f565b610a565760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610410565b60606117fa8484600085611804565b90505b9392505050565b6060824710156118655760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610410565b6001600160a01b0385163b6118bc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610410565b600080866001600160a01b031685876040516118d89190611d35565b60006040518083038185875af1925050503d8060008114611915576040519150601f19603f3d011682016040523d82523d6000602084013e61191a565b606091505b509150915061192a828286611935565b979650505050505050565b606083156119445750816117fd565b8251156119545782518084602001fd5b8160405162461bcd60e51b81526004016104109190611ae6565b6001600160a01b038116811461054d57600080fd5b6000806000806080858703121561199957600080fd5b843593506020850135925060408501356119b28161196e565b915060608501356119c28161196e565b939692955090935050565b6000602082840312156119df57600080fd5b81356117fd8161196e565b600080604083850312156119fd57600080fd5b50508035926020909101359150565b600060208284031215611a1e57600080fd5b5035919050565b60008060408385031215611a3857600080fd5b8235611a438161196e565b946020939093013593505050565b60008060408385031215611a6457600080fd5b8235611a6f8161196e565b91506020830135611a7f8161196e565b809150509250929050565b60ff8116811461054d57600080fd5b600060208284031215611aab57600080fd5b81356117fd81611a8a565b60005b83811015611ad1578181015183820152602001611ab9565b83811115611ae0576000848401525b50505050565b6020815260008251806020840152611b05816040850160208701611ab6565b601f01601f19169190910160400192915050565b600080600060608486031215611b2e57600080fd5b8335611b398161196e565b92506020840135611b498161196e565b929592945050506040919091013590565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b600060208284031215611bba57600080fd5b81516117fd8161196e565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215611c2157600080fd5b815180151581146117fd57600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611ca257611ca2611c79565b500190565b600082821015611cb957611cb9611c79565b500390565b6000816000190483118215151615611cd857611cd8611c79565b500290565b600082611cfa57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611d1157600080fd5b5051919050565b600060208284031215611d2a57600080fd5b81516117fd81611a8a565b60008251611d47818460208701611ab6565b919091019291505056fe4261736520537472617465677920696d706c656d656e746174696f6e20746f20696e68657269742066726f6d20666f72206d6f726520636f6d706c657820696d706c656d656e746174696f6e73a26469706673582212207629c6ae7de5baead1b34690cf58d97cbb4740b886269a92273b5fcdf7067a4e64736f6c634300080c0033", } // StrategyBaseTVLLimitsABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/StrategyManager/binding.go b/pkg/bindings/StrategyManager/binding.go index b99a93949..abcb759e0 100644 --- a/pkg/bindings/StrategyManager/binding.go +++ b/pkg/bindings/StrategyManager/binding.go @@ -32,11 +32,7 @@ var ( // StrategyManagerMetaData contains all meta data concerning the StrategyManager contract. var StrategyManagerMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_slasher\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"thirdPartyTransfersForbiddenValues\",\"type\":\"bool[]\",\"internalType\":\"bool[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"depositIntoStrategy\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositIntoStrategyWithSignature\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDeposits\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slasher\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlasher\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyShares\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"thirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyWhitelisterChanged\",\"inputs\":[{\"name\":\"previousAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"UpdatedThirdPartyTransfersForbidden\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"value\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"}],\"anonymous\":false}]", -<<<<<<< HEAD Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea26469706673582212203e2db651a846bc3ed5aa43529cb263a5d72b401f60f7beca6bee14b366337d9664736f6c634300080c0033", -======= - Bin: "0x6101006040523480156200001257600080fd5b506040516200338a3803806200338a833981016040819052620000359162000140565b6001600160a01b0380841660805280831660a052811660c0526200005862000065565b50504660e0525062000194565b600054610100900460ff1615620000d25760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000125576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200013d57600080fd5b50565b6000806000606084860312156200015657600080fd5b8351620001638162000127565b6020850151909350620001768162000127565b6040850151909250620001898162000127565b809150509250925092565b60805160a05160c05160e0516131a0620001ea60003960006114bb0152600061046e0152600061028501526000818161051a01528181610b8401528181610ed101528181610f250152611a7101526131a06000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638da5cb5b1161011a578063c6656702116100ad578063df5cf7231161007c578063df5cf72314610515578063e7a050aa1461053c578063f2fde38b1461054f578063f698da2514610562578063fabc1cbc1461056a57600080fd5b8063c6656702146104c9578063cbc2bd62146104dc578063cf756fdf146104ef578063df5b35471461050257600080fd5b8063b1344271116100e9578063b134427114610469578063b5d8b5b814610490578063c4623ea1146104a3578063c608c7f3146104b657600080fd5b80638da5cb5b1461040157806394f649dd14610412578063967fc0d2146104335780639b4da03d1461044657600080fd5b80635ac86ab71161019d5780637a7e0d921161016c5780637a7e0d92146103675780637ecebe0014610392578063886f1195146103b25780638b8aac3c146103c55780638c80d4e5146103ee57600080fd5b80635ac86ab7146103015780635c975abb14610334578063663c1de41461033c578063715018a61461035f57600080fd5b80634665bcda116101d95780634665bcda1461028057806348825e94146102bf5780634e5a4263146102e6578063595c6a67146102f957600080fd5b806310d67a2f1461020b578063136439dd1461022057806320606b701461023357806332e89ace1461026d575b600080fd5b61021e6102193660046129e8565b61057d565b005b61021e61022e366004612a05565b610639565b61025a7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b61025a61027b366004612a34565b610778565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610264565b61025a7f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922481565b61021e6102f4366004612b3d565b610a66565b61021e610a9e565b61032461030f366004612b76565b609854600160ff9092169190911b9081161490565b6040519015158152602001610264565b60985461025a565b61032461034a3660046129e8565b60d16020526000908152604090205460ff1681565b61021e610b65565b61025a610375366004612b99565b60cd60209081526000928352604080842090915290825290205481565b61025a6103a03660046129e8565b60ca6020526000908152604090205481565b6097546102a7906001600160a01b031681565b61025a6103d33660046129e8565b6001600160a01b0316600090815260ce602052604090205490565b61021e6103fc366004612bc7565b610b79565b6033546001600160a01b03166102a7565b6104256104203660046129e8565b610bd2565b604051610264929190612c08565b60cb546102a7906001600160a01b031681565b6103246104543660046129e8565b60d36020526000908152604090205460ff1681565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61021e61049e366004612cd1565b610d52565b61021e6104b1366004612d13565b610ec6565b61021e6104c4366004612d64565b610f1a565b61021e6104d73660046129e8565b610fd2565b6102a76104ea366004612db7565b610fe3565b61021e6104fd366004612d13565b61101b565b61021e610510366004612de3565b61114f565b6102a77f000000000000000000000000000000000000000000000000000000000000000081565b61025a61054a366004612bc7565b611378565b61021e61055d3660046129e8565b611441565b61025a6114b7565b61021e610578366004612a05565b6114f5565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f49190612e4f565b6001600160a01b0316336001600160a01b03161461062d5760405162461bcd60e51b815260040161062490612e6c565b60405180910390fd5b61063681611651565b50565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190612eb6565b6106c15760405162461bcd60e51b815260040161062490612ed3565b6098548181161461073a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b6098546000908190600190811614156107cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156108225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b60026065556001600160a01b038816600090815260d3602052604090205460ff16156108c95760405162461bcd60e51b815260206004820152604a60248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207468697264207472616e736665726064820152691cc8191a5cd8589b195960b21b608482015260a401610624565b4284101561094b5760405162461bcd60e51b815260206004820152604360248201527f53747261746567794d616e616765722e6465706f736974496e746f537472617460448201527f656779576974685369676e61747572653a207369676e617475726520657870696064820152621c995960ea1b608482015260a401610624565b6001600160a01b03858116600081815260ca602090815260408083205481517f4337f82d142e41f2a8c10547cd8c859bddb92262a61058e77842e24d9dea922493810193909352908201939093528b84166060820152928a16608084015260a0830189905260c0830182905260e0830187905290916101000160408051601f1981840301815291815281516020928301206001600160a01b038a16600090815260ca9093529082206001850190559150610a036114b7565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050610a46888288611748565b610a52888c8c8c611907565b60016065559b9a5050505050505050505050565b60cb546001600160a01b03163314610a905760405162461bcd60e51b815260040161062490612f1b565b610a9a8282611ad6565b5050565b60975460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190612eb6565b610b265760405162461bcd60e51b815260040161062490612ed3565b600019609881905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610b6d611b44565b610b776000611b9e565b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc15760405162461bcd60e51b815260040161062490612f85565b610bcc838383611bf0565b50505050565b6001600160a01b038116600090815260ce60205260408120546060918291908167ffffffffffffffff811115610c0a57610c0a612a1e565b604051908082528060200260200182016040528015610c33578160200160208202803683370190505b50905060005b82811015610cc4576001600160a01b038616600090815260cd6020908152604080832060ce9092528220805491929184908110610c7857610c78612fe3565b60009182526020808320909101546001600160a01b031683528201929092526040019020548251839083908110610cb157610cb1612fe3565b6020908102919091010152600101610c39565b5060ce6000866001600160a01b03166001600160a01b031681526020019081526020016000208181805480602002602001604051908101604052809291908181526020018280548015610d4057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d22575b50505050509150935093505050915091565b60cb546001600160a01b03163314610d7c5760405162461bcd60e51b815260040161062490612f1b565b8060005b81811015610bcc5760d16000858584818110610d9e57610d9e612fe3565b9050602002016020810190610db391906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1615610ebe57600060d16000868685818110610ded57610ded612fe3565b9050602002016020810190610e0291906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f4074413b4b443e4e58019f2855a8765113358c7c72e39509c6af45fc0f5ba030848483818110610e5d57610e5d612fe3565b9050602002016020810190610e7291906129e8565b6040516001600160a01b03909116815260200160405180910390a1610ebe848483818110610ea257610ea2612fe3565b9050602002016020810190610eb791906129e8565b6000611ad6565b600101610d80565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0e5760405162461bcd60e51b815260040161062490612f85565b610bcc84848484611d4c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f625760405162461bcd60e51b815260040161062490612f85565b604051636ce5768960e11b81526001600160a01b03858116600483015282811660248301526044820184905284169063d9caed1290606401600060405180830381600087803b158015610fb457600080fd5b505af1158015610fc8573d6000803e3d6000fd5b5050505050505050565b610fda611b44565b61063681611fd9565b60ce6020528160005260406000208181548110610fff57600080fd5b6000918252602090912001546001600160a01b03169150829050565b600054610100900460ff161580801561103b5750600054600160ff909116105b806110555750303b158015611055575060005460ff166001145b6110b85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610624565b6000805460ff1916600117905580156110db576000805461ff0019166101001790555b6110e3612042565b60c9556110f083836120d9565b6110f985611b9e565b61110284611fd9565b8015611148576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b60cb546001600160a01b031633146111795760405162461bcd60e51b815260040161062490612f1b565b8281146112025760405162461bcd60e51b815260206004820152604b60248201527f53747261746567794d616e616765722e61646453747261746567696573546f4460448201527f65706f73697457686974656c6973743a206172726179206c656e67746873206460648201526a0de40dcdee840dac2e8c6d60ab1b608482015260a401610624565b8260005b818110156113705760d1600087878481811061122457611224612fe3565b905060200201602081019061123991906129e8565b6001600160a01b0316815260208101919091526040016000205460ff1661136857600160d1600088888581811061127257611272612fe3565b905060200201602081019061128791906129e8565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790557f0c35b17d91c96eb2751cd456e1252f42a386e524ef9ff26ecc9950859fdc04fe8686838181106112e2576112e2612fe3565b90506020020160208101906112f791906129e8565b6040516001600160a01b03909116815260200160405180910390a161136886868381811061132757611327612fe3565b905060200201602081019061133c91906129e8565b85858481811061134e5761134e612fe3565b90506020020160208101906113639190612ff9565b611ad6565b600101611206565b505050505050565b6098546000908190600190811614156113cf5760405162461bcd60e51b815260206004820152601960248201527814185d5cd8589b194e881a5b99195e081a5cc81c185d5cd959603a1b6044820152606401610624565b600260655414156114225760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610624565b600260655561143333868686611907565b600160655595945050505050565b611449611b44565b6001600160a01b0381166114ae5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610624565b61063681611b9e565b60007f00000000000000000000000000000000000000000000000000000000000000004614156114e8575060c95490565b6114f0612042565b905090565b609760009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611548573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061156c9190612e4f565b6001600160a01b0316336001600160a01b03161461159c5760405162461bcd60e51b815260040161062490612e6c565b60985419811960985419161461161a5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610624565b609881905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200161076d565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610624565b609754604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1609780546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383163b1561186757604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e90611788908690869060040161306e565b602060405180830381865afa1580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613087565b6001600160e01b031916146118625760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610624565b505050565b826001600160a01b031661187b83836121bf565b6001600160a01b0316146118625760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610624565b6001600160a01b038316600090815260d16020526040812054849060ff166119ad5760405162461bcd60e51b815260206004820152604d60248201527f53747261746567794d616e616765722e6f6e6c7953747261746567696573576860448201527f6974656c6973746564466f724465706f7369743a207374726174656779206e6f60648201526c1d081dda1a5d195b1a5cdd1959609a1b608482015260a401610624565b6119c26001600160a01b0385163387866121e3565b6040516311f9fbc960e21b81526001600160a01b038581166004830152602482018590528616906347e7ef24906044016020604051808303816000875af1158015611a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3591906130b1565b9150611a4386858785611d4c565b604051631452b9d760e11b81526001600160a01b0387811660048301528681166024830152604482018490527f000000000000000000000000000000000000000000000000000000000000000016906328a573ae90606401600060405180830381600087803b158015611ab557600080fd5b505af1158015611ac9573d6000803e3d6000fd5b5050505050949350505050565b604080516001600160a01b038416815282151560208201527f77d930df4937793473a95024d87a98fd2ccb9e92d3c2463b3dacd65d3e6a5786910160405180910390a16001600160a01b0391909116600090815260d360205260409020805460ff1916911515919091179055565b6033546001600160a01b03163314610b775760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610624565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081611c655760405162461bcd60e51b815260206004820152603e60248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a207360448201527f68617265416d6f756e742073686f756c64206e6f74206265207a65726f2100006064820152608401610624565b6001600160a01b03808516600090815260cd602090815260408083209387168352929052205480831115611cf75760405162461bcd60e51b815260206004820152603360248201527f53747261746567794d616e616765722e5f72656d6f76655368617265733a20736044820152720d0c2e4ca82dadeeadce840e8dede40d0d2ced606b1b6064820152608401610624565b6001600160a01b03808616600090815260cd602090815260408083209388168352929052208382039081905590831415611d3f57611d35858561223d565b6001915050611d45565b60009150505b9392505050565b6001600160a01b038416611dc85760405162461bcd60e51b815260206004820152603960248201527f53747261746567794d616e616765722e5f6164645368617265733a207374616b60448201527f65722063616e6e6f74206265207a65726f2061646472657373000000000000006064820152608401610624565b80611e345760405162461bcd60e51b815260206004820152603660248201527f53747261746567794d616e616765722e5f6164645368617265733a207368617260448201527565732073686f756c64206e6f74206265207a65726f2160501b6064820152608401610624565b6001600160a01b03808516600090815260cd6020908152604080832093861683529290522054611f45576001600160a01b038416600090815260ce602090815260409091205410611f065760405162461bcd60e51b815260206004820152605060248201527f53747261746567794d616e616765722e5f6164645368617265733a206465706f60448201527f73697420776f756c6420657863656564204d41585f5354414b45525f5354524160648201526f0a88a8eb2be9892a6a8be988a9c8ea8960831b608482015260a401610624565b6001600160a01b03848116600090815260ce602090815260408220805460018101825590835291200180546001600160a01b0319169184169190911790555b6001600160a01b03808516600090815260cd6020908152604080832093861683529290529081208054839290611f7c9084906130e0565b9091555050604080516001600160a01b03868116825285811660208301528416818301526060810183905290517f7cfff908a4b583f36430b25d75964c458d8ede8a99bd61be750e97ee1b2f3a969181900360800190a150505050565b60cb54604080516001600160a01b03928316815291831660208301527f4264275e593955ff9d6146a51a4525f6ddace2e81db9391abcc9d1ca48047d29910160405180910390a160cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6097546001600160a01b03161580156120fa57506001600160a01b03821615155b61217c5760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610624565b609881905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2610a9a82611651565b60008060006121ce858561242f565b915091506121db8161249f565b509392505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610bcc90859061265a565b6001600160a01b038216600090815260ce6020526040812054905b81811015612358576001600160a01b03848116600090815260ce602052604090208054918516918390811061228f5761228f612fe3565b6000918252602090912001546001600160a01b03161415612350576001600160a01b038416600090815260ce6020526040902080546122d0906001906130f8565b815481106122e0576122e0612fe3565b60009182526020808320909101546001600160a01b03878116845260ce909252604090922080549190921691908390811061231d5761231d612fe3565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550612358565b600101612258565b818114156123e05760405162461bcd60e51b815260206004820152604960248201527f53747261746567794d616e616765722e5f72656d6f766553747261746567794660448201527f726f6d5374616b657253747261746567794c6973743a207374726174656779206064820152681b9bdd08199bdd5b9960ba1b608482015260a401610624565b6001600160a01b038416600090815260ce602052604090208054806124075761240761310f565b600082815260209020810160001990810180546001600160a01b031916905501905550505050565b6000808251604114156124665760208301516040840151606085015160001a61245a8782858561272c565b94509450505050612498565b8251604014156124905760208301516040840151612485868383612819565b935093505050612498565b506000905060025b9250929050565b60008160048111156124b3576124b3613125565b14156124bc5750565b60018160048111156124d0576124d0613125565b141561251e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610624565b600281600481111561253257612532613125565b14156125805760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610624565b600381600481111561259457612594613125565b14156125ed5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610624565b600481600481111561260157612601613125565b14156106365760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610624565b60006126af826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128529092919063ffffffff16565b80519091501561186257808060200190518101906126cd9190612eb6565b6118625760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610624565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156127635750600090506003612810565b8460ff16601b1415801561277b57508460ff16601c14155b1561278c5750600090506004612810565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156127e0573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661280957600060019250925050612810565b9150600090505b94509492505050565b6000806001600160ff1b0383168161283660ff86901c601b6130e0565b90506128448782888561272c565b935093505050935093915050565b60606128618484600085612869565b949350505050565b6060824710156128ca5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610624565b6001600160a01b0385163b6129215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610624565b600080866001600160a01b0316858760405161293d919061313b565b60006040518083038185875af1925050503d806000811461297a576040519150601f19603f3d011682016040523d82523d6000602084013e61297f565b606091505b509150915061298f82828661299a565b979650505050505050565b606083156129a9575081611d45565b8251156129b95782518084602001fd5b8160405162461bcd60e51b81526004016106249190613157565b6001600160a01b038116811461063657600080fd5b6000602082840312156129fa57600080fd5b8135611d45816129d3565b600060208284031215612a1757600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215612a4d57600080fd5b8635612a58816129d3565b95506020870135612a68816129d3565b9450604087013593506060870135612a7f816129d3565b92506080870135915060a087013567ffffffffffffffff80821115612aa357600080fd5b818901915089601f830112612ab757600080fd5b813581811115612ac957612ac9612a1e565b604051601f8201601f19908116603f01168101908382118183101715612af157612af1612a1e565b816040528281528c6020848701011115612b0a57600080fd5b8260208601602083013760006020848301015280955050505050509295509295509295565b801515811461063657600080fd5b60008060408385031215612b5057600080fd5b8235612b5b816129d3565b91506020830135612b6b81612b2f565b809150509250929050565b600060208284031215612b8857600080fd5b813560ff81168114611d4557600080fd5b60008060408385031215612bac57600080fd5b8235612bb7816129d3565b91506020830135612b6b816129d3565b600080600060608486031215612bdc57600080fd5b8335612be7816129d3565b92506020840135612bf7816129d3565b929592945050506040919091013590565b604080825283519082018190526000906020906060840190828701845b82811015612c4a5781516001600160a01b031684529284019290840190600101612c25565b5050508381038285015284518082528583019183019060005b81811015612c7f57835183529284019291840191600101612c63565b5090979650505050505050565b60008083601f840112612c9e57600080fd5b50813567ffffffffffffffff811115612cb657600080fd5b6020830191508360208260051b850101111561249857600080fd5b60008060208385031215612ce457600080fd5b823567ffffffffffffffff811115612cfb57600080fd5b612d0785828601612c8c565b90969095509350505050565b60008060008060808587031215612d2957600080fd5b8435612d34816129d3565b93506020850135612d44816129d3565b92506040850135612d54816129d3565b9396929550929360600135925050565b60008060008060808587031215612d7a57600080fd5b8435612d85816129d3565b93506020850135612d95816129d3565b9250604085013591506060850135612dac816129d3565b939692955090935050565b60008060408385031215612dca57600080fd5b8235612dd5816129d3565b946020939093013593505050565b60008060008060408587031215612df957600080fd5b843567ffffffffffffffff80821115612e1157600080fd5b612e1d88838901612c8c565b90965094506020870135915080821115612e3657600080fd5b50612e4387828801612c8c565b95989497509550505050565b600060208284031215612e6157600080fd5b8151611d45816129d3565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b600060208284031215612ec857600080fd5b8151611d4581612b2f565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526044908201527f53747261746567794d616e616765722e6f6e6c7953747261746567795768697460408201527f656c69737465723a206e6f742074686520737472617465677957686974656c6960608201526339ba32b960e11b608082015260a00190565b602080825260409082018190527f53747261746567794d616e616765722e6f6e6c7944656c65676174696f6e4d61908201527f6e616765723a206e6f74207468652044656c65676174696f6e4d616e61676572606082015260800190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561300b57600080fd5b8135611d4581612b2f565b60005b83811015613031578181015183820152602001613019565b83811115610bcc5750506000910152565b6000815180845261305a816020860160208601613016565b601f01601f19169290920160200192915050565b8281526040602082015260006128616040830184613042565b60006020828403121561309957600080fd5b81516001600160e01b031981168114611d4557600080fd5b6000602082840312156130c357600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156130f3576130f36130ca565b500190565b60008282101561310a5761310a6130ca565b500390565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b6000825161314d818460208701613016565b9190910192915050565b602081526000611d45602083018461304256fea2646970667358221220dc14c7a334bdf15ef0e4c47d225197940d194d46b487b1caf203e28f6580419564736f6c634300080c0033", ->>>>>>> 500e0254 (feat: operator commission bips (#627)) } // StrategyManagerABI is the input ABI used to generate the binding from. diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index e4d1cfc0b..027d92e41 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -1046,6 +1046,7 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni bytes32 salt, uint8 numOids ) public { + numOperators = uint8(bound(numOperators, 1, 100)); // Create Operator Set IDs uint32[] memory oids = new uint32[](numOids); for (uint32 i = 0; i < numOids; i++) { diff --git a/src/test/unit/RewardsCoordinatorUnit.t.sol b/src/test/unit/RewardsCoordinatorUnit.t.sol index 9bf2a8806..8b483be35 100644 --- a/src/test/unit/RewardsCoordinatorUnit.t.sol +++ b/src/test/unit/RewardsCoordinatorUnit.t.sol @@ -2147,12 +2147,15 @@ contract RewardsCoordinatorUnitTests_disableRoot is RewardsCoordinatorUnitTests } contract RewardsCoordinatorUnitTests_operatorCommission is RewardsCoordinatorUnitTests { + uint8 numberOfRewardTypes = 1; + function testFuzz_operatorCommissionBips_EmptyHistory( address operator, IAVSDirectory.OperatorSet calldata operatorSet, uint8 rewardTypeEnum ) public { - IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(uint8(bound(rewardTypeEnum, 0, 1))); + rewardTypeEnum = uint8(bound(rewardTypeEnum, 0, numberOfRewardTypes - 1)); + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(rewardTypeEnum); rewardType = IRewardsCoordinator.RewardType(uint8(bound(uint256(rewardType), 0, 1))); // Check operator commission uint32 operatorCommissionBipsStored = rewardsCoordinator.getOperatorCommissionBips(operator, operatorSet, rewardType); @@ -2169,7 +2172,8 @@ contract RewardsCoordinatorUnitTests_operatorCommission is RewardsCoordinatorUni uint8 rewardTypeEnum, uint16 newOperatorCommissionBips ) public filterFuzzedAddressInputs(operator) { - IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(uint8(bound(rewardTypeEnum, 0, 1))); + rewardTypeEnum = uint8(bound(rewardTypeEnum, 0, numberOfRewardTypes - 1)); + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(rewardTypeEnum); cheats.assume(newOperatorCommissionBips > MAX_COMMISSION_BIPS); cheats.expectRevert("RewardsCoordinator.setOperatorCommissionBips: commissionBips too high"); cheats.prank(operator); @@ -2184,7 +2188,8 @@ contract RewardsCoordinatorUnitTests_operatorCommission is RewardsCoordinatorUni uint16 newOperatorCommissionBips, uint256 randSalt ) public filterFuzzedAddressInputs(operator) { - IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(uint8(bound(rewardTypeEnum, 0, 1))); + rewardTypeEnum = uint8(bound(rewardTypeEnum, 0, numberOfRewardTypes - 1)); + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(rewardTypeEnum); cheats.assume(newOperatorCommissionBips != globalCommissionBips); cheats.assume(newOperatorCommissionBips <= MAX_COMMISSION_BIPS); // 1. Set operator commission and check updated value hasn't taken effect yet @@ -2228,7 +2233,8 @@ contract RewardsCoordinatorUnitTests_operatorCommission is RewardsCoordinatorUni uint16 newOperatorCommissionBips, uint256 randSalt ) public filterFuzzedAddressInputs(operator) { - IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(uint8(bound(rewardTypeEnum, 0, 1))); + rewardTypeEnum = uint8(bound(rewardTypeEnum, 0, numberOfRewardTypes - 1)); + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(rewardTypeEnum); cheats.assume(newOperatorCommissionBips <= MAX_COMMISSION_BIPS); // 1. Set operator commission to initial value with existing history @@ -2298,7 +2304,8 @@ contract RewardsCoordinatorUnitTests_operatorCommission is RewardsCoordinatorUni uint16 pendingCommissionBips, uint16 overwriteCommissionBips ) public filterFuzzedAddressInputs(operator) { - IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(uint8(bound(rewardTypeEnum, 0, 1))); + rewardTypeEnum = uint8(bound(rewardTypeEnum, 0, numberOfRewardTypes - 1)); + IRewardsCoordinator.RewardType rewardType = IRewardsCoordinator.RewardType(rewardTypeEnum); cheats.assume(pendingCommissionBips <= MAX_COMMISSION_BIPS); cheats.assume(overwriteCommissionBips <= MAX_COMMISSION_BIPS); cheats.prank(operator); From cfca835459659c1a6e92faa6d33be8a5b798396e Mon Sep 17 00:00:00 2001 From: "clandestine.eth" <96172957+0xClandestine@users.noreply.github.com> Date: Fri, 9 Aug 2024 15:24:43 -0400 Subject: [PATCH 34/43] Feat: enumerating sets operators are in (#662) * feat: track sets operators in * feat: add natspec * refactor: reorganize * fix: tests passing * fix: compile warnings * fix: test passing * feat: add `operatorSetsMemberOf` pagination * test: add coverage * chore: bindings --------- Co-authored-by: Yash Patil --- pkg/bindings/AVSDirectory/binding.go | 121 ++++++++++++++++-- pkg/bindings/AVSDirectoryStorage/binding.go | 26 ++-- pkg/bindings/IAVSDirectory/binding.go | 26 ++-- pkg/bindings/RewardsCoordinator/binding.go | 2 +- .../mainnet/Deploy_Strategy_Factory.s.sol | 61 +++++++++ src/contracts/core/AVSDirectory.sol | 77 +++++++++-- src/contracts/core/AVSDirectoryStorage.sol | 11 +- src/contracts/interfaces/IAVSDirectory.sol | 2 +- src/test/mocks/AVSDirectoryMock.sol | 2 + src/test/unit/AVSDirectoryUnit.t.sol | 118 ++++++++++++----- 10 files changed, 357 insertions(+), 89 deletions(-) create mode 100644 script/deploy/mainnet/Deploy_Strategy_Factory.s.sol diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 68532389b..3930e2d0e 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -44,8 +44,8 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetMemberCount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x60c06040523480156200001157600080fd5b506040516200390b3803806200390b833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a05161378d6200017e6000396000612011015260008181610576015281816109f20152611220015261378d6000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80639926ee7d11610125578063d79aceab116100ad578063ec76f4421161007c578063ec76f44214610598578063ef2dfa8d146105cc578063f2fde38b146105df578063f698da25146105f2578063fabc1cbc146105fa57600080fd5b8063d79aceab146104f8578063dae226b61461051f578063dce974b91461054a578063df5cf7231461057157600080fd5b8063aec205c5116100f4578063aec205c514610490578063afe02ed514610498578063b2841d48146104ab578063c1a8e2c5146104be578063c825fe68146104d157600080fd5b80639926ee7d14610444578063a1060c8814610457578063a364f4da1461046a578063a98fb3551461047d57600080fd5b8063595c6a67116101a85780637673e93a116101775780637673e93a146103a457806384d76f7b146103c7578063886f1195146103f55780638da5cb5b14610420578063955e66961461043157600080fd5b8063595c6a67146103695780635ac86ab7146103715780635c975abb14610394578063715018a61461039c57600080fd5b806320606b70116101ef57806320606b701461026f578063374823b5146102a95780633c4385d0146102e75780633fee332d1461031b57806349075da31461032e57600080fd5b806310d67a2f14610221578063136439dd146102365780631794bb3c146102495780631e2199e21461025c575b600080fd5b61023461022f366004612d07565b61060d565b005b610234610244366004612d2b565b6106c9565b610234610257366004612d44565b610808565b61023461026a366004612ee9565b610932565b6102967f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6040519081526020015b60405180910390f35b6102d76102b7366004612f64565b609960209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016102a0565b6102d76102f5366004612fa9565b609c60209081526000938452604080852082529284528284209052825290205460ff1681565b610234610329366004612ff0565b610c52565b61035c61033c36600461307e565b609860209081526000928352604080842090915290825290205460ff1681565b6040516102a091906130cd565b610234610e9c565b6102d761037f3660046130f5565b606654600160ff9092169190911b9081161490565b606654610296565b610234610f63565b6102d76103b2366004612d07565b609a6020526000908152604090205460ff1681565b6102d76103d5366004613118565b609b60209081526000928352604080842090915290825290205460ff1681565b606554610408906001600160a01b031681565b6040516001600160a01b0390911681526020016102a0565b6033546001600160a01b0316610408565b61029661043f36600461314d565b610f77565b6102346104523660046131b3565b610fdc565b610296610465366004613202565b6113aa565b610234610478366004612d07565b611414565b61023461048b366004613248565b611551565b610234611598565b6102346104a63660046132b9565b611660565b6102966104b936600461314d565b61182d565b6102346104cc3660046132fa565b61186d565b6102967f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6102967fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b61029661052d366004613118565b609d60209081526000928352604080842090915290825290205481565b6102967f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6102346105a6366004612d2b565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b6102346105da36600461334e565b6118a2565b6102346105ed366004612d07565b611c4b565b610296611cc1565b610234610608366004612d2b565b611cd0565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610660573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061068491906133b9565b6001600160a01b0316336001600160a01b0316146106bd5760405162461bcd60e51b81526004016106b4906133d6565b60405180910390fd5b6106c681611e2c565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107359190613420565b6107515760405162461bcd60e51b81526004016106b490613442565b606654818116146107ca5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156108285750600054600160ff909116105b806108425750303b158015610842575060005460ff166001145b6108a55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016106b4565b6000805460ff1916600117905580156108c8576000805461ff0019166101001790555b6108d28383611f23565b6108da61200d565b6097556108e6846120d6565b801561092c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b6066546001906002908116141561095b5760405162461bcd60e51b81526004016106b49061348a565b42826040015110156109d35760405162461bcd60e51b8152602060048201526047602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a4016106b4565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610a39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5d9190613420565b610adc5760405162461bcd60e51b8152602060048201526056602482015260008051602061371883398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a4016106b4565b336000908152609a602052604090205460ff16610b635760405162461bcd60e51b815260206004820152604b602482015260008051602061371883398151915260448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b6001600160a01b038516600090815260996020908152604080832085830151845290915290205460ff1615610bee5760405162461bcd60e51b815260206004820152603f602482015260008051602061371883398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e740060648201526084016106b4565b610c0e85610c0733878787602001518860400151610f77565b8451612128565b6001600160a01b03851660009081526099602090815260408083208583015184529091529020805460ff19166001179055610c4b853386866122e2565b5050505050565b60665460019060029081161415610c7b5760405162461bcd60e51b81526004016106b49061348a565b815151610d1357336001600160a01b03871614610d0e5760405162461bcd60e51b815260206004820152604560248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2063616c6c6572206d757374206265206f70656064820152643930ba37b960d91b608482015260a4016106b4565b610e88565b4282604001511015610d9e5760405162461bcd60e51b815260206004820152604860248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a206f70657261746f72207369676e617475726560648201526708195e1c1a5c995960c21b608482015260a4016106b4565b6001600160a01b038616600090815260996020908152604080832085830151845290915290205460ff1615610e3d576040805162461bcd60e51b81526020600482015260248101919091527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2073616c7420616c7265616479207370656e7460648201526084016106b4565b610e5686610c078787878760200151886040015161182d565b6001600160a01b03861660009081526099602090815260408083208583015184529091529020805460ff191660011790555b610e948587868661264c565b505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610ee4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f089190613420565b610f245760405162461bcd60e51b81526004016106b490613442565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b610f6b6128dc565b610f7560006120d6565b565b6000610fd27f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f9298787878787604051602001610fb796959493929190613505565b60405160208183030381529060405280519060200120612936565b9695505050505050565b606654600090600190811614156110055760405162461bcd60e51b81526004016106b49061348a565b428260400151101561106d5760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a206f70657261746f72207369676e61747572652065787069726564000060648201526084016106b4565b336000908152609a602052604090205460ff16156110e15760405162461bcd60e51b815260206004820152603e602482015260008051602061373883398151915260448201527f56533a2041565320697320616e206f70657261746f722073657420415653000060648201526084016106b4565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff16600181111561111b5761111b6130b7565b141561117d5760405162461bcd60e51b815260206004820152603f602482015260008051602061373883398151915260448201527f56533a206f70657261746f7220616c726561647920726567697374657265640060648201526084016106b4565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156112015760405162461bcd60e51b815260206004820152603660248201526000805160206137388339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b60648201526084016106b4565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128b9190613420565b6113015760405162461bcd60e51b815260206004820152604d602482015260008051602061373883398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a4016106b4565b61131983610c078533866020015187604001516113aa565b6001600160a01b038316600081815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161139d91906130cd565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a0810182905260009061140b9060c001610fb7565b95945050505050565b6066546000906001908116141561143d5760405162461bcd60e51b81526004016106b49061348a565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115611477576114776130b7565b146114ea5760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f7420726567697374657265640060648201526084016106b4565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161154591906130cd565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713838360405161158c929190613545565b60405180910390a25050565b336000908152609a602052604090205460ff161561161e5760405162461bcd60e51b815260206004820152603e60248201527f4156534469726563746f72792e6265636f6d654f70657261746f72536574415660448201527f533a20616c726561647920616e206f70657261746f722073657420415653000060648201526084016106b4565b336000818152609a6020526040808220805460ff19166001179055517f702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf9190a2565b60005b8181101561182857336000908152609b602052604081209084848481811061168d5761168d613574565b90506020020160208101906116a2919061358a565b63ffffffff16815260208101919091526040016000205460ff161561172f5760405162461bcd60e51b815260206004820152603b60248201527f4156534469726563746f72792e6372656174654f70657261746f725365743a2060448201527f6f70657261746f722073657420616c726561647920657869737473000000000060648201526084016106b4565b336000908152609b6020526040812060019185858581811061175357611753613574565b9050602002016020810190611768919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280336001600160a01b031681526020018585858181106117e6576117e6613574565b90506020020160208101906117fb919061358a565b63ffffffff16905260405161181091906135a5565b60405180910390a1611821816135e1565b9050611663565b505050565b6000610fd27f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe4958787878787604051602001610fb796959493929190613505565b606654600190600290811614156118965760405162461bcd60e51b81526004016106b49061348a565b61092c3385858561264c565b606654600190600290811614156118cb5760405162461bcd60e51b81526004016106b49061348a565b336000908152609a602052604090205460ff166119645760405162461bcd60e51b815260206004820152604b60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a4016106b4565b60005b84811015610e945760013360009081526098602052604081209088888581811061199357611993613574565b90506020020160208101906119a89190612d07565b6001600160a01b0316815260208101919091526040016000205460ff1660018111156119d6576119d66130b7565b14611a825760405162461bcd60e51b815260206004820152606a60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a206f70657261746f7220616c7265616479206d6960648201527f677261746564206f72206e6f742061206c656761637920726567697374657265608482015269321037b832b930ba37b960b11b60a482015260c4016106b4565b611ad6868683818110611a9757611a97613574565b9050602002016020810190611aac9190612d07565b33868685818110611abf57611abf613574565b9050602002810190611ad191906135fc565b6122e2565b33600090815260986020526040812081888885818110611af857611af8613574565b9050602002016020810190611b0d9190612d07565b6001600160a01b031681526020810191909152604001600020805460ff191660018381811115611b3f57611b3f6130b7565b021790555033868683818110611b5757611b57613574565b9050602002016020810190611b6c9190612d07565b6001600160a01b03167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416000604051611ba591906130cd565b60405180910390a333868683818110611bc057611bc0613574565b9050602002016020810190611bd59190612d07565b6001600160a01b03167f54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01868685818110611c1157611c11613574565b9050602002810190611c2391906135fc565b604051611c31929190613645565b60405180910390a380611c43816135e1565b915050611967565b611c536128dc565b6001600160a01b038116611cb85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b4565b6106c6816120d6565b6000611ccb61200d565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4791906133b9565b6001600160a01b0316336001600160a01b031614611d775760405162461bcd60e51b81526004016106b4906133d6565b606654198119606654191614611df55760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c697479000000000000000060648201526084016106b4565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107fd565b6001600160a01b038116611eba5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a4016106b4565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b0316158015611f4457506001600160a01b03821615155b611fc65760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a4016106b4565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261200982611e2c565b5050565b60007f000000000000000000000000000000000000000000000000000000000000000046141561203e575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561224257604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906121689086908690600401613661565b602060405180830381865afa158015612185573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a991906136be565b6001600160e01b031916146118285760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a4016106b4565b826001600160a01b0316612256838361297d565b6001600160a01b0316146118285760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a4016106b4565b60005b81811015610c4b576001600160a01b0384166000908152609b602052604081209084848481811061231857612318613574565b905060200201602081019061232d919061358a565b63ffffffff16815260208101919091526040016000205460ff166123c45760405162461bcd60e51b815260206004820152604260248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a20696e76616c6964206f70657261746f722073606482015261195d60f21b608482015260a4016106b4565b6001600160a01b038085166000908152609c602090815260408083209389168352929052908120908484848181106123fe576123fe613574565b9050602002016020810190612413919061358a565b63ffffffff16815260208101919091526040016000205460ff16156124c65760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a206f70657261746f7220616c7265616479207260648201527f65676973746572656420746f206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0384166000908152609d60205260408120908484848181106124f1576124f1613574565b9050602002016020810190612506919061358a565b63ffffffff1663ffffffff1681526020019081526020016000206000815461252d906135e1565b909155506001600160a01b038085166000908152609c60209081526040808320938916835292905290812060019185858581811061256d5761256d613574565b9050602002016020810190612582919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550846001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e6040518060400160405280876001600160a01b0316815260200186868681811061260a5761260a613574565b905060200201602081019061261f919061358a565b63ffffffff16905260405161263491906135a5565b60405180910390a2612645816135e1565b90506122e5565b60005b81811015610c4b576001600160a01b038086166000908152609c6020908152604080832093881683529290529081209084848481811061269157612691613574565b90506020020160208101906126a6919061358a565b63ffffffff16815260208101919091526040016000205460ff166127585760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f646572656769737465724f70657261746f7260448201527f46726f6d4f70657261746f725365743a206f70657261746f72206e6f7420726560648201527f676973746572656420666f72206f70657261746f722073657400000000000000608482015260a4016106b4565b6001600160a01b0385166000908152609d602052604081209084848481811061278357612783613574565b9050602002016020810190612798919061358a565b63ffffffff1663ffffffff168152602001908152602001600020600081546127bf906136e8565b909155506001600160a01b038086166000908152609c602090815260408083209388168352929052908120818585858181106127fd576127fd613574565b9050602002016020810190612812919061358a565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550836001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe6040518060400160405280886001600160a01b0316815260200186868681811061289a5761289a613574565b90506020020160208101906128af919061358a565b63ffffffff1690526040516128c491906135a5565b60405180910390a26128d5816135e1565b905061264f565b6033546001600160a01b03163314610f755760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106b4565b600061294061200d565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b600080600061298c85856129a1565b9150915061299981612a11565b509392505050565b6000808251604114156129d85760208301516040840151606085015160001a6129cc87828585612bcc565b94509450505050612a0a565b825160401415612a0257602083015160408401516129f7868383612cb9565b935093505050612a0a565b506000905060025b9250929050565b6000816004811115612a2557612a256130b7565b1415612a2e5750565b6001816004811115612a4257612a426130b7565b1415612a905760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106b4565b6002816004811115612aa457612aa46130b7565b1415612af25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106b4565b6003816004811115612b0657612b066130b7565b1415612b5f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106b4565b6004816004811115612b7357612b736130b7565b14156106c65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106b4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612c035750600090506003612cb0565b8460ff16601b14158015612c1b57508460ff16601c14155b15612c2c5750600090506004612cb0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612c80573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612ca957600060019250925050612cb0565b9150600090505b94509492505050565b6000806001600160ff1b03831681612cd660ff86901c601b6136ff565b9050612ce487828885612bcc565b935093505050935093915050565b6001600160a01b03811681146106c657600080fd5b600060208284031215612d1957600080fd5b8135612d2481612cf2565b9392505050565b600060208284031215612d3d57600080fd5b5035919050565b600080600060608486031215612d5957600080fd5b8335612d6481612cf2565b92506020840135612d7481612cf2565b929592945050506040919091013590565b60008083601f840112612d9757600080fd5b5081356001600160401b03811115612dae57600080fd5b6020830191508360208260051b8501011115612a0a57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612e0157612e01612dc9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e2f57612e2f612dc9565b604052919050565b600060608284031215612e4957600080fd5b612e51612ddf565b905081356001600160401b0380821115612e6a57600080fd5b818401915084601f830112612e7e57600080fd5b8135602082821115612e9257612e92612dc9565b612ea4601f8301601f19168201612e07565b92508183528681838601011115612eba57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b60008060008060608587031215612eff57600080fd5b8435612f0a81612cf2565b935060208501356001600160401b0380821115612f2657600080fd5b612f3288838901612d85565b90955093506040870135915080821115612f4b57600080fd5b50612f5887828801612e37565b91505092959194509250565b60008060408385031215612f7757600080fd5b8235612f8281612cf2565b946020939093013593505050565b803563ffffffff81168114612fa457600080fd5b919050565b600080600060608486031215612fbe57600080fd5b8335612fc981612cf2565b92506020840135612fd981612cf2565b9150612fe760408501612f90565b90509250925092565b60008060008060006080868803121561300857600080fd5b853561301381612cf2565b9450602086013561302381612cf2565b935060408601356001600160401b038082111561303f57600080fd5b61304b89838a01612d85565b9095509350606088013591508082111561306457600080fd5b5061307188828901612e37565b9150509295509295909350565b6000806040838503121561309157600080fd5b823561309c81612cf2565b915060208301356130ac81612cf2565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b60208101600283106130ef57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561310757600080fd5b813560ff81168114612d2457600080fd5b6000806040838503121561312b57600080fd5b823561313681612cf2565b915061314460208401612f90565b90509250929050565b60008060008060006080868803121561316557600080fd5b853561317081612cf2565b945060208601356001600160401b0381111561318b57600080fd5b61319788828901612d85565b9699909850959660408101359660609091013595509350505050565b600080604083850312156131c657600080fd5b82356131d181612cf2565b915060208301356001600160401b038111156131ec57600080fd5b6131f885828601612e37565b9150509250929050565b6000806000806080858703121561321857600080fd5b843561322381612cf2565b9350602085013561323381612cf2565b93969395505050506040820135916060013590565b6000806020838503121561325b57600080fd5b82356001600160401b038082111561327257600080fd5b818501915085601f83011261328657600080fd5b81358181111561329557600080fd5b8660208285010111156132a757600080fd5b60209290920196919550909350505050565b600080602083850312156132cc57600080fd5b82356001600160401b038111156132e257600080fd5b6132ee85828601612d85565b90969095509350505050565b60008060006040848603121561330f57600080fd5b833561331a81612cf2565b925060208401356001600160401b0381111561333557600080fd5b61334186828701612d85565b9497909650939450505050565b6000806000806040858703121561336457600080fd5b84356001600160401b038082111561337b57600080fd5b61338788838901612d85565b909650945060208701359150808211156133a057600080fd5b506133ad87828801612d85565b95989497509550505050565b6000602082840312156133cb57600080fd5b8151612d2481612cf2565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561343257600080fd5b81518015158114612d2457600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b8183526000602080850194508260005b858110156134fa5763ffffffff6134e783612f90565b16875295820195908201906001016134d1565b509495945050505050565b8681526001600160a01b038616602082015260a06040820181905260009061353090830186886134c1565b60608301949094525060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561359c57600080fd5b612d2482612f90565b81516001600160a01b0316815260209182015163ffffffff169181019190915260400190565b634e487b7160e01b600052601160045260246000fd5b60006000198214156135f5576135f56135cb565b5060010190565b6000808335601e1984360301811261361357600080fd5b8301803591506001600160401b0382111561362d57600080fd5b6020019150600581901b3603821315612a0a57600080fd5b6020815260006136596020830184866134c1565b949350505050565b82815260006020604081840152835180604085015260005b8181101561369557858101830151858201606001528201613679565b818111156136a7576000606083870101525b50601f01601f191692909201606001949350505050565b6000602082840312156136d057600080fd5b81516001600160e01b031981168114612d2457600080fd5b6000816136f7576136f76135cb565b506000190190565b60008219821115613712576137126135cb565b50019056fe4156534469726563746f72792e72656769737465724f70657261746f72546f4f4156534469726563746f72792e72656769737465724f70657261746f72546f41a264697066735822122016076cbb1a92d6de96b28641aa9f940f5bd061727d8fe80d01f3eb5c3312b42864736f6c634300080c0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"inTotalOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetMemberCount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetsMemberOf\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"start\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"length\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structIAVSDirectory.OperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetsMemberOf\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x60c06040523480156200001157600080fd5b5060405162003d1d38038062003d1d833981016040819052620000349162000118565b6001600160a01b0381166080526200004b62000056565b504660a0526200014a565b600054610100900460ff1615620000c35760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101562000116576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6000602082840312156200012b57600080fd5b81516001600160a01b03811681146200014357600080fd5b9392505050565b60805160a051613b9f6200017e60003960006122530152600081816105cd01528181610b8e01526113ff0152613b9f6000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c80639926ee7d1161013b578063d79aceab116100b8578063ec76f4421161007c578063ec76f442146105ef578063ef2dfa8d14610623578063f2fde38b14610636578063f698da2514610649578063fabc1cbc1461065157600080fd5b8063d79aceab1461053c578063da2ff05d14610563578063dae226b614610576578063dce974b9146105a1578063df5cf723146105c857600080fd5b8063afe02ed5116100ff578063afe02ed5146104c9578063b2841d48146104dc578063c1a8e2c5146104ef578063c825fe6814610502578063cbdf0e421461052957600080fd5b80639926ee7d14610475578063a1060c8814610488578063a364f4da1461049b578063a98fb355146104ae578063aec205c5146104c157600080fd5b8063595c6a67116101c957806384d76f7b1161018d57806384d76f7b146103d8578063886f1195146104065780638da5cb5b146104315780638de5494414610442578063955e66961461046257600080fd5b8063595c6a671461037a5780635ac86ab7146103825780635c975abb146103a5578063715018a6146103ad5780637673e93a146103b557600080fd5b80631e2199e2116102105780631e2199e2146102a657806320606b70146102b9578063374823b5146102ee5780633fee332d1461032c57806349075da31461033f57600080fd5b80630d5387c51461024257806310d67a2f1461026b578063136439dd146102805780631794bb3c14610293575b600080fd5b610255610250366004612fec565b610664565b6040516102629190613021565b60405180910390f35b61027e610279366004613087565b6107a9565b005b61027e61028e3660046130ab565b610865565b61027e6102a13660046130c4565b6109a4565b61027e6102b4366004613269565b610ace565b6102e07f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b604051908152602001610262565b61031c6102fc3660046132e4565b609960209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610262565b61027e61033a366004613310565b610dee565b61036d61034d36600461339e565b609860209081526000928352604080842090915290825290205460ff1681565b60405161026291906133ed565b61027e611038565b61031c610390366004613415565b606654600160ff9092169190911b9081161490565b6066546102e0565b61027e6110ff565b61031c6103c3366004613087565b609a6020526000908152604090205460ff1681565b61031c6103e6366004613451565b609b60209081526000928352604080842090915290825290205460ff1681565b606554610419906001600160a01b031681565b6040516001600160a01b039091168152602001610262565b6033546001600160a01b0316610419565b6104556104503660046132e4565b611113565b6040516102629190613486565b6102e06104703660046134ac565b611156565b61027e610483366004613512565b6111bb565b6102e0610496366004613561565b611589565b61027e6104a9366004613087565b6115f3565b61027e6104bc3660046135a7565b611730565b61027e611777565b61027e6104d7366004613618565b61183f565b6102e06104ea3660046134ac565b611a0c565b61027e6104fd366004613659565b611a4c565b6102e07f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b6102e0610537366004613087565b611a81565b6102e07fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b61031c6105713660046136ad565b611aa2565b6102e0610584366004613451565b609c60209081526000928352604080842090915290825290205481565b6102e07f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b6104197f000000000000000000000000000000000000000000000000000000000000000081565b61027e6105fd3660046130ab565b33600090815260996020908152604080832093835292905220805460ff19166001179055565b61027e610631366004613732565b611ace565b61027e610644366004613087565b611e77565b6102e0611eed565b61027e61065f3660046130ab565b611efc565b6001600160a01b0383166000908152609d6020526040812060609190849061068b90612058565b61069591906137b3565b9050808311156106a3578092505b826001600160401b038111156106bb576106bb613149565b60405190808252806020026020018201604052801561070057816020015b60408051808201909152600080825260208201528152602001906001900390816106d95790505b50915060005b838110156107a05761077261073c61071e83886137ca565b6001600160a01b0389166000908152609d6020526040902090612062565b60408051808201909152600080825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b838281518110610784576107846137e2565b602002602001018190525080610799906137f8565b9050610706565b50509392505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108209190613813565b6001600160a01b0316336001600160a01b0316146108595760405162461bcd60e51b815260040161085090613830565b60405180910390fd5b6108628161206e565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa1580156108ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d1919061387a565b6108ed5760405162461bcd60e51b81526004016108509061389c565b606654818116146109665760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610850565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600054610100900460ff16158080156109c45750600054600160ff909116105b806109de5750303b1580156109de575060005460ff166001145b610a415760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610850565b6000805460ff191660011790558015610a64576000805461ff0019166101001790555b610a6e8383612165565b610a7661224f565b609755610a8284612318565b8015610ac8576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b60665460019060029081161415610af75760405162461bcd60e51b8152600401610850906138e4565b4282604001511015610b6f5760405162461bcd60e51b81526020600482015260476024820152600080516020613b2a83398151915260448201527f70657261746f72536574733a206f70657261746f72207369676e617475726520606482015266195e1c1a5c995960ca1b608482015260a401610850565b6040516336b87bd760e11b81526001600160a01b0386811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf9919061387a565b610c785760405162461bcd60e51b81526020600482015260566024820152600080516020613b2a83398151915260448201527f70657261746f72536574733a206f70657261746f72206e6f7420726567697374606482015275195c9959081d1bc8115a59d95b93185e595c881e595d60521b608482015260a401610850565b336000908152609a602052604090205460ff16610cff5760405162461bcd60e51b815260206004820152604b6024820152600080516020613b2a83398151915260448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a401610850565b6001600160a01b038516600090815260996020908152604080832085830151845290915290205460ff1615610d8a5760405162461bcd60e51b815260206004820152603f6024820152600080516020613b2a83398151915260448201527f70657261746f72536574733a2073616c7420616c7265616479207370656e74006064820152608401610850565b610daa85610da333878787602001518860400151611156565b845161236a565b6001600160a01b03851660009081526099602090815260408083208583015184529091529020805460ff19166001179055610de785338686612524565b5050505050565b60665460019060029081161415610e175760405162461bcd60e51b8152600401610850906138e4565b815151610eaf57336001600160a01b03871614610eaa5760405162461bcd60e51b815260206004820152604560248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2063616c6c6572206d757374206265206f70656064820152643930ba37b960d91b608482015260a401610850565b611024565b4282604001511015610f3a5760405162461bcd60e51b815260206004820152604860248201527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a206f70657261746f72207369676e617475726560648201526708195e1c1a5c995960c21b608482015260a401610850565b6001600160a01b038616600090815260996020908152604080832085830151845290915290205460ff1615610fd9576040805162461bcd60e51b81526020600482015260248101919091527f4156534469726563746f72792e666f7263654465726567697374657246726f6d60448201527f4f70657261746f72536574733a2073616c7420616c7265616479207370656e746064820152608401610850565b610ff286610da387878787602001518860400151611a0c565b6001600160a01b03861660009081526099602090815260408083208583015184529091529020805460ff191660011790555b611030858786866127de565b505050505050565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611080573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a4919061387a565b6110c05760405162461bcd60e51b81526004016108509061389c565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6111076129c0565b6111116000612318565b565b60408051808201909152600080825260208201526001600160a01b0383166000908152609d6020526040902061114d9061073c9084612062565b90505b92915050565b60006111b17f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92987878787876040516020016111969695949392919061395f565b60405160208183030381529060405280519060200120612a1a565b9695505050505050565b606654600090600190811614156111e45760405162461bcd60e51b8152600401610850906138e4565b428260400151101561124c5760405162461bcd60e51b815260206004820152603e6024820152600080516020613b4a83398151915260448201527f56533a206f70657261746f72207369676e6174757265206578706972656400006064820152608401610850565b336000908152609a602052604090205460ff16156112c05760405162461bcd60e51b815260206004820152603e6024820152600080516020613b4a83398151915260448201527f56533a2041565320697320616e206f70657261746f72207365742041565300006064820152608401610850565b60013360009081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156112fa576112fa6133d7565b141561135c5760405162461bcd60e51b815260206004820152603f6024820152600080516020613b4a83398151915260448201527f56533a206f70657261746f7220616c72656164792072656769737465726564006064820152608401610850565b6001600160a01b038316600090815260996020908152604080832085830151845290915290205460ff16156113e05760405162461bcd60e51b81526020600482015260366024820152600080516020613b4a8339815191526044820152751594ce881cd85b1d08185b1c9958591e481cdc195b9d60521b6064820152608401610850565b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146a919061387a565b6114e05760405162461bcd60e51b815260206004820152604d6024820152600080516020613b4a83398151915260448201527f56533a206f70657261746f72206e6f74207265676973746572656420746f204560648201526c1a59d95b93185e595c881e595d609a1b608482015260a401610850565b6114f883610da3853386602001518760400151611589565b6001600160a01b038316600081815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161157c91906133ed565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290526000906115ea9060c001611196565b95945050505050565b6066546000906001908116141561161c5760405162461bcd60e51b8152600401610850906138e4565b60013360009081526098602090815260408083206001600160a01b038716845290915290205460ff166001811115611656576116566133d7565b146116c95760405162461bcd60e51b815260206004820152603f60248201527f4156534469726563746f72792e646572656769737465724f70657261746f724660448201527f726f6d4156533a206f70657261746f72206e6f742072656769737465726564006064820152608401610850565b3360008181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b419161172491906133ed565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713838360405161176b92919061399f565b60405180910390a25050565b336000908152609a602052604090205460ff16156117fd5760405162461bcd60e51b815260206004820152603e60248201527f4156534469726563746f72792e6265636f6d654f70657261746f72536574415660448201527f533a20616c726561647920616e206f70657261746f72207365742041565300006064820152608401610850565b336000818152609a6020526040808220805460ff19166001179055517f702b0c1f6cb1cf511aaa81f72bc05a215bb3497632d72c690c822b044ab494bf9190a2565b60005b81811015611a0757336000908152609b602052604081209084848481811061186c5761186c6137e2565b905060200201602081019061188191906139ce565b63ffffffff16815260208101919091526040016000205460ff161561190e5760405162461bcd60e51b815260206004820152603b60248201527f4156534469726563746f72792e6372656174654f70657261746f725365743a2060448201527f6f70657261746f722073657420616c72656164792065786973747300000000006064820152608401610850565b336000908152609b60205260408120600191858585818110611932576119326137e2565b905060200201602081019061194791906139ce565b63ffffffff1663ffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c6040518060400160405280336001600160a01b031681526020018585858181106119c5576119c56137e2565b90506020020160208101906119da91906139ce565b63ffffffff1690526040516119ef9190613486565b60405180910390a1611a00816137f8565b9050611842565b505050565b60006111b17f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49587878787876040516020016111969695949392919061395f565b60665460019060029081161415611a755760405162461bcd60e51b8152600401610850906138e4565b610ac8338585856127de565b6001600160a01b0381166000908152609d6020526040812061115090612058565b600061114d611ab083612a61565b6001600160a01b0385166000908152609d6020526040902090612ac6565b60665460019060029081161415611af75760405162461bcd60e51b8152600401610850906138e4565b336000908152609a602052604090205460ff16611b905760405162461bcd60e51b815260206004820152604b60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a20415653206973206e6f7420616e206f7065726160648201526a746f72207365742041565360a81b608482015260a401610850565b60005b8481101561103057600133600090815260986020526040812090888885818110611bbf57611bbf6137e2565b9050602002016020810190611bd49190613087565b6001600160a01b0316815260208101919091526040016000205460ff166001811115611c0257611c026133d7565b14611cae5760405162461bcd60e51b815260206004820152606a60248201527f4156534469726563746f72792e6d6967726174654f70657261746f7273546f4f60448201527f70657261746f72536574733a206f70657261746f7220616c7265616479206d6960648201527f677261746564206f72206e6f742061206c656761637920726567697374657265608482015269321037b832b930ba37b960b11b60a482015260c401610850565b611d02868683818110611cc357611cc36137e2565b9050602002016020810190611cd89190613087565b33868685818110611ceb57611ceb6137e2565b9050602002810190611cfd91906139e9565b612524565b33600090815260986020526040812081888885818110611d2457611d246137e2565b9050602002016020810190611d399190613087565b6001600160a01b031681526020810191909152604001600020805460ff191660018381811115611d6b57611d6b6133d7565b021790555033868683818110611d8357611d836137e2565b9050602002016020810190611d989190613087565b6001600160a01b03167ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b416000604051611dd191906133ed565b60405180910390a333868683818110611dec57611dec6137e2565b9050602002016020810190611e019190613087565b6001600160a01b03167f54f33cfdd1ca703d795986b986fd47d742eab1904ecd2a5fdb8d6595e5904a01868685818110611e3d57611e3d6137e2565b9050602002810190611e4f91906139e9565b604051611e5d929190613a32565b60405180910390a380611e6f816137f8565b915050611b93565b611e7f6129c0565b6001600160a01b038116611ee45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610850565b61086281612318565b6000611ef761224f565b905090565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f739190613813565b6001600160a01b0316336001600160a01b031614611fa35760405162461bcd60e51b815260040161085090613830565b6066541981196066541916146120215760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610850565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610999565b6000611150825490565b600061114d8383612ade565b6001600160a01b0381166120fc5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610850565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b6065546001600160a01b031615801561218657506001600160a01b03821615155b6122085760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610850565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a261224b8261206e565b5050565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612280575060975490565b50604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383163b1561248457604051630b135d3f60e11b808252906001600160a01b03851690631626ba7e906123aa9086908690600401613a4e565b602060405180830381865afa1580156123c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123eb9190613aab565b6001600160e01b03191614611a075760405162461bcd60e51b815260206004820152605360248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a2045524331323731207369676e6174757265206064820152721d995c9a599a58d85d1a5bdb8819985a5b1959606a1b608482015260a401610850565b826001600160a01b03166124988383612b08565b6001600160a01b031614611a075760405162461bcd60e51b815260206004820152604760248201527f454950313237315369676e61747572655574696c732e636865636b5369676e6160448201527f747572655f454950313237313a207369676e6174757265206e6f742066726f6d6064820152661039b4b3b732b960c91b608482015260a401610850565b60005b81811015610de75760006040518060400160405280866001600160a01b0316815260200185858581811061255d5761255d6137e2565b905060200201602081019061257291906139ce565b63ffffffff1690526001600160a01b0386166000908152609b602052604081209192508585858181106125a7576125a76137e2565b90506020020160208101906125bc91906139ce565b63ffffffff16815260208101919091526040016000205460ff166126535760405162461bcd60e51b815260206004820152604260248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a20696e76616c6964206f70657261746f722073606482015261195d60f21b608482015260a401610850565b61265d8682611aa2565b156126f65760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f72656769737465724f70657261746f72546f60448201527f4f70657261746f72536574733a206f70657261746f7220616c7265616479207260648201527f65676973746572656420746f206f70657261746f722073657400000000000000608482015260a401610850565b6001600160a01b0385166000908152609c6020526040812090858585818110612721576127216137e2565b905060200201602081019061273691906139ce565b63ffffffff1663ffffffff1681526020019081526020016000206000815461275d906137f8565b9091555061278b61276d82612a61565b6001600160a01b0388166000908152609d6020526040902090612b2c565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e826040516127c59190613486565b60405180910390a2506127d7816137f8565b9050612527565b60005b81811015610de75760006040518060400160405280876001600160a01b03168152602001858585818110612817576128176137e2565b905060200201602081019061282c91906139ce565b63ffffffff16905290506128408582611aa2565b6128d85760405162461bcd60e51b815260206004820152605960248201527f4156534469726563746f72792e5f646572656769737465724f70657261746f7260448201527f46726f6d4f70657261746f725365743a206f70657261746f72206e6f7420726560648201527f676973746572656420666f72206f70657261746f722073657400000000000000608482015260a401610850565b6001600160a01b0386166000908152609c6020526040812090858585818110612903576129036137e2565b905060200201602081019061291891906139ce565b63ffffffff1663ffffffff1681526020019081526020016000206000815461293f90613ad5565b9091555061296d61294f82612a61565b6001600160a01b0387166000908152609d6020526040902090612b38565b50846001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe826040516129a79190613486565b60405180910390a2506129b9816137f8565b90506127e1565b6033546001600160a01b031633146111115760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610850565b6000612a2461224f565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60008160000151826020015163ffffffff16604051602001612aae92919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b60405160208183030381529060405261115090613aec565b6000818152600183016020526040812054151561114d565b6000826000018281548110612af557612af56137e2565b9060005260206000200154905092915050565b6000806000612b178585612b44565b91509150612b2481612bb4565b509392505050565b600061114d8383612d6f565b600061114d8383612dbe565b600080825160411415612b7b5760208301516040840151606085015160001a612b6f87828585612eb1565b94509450505050612bad565b825160401415612ba55760208301516040840151612b9a868383612f9e565b935093505050612bad565b506000905060025b9250929050565b6000816004811115612bc857612bc86133d7565b1415612bd15750565b6001816004811115612be557612be56133d7565b1415612c335760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610850565b6002816004811115612c4757612c476133d7565b1415612c955760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610850565b6003816004811115612ca957612ca96133d7565b1415612d025760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610850565b6004816004811115612d1657612d166133d7565b14156108625760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610850565b6000818152600183016020526040812054612db657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611150565b506000611150565b60008181526001830160205260408120548015612ea7576000612de26001836137b3565b8554909150600090612df6906001906137b3565b9050818114612e5b576000866000018281548110612e1657612e166137e2565b9060005260206000200154905080876000018481548110612e3957612e396137e2565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612e6c57612e6c613b13565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050611150565b6000915050611150565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612ee85750600090506003612f95565b8460ff16601b14158015612f0057508460ff16601c14155b15612f115750600090506004612f95565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612f65573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612f8e57600060019250925050612f95565b9150600090505b94509492505050565b6000806001600160ff1b03831681612fbb60ff86901c601b6137ca565b9050612fc987828885612eb1565b935093505050935093915050565b6001600160a01b038116811461086257600080fd5b60008060006060848603121561300157600080fd5b833561300c81612fd7565b95602085013595506040909401359392505050565b602080825282518282018190526000919060409081850190868401855b8281101561307a5761306a84835180516001600160a01b0316825260209081015163ffffffff16910152565b928401929085019060010161303e565b5091979650505050505050565b60006020828403121561309957600080fd5b81356130a481612fd7565b9392505050565b6000602082840312156130bd57600080fd5b5035919050565b6000806000606084860312156130d957600080fd5b83356130e481612fd7565b925060208401356130f481612fd7565b929592945050506040919091013590565b60008083601f84011261311757600080fd5b5081356001600160401b0381111561312e57600080fd5b6020830191508360208260051b8501011115612bad57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171561318157613181613149565b60405290565b604051601f8201601f191681016001600160401b03811182821017156131af576131af613149565b604052919050565b6000606082840312156131c957600080fd5b6131d161315f565b905081356001600160401b03808211156131ea57600080fd5b818401915084601f8301126131fe57600080fd5b813560208282111561321257613212613149565b613224601f8301601f19168201613187565b9250818352868183860101111561323a57600080fd5b818185018285013760008183850101528285528086013581860152505050506040820135604082015292915050565b6000806000806060858703121561327f57600080fd5b843561328a81612fd7565b935060208501356001600160401b03808211156132a657600080fd5b6132b288838901613105565b909550935060408701359150808211156132cb57600080fd5b506132d8878288016131b7565b91505092959194509250565b600080604083850312156132f757600080fd5b823561330281612fd7565b946020939093013593505050565b60008060008060006080868803121561332857600080fd5b853561333381612fd7565b9450602086013561334381612fd7565b935060408601356001600160401b038082111561335f57600080fd5b61336b89838a01613105565b9095509350606088013591508082111561338457600080fd5b50613391888289016131b7565b9150509295509295909350565b600080604083850312156133b157600080fd5b82356133bc81612fd7565b915060208301356133cc81612fd7565b809150509250929050565b634e487b7160e01b600052602160045260246000fd5b602081016002831061340f57634e487b7160e01b600052602160045260246000fd5b91905290565b60006020828403121561342757600080fd5b813560ff811681146130a457600080fd5b803563ffffffff8116811461344c57600080fd5b919050565b6000806040838503121561346457600080fd5b823561346f81612fd7565b915061347d60208401613438565b90509250929050565b81516001600160a01b0316815260208083015163ffffffff169082015260408101611150565b6000806000806000608086880312156134c457600080fd5b85356134cf81612fd7565b945060208601356001600160401b038111156134ea57600080fd5b6134f688828901613105565b9699909850959660408101359660609091013595509350505050565b6000806040838503121561352557600080fd5b823561353081612fd7565b915060208301356001600160401b0381111561354b57600080fd5b613557858286016131b7565b9150509250929050565b6000806000806080858703121561357757600080fd5b843561358281612fd7565b9350602085013561359281612fd7565b93969395505050506040820135916060013590565b600080602083850312156135ba57600080fd5b82356001600160401b03808211156135d157600080fd5b818501915085601f8301126135e557600080fd5b8135818111156135f457600080fd5b86602082850101111561360657600080fd5b60209290920196919550909350505050565b6000806020838503121561362b57600080fd5b82356001600160401b0381111561364157600080fd5b61364d85828601613105565b90969095509350505050565b60008060006040848603121561366e57600080fd5b833561367981612fd7565b925060208401356001600160401b0381111561369457600080fd5b6136a086828701613105565b9497909650939450505050565b60008082840360608112156136c157600080fd5b83356136cc81612fd7565b92506040601f19820112156136e057600080fd5b50604051604081018181106001600160401b038211171561370357613703613149565b604052602084013561371481612fd7565b815261372260408501613438565b6020820152809150509250929050565b6000806000806040858703121561374857600080fd5b84356001600160401b038082111561375f57600080fd5b61376b88838901613105565b9096509450602087013591508082111561378457600080fd5b5061379187828801613105565b95989497509550505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156137c5576137c561379d565b500390565b600082198211156137dd576137dd61379d565b500190565b634e487b7160e01b600052603260045260246000fd5b600060001982141561380c5761380c61379d565b5060010190565b60006020828403121561382557600080fd5b81516130a481612fd7565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561388c57600080fd5b815180151581146130a457600080fd5b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b8183526000602080850194508260005b858110156139545763ffffffff61394183613438565b168752958201959082019060010161392b565b509495945050505050565b8681526001600160a01b038616602082015260a06040820181905260009061398a908301868861391b565b60608301949094525060800152949350505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6000602082840312156139e057600080fd5b61114d82613438565b6000808335601e19843603018112613a0057600080fd5b8301803591506001600160401b03821115613a1a57600080fd5b6020019150600581901b3603821315612bad57600080fd5b602081526000613a4660208301848661391b565b949350505050565b82815260006020604081840152835180604085015260005b81811015613a8257858101830151858201606001528201613a66565b81811115613a94576000606083870101525b50601f01601f191692909201606001949350505050565b600060208284031215613abd57600080fd5b81516001600160e01b0319811681146130a457600080fd5b600081613ae457613ae461379d565b506000190190565b80516020808301519190811015613b0d576000198160200360031b1b821691505b50919050565b634e487b7160e01b600052603160045260246000fdfe4156534469726563746f72792e72656769737465724f70657261746f72546f4f4156534469726563746f72792e72656769737465724f70657261746f72546f41a264697066735822122076fb1daf319867032c1106bcafdeac72f8b1ae9524fc5a27b5100ab3b791551964736f6c634300080c0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. @@ -525,12 +525,43 @@ func (_AVSDirectory *AVSDirectoryCallerSession) DomainSeparator() ([32]byte, err return _AVSDirectory.Contract.DomainSeparator(&_AVSDirectory.CallOpts) } -// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// InTotalOperatorSets is a free data retrieval call binding the contract method 0xcbdf0e42. // -// Solidity: function isMember(address , address , uint32 ) view returns(bool) -func (_AVSDirectory *AVSDirectoryCaller) IsMember(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { +// Solidity: function inTotalOperatorSets(address operator) view returns(uint256) +func (_AVSDirectory *AVSDirectoryCaller) InTotalOperatorSets(opts *bind.CallOpts, operator common.Address) (*big.Int, error) { var out []interface{} - err := _AVSDirectory.contract.Call(opts, &out, "isMember", arg0, arg1, arg2) + err := _AVSDirectory.contract.Call(opts, &out, "inTotalOperatorSets", operator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// InTotalOperatorSets is a free data retrieval call binding the contract method 0xcbdf0e42. +// +// Solidity: function inTotalOperatorSets(address operator) view returns(uint256) +func (_AVSDirectory *AVSDirectorySession) InTotalOperatorSets(operator common.Address) (*big.Int, error) { + return _AVSDirectory.Contract.InTotalOperatorSets(&_AVSDirectory.CallOpts, operator) +} + +// InTotalOperatorSets is a free data retrieval call binding the contract method 0xcbdf0e42. +// +// Solidity: function inTotalOperatorSets(address operator) view returns(uint256) +func (_AVSDirectory *AVSDirectoryCallerSession) InTotalOperatorSets(operator common.Address) (*big.Int, error) { + return _AVSDirectory.Contract.InTotalOperatorSets(&_AVSDirectory.CallOpts, operator) +} + +// IsMember is a free data retrieval call binding the contract method 0xda2ff05d. +// +// Solidity: function isMember(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AVSDirectory *AVSDirectoryCaller) IsMember(opts *bind.CallOpts, operator common.Address, operatorSet IAVSDirectoryOperatorSet) (bool, error) { + var out []interface{} + err := _AVSDirectory.contract.Call(opts, &out, "isMember", operator, operatorSet) if err != nil { return *new(bool), err @@ -542,18 +573,18 @@ func (_AVSDirectory *AVSDirectoryCaller) IsMember(opts *bind.CallOpts, arg0 comm } -// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// IsMember is a free data retrieval call binding the contract method 0xda2ff05d. // -// Solidity: function isMember(address , address , uint32 ) view returns(bool) -func (_AVSDirectory *AVSDirectorySession) IsMember(arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { - return _AVSDirectory.Contract.IsMember(&_AVSDirectory.CallOpts, arg0, arg1, arg2) +// Solidity: function isMember(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AVSDirectory *AVSDirectorySession) IsMember(operator common.Address, operatorSet IAVSDirectoryOperatorSet) (bool, error) { + return _AVSDirectory.Contract.IsMember(&_AVSDirectory.CallOpts, operator, operatorSet) } -// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// IsMember is a free data retrieval call binding the contract method 0xda2ff05d. // -// Solidity: function isMember(address , address , uint32 ) view returns(bool) -func (_AVSDirectory *AVSDirectoryCallerSession) IsMember(arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { - return _AVSDirectory.Contract.IsMember(&_AVSDirectory.CallOpts, arg0, arg1, arg2) +// Solidity: function isMember(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AVSDirectory *AVSDirectoryCallerSession) IsMember(operator common.Address, operatorSet IAVSDirectoryOperatorSet) (bool, error) { + return _AVSDirectory.Contract.IsMember(&_AVSDirectory.CallOpts, operator, operatorSet) } // IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. @@ -680,6 +711,68 @@ func (_AVSDirectory *AVSDirectoryCallerSession) OperatorSetMemberCount(arg0 comm return _AVSDirectory.Contract.OperatorSetMemberCount(&_AVSDirectory.CallOpts, arg0, arg1) } +// OperatorSetsMemberOf is a free data retrieval call binding the contract method 0x0d5387c5. +// +// Solidity: function operatorSetsMemberOf(address operator, uint256 start, uint256 length) view returns((address,uint32)[] operatorSets) +func (_AVSDirectory *AVSDirectoryCaller) OperatorSetsMemberOf(opts *bind.CallOpts, operator common.Address, start *big.Int, length *big.Int) ([]IAVSDirectoryOperatorSet, error) { + var out []interface{} + err := _AVSDirectory.contract.Call(opts, &out, "operatorSetsMemberOf", operator, start, length) + + if err != nil { + return *new([]IAVSDirectoryOperatorSet), err + } + + out0 := *abi.ConvertType(out[0], new([]IAVSDirectoryOperatorSet)).(*[]IAVSDirectoryOperatorSet) + + return out0, err + +} + +// OperatorSetsMemberOf is a free data retrieval call binding the contract method 0x0d5387c5. +// +// Solidity: function operatorSetsMemberOf(address operator, uint256 start, uint256 length) view returns((address,uint32)[] operatorSets) +func (_AVSDirectory *AVSDirectorySession) OperatorSetsMemberOf(operator common.Address, start *big.Int, length *big.Int) ([]IAVSDirectoryOperatorSet, error) { + return _AVSDirectory.Contract.OperatorSetsMemberOf(&_AVSDirectory.CallOpts, operator, start, length) +} + +// OperatorSetsMemberOf is a free data retrieval call binding the contract method 0x0d5387c5. +// +// Solidity: function operatorSetsMemberOf(address operator, uint256 start, uint256 length) view returns((address,uint32)[] operatorSets) +func (_AVSDirectory *AVSDirectoryCallerSession) OperatorSetsMemberOf(operator common.Address, start *big.Int, length *big.Int) ([]IAVSDirectoryOperatorSet, error) { + return _AVSDirectory.Contract.OperatorSetsMemberOf(&_AVSDirectory.CallOpts, operator, start, length) +} + +// OperatorSetsMemberOf0 is a free data retrieval call binding the contract method 0x8de54944. +// +// Solidity: function operatorSetsMemberOf(address operator, uint256 index) view returns((address,uint32)) +func (_AVSDirectory *AVSDirectoryCaller) OperatorSetsMemberOf0(opts *bind.CallOpts, operator common.Address, index *big.Int) (IAVSDirectoryOperatorSet, error) { + var out []interface{} + err := _AVSDirectory.contract.Call(opts, &out, "operatorSetsMemberOf0", operator, index) + + if err != nil { + return *new(IAVSDirectoryOperatorSet), err + } + + out0 := *abi.ConvertType(out[0], new(IAVSDirectoryOperatorSet)).(*IAVSDirectoryOperatorSet) + + return out0, err + +} + +// OperatorSetsMemberOf0 is a free data retrieval call binding the contract method 0x8de54944. +// +// Solidity: function operatorSetsMemberOf(address operator, uint256 index) view returns((address,uint32)) +func (_AVSDirectory *AVSDirectorySession) OperatorSetsMemberOf0(operator common.Address, index *big.Int) (IAVSDirectoryOperatorSet, error) { + return _AVSDirectory.Contract.OperatorSetsMemberOf0(&_AVSDirectory.CallOpts, operator, index) +} + +// OperatorSetsMemberOf0 is a free data retrieval call binding the contract method 0x8de54944. +// +// Solidity: function operatorSetsMemberOf(address operator, uint256 index) view returns((address,uint32)) +func (_AVSDirectory *AVSDirectoryCallerSession) OperatorSetsMemberOf0(operator common.Address, index *big.Int) (IAVSDirectoryOperatorSet, error) { + return _AVSDirectory.Contract.OperatorSetsMemberOf0(&_AVSDirectory.CallOpts, operator, index) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) diff --git a/pkg/bindings/AVSDirectoryStorage/binding.go b/pkg/bindings/AVSDirectoryStorage/binding.go index a750b290e..9b1379db5 100644 --- a/pkg/bindings/AVSDirectoryStorage/binding.go +++ b/pkg/bindings/AVSDirectoryStorage/binding.go @@ -44,7 +44,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // AVSDirectoryStorageMetaData contains all meta data concerning the AVSDirectoryStorage contract. var AVSDirectoryStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetMemberCount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"DOMAIN_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_FORCE_DEREGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsOperatorStatus\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorSetMemberCount\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", } // AVSDirectoryStorageABI is the input ABI used to generate the binding from. @@ -503,12 +503,12 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) DomainSeparator() return _AVSDirectoryStorage.Contract.DomainSeparator(&_AVSDirectoryStorage.CallOpts) } -// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// IsMember is a free data retrieval call binding the contract method 0xda2ff05d. // -// Solidity: function isMember(address , address , uint32 ) view returns(bool) -func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) IsMember(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { +// Solidity: function isMember(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) IsMember(opts *bind.CallOpts, operator common.Address, operatorSet IAVSDirectoryOperatorSet) (bool, error) { var out []interface{} - err := _AVSDirectoryStorage.contract.Call(opts, &out, "isMember", arg0, arg1, arg2) + err := _AVSDirectoryStorage.contract.Call(opts, &out, "isMember", operator, operatorSet) if err != nil { return *new(bool), err @@ -520,18 +520,18 @@ func (_AVSDirectoryStorage *AVSDirectoryStorageCaller) IsMember(opts *bind.CallO } -// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// IsMember is a free data retrieval call binding the contract method 0xda2ff05d. // -// Solidity: function isMember(address , address , uint32 ) view returns(bool) -func (_AVSDirectoryStorage *AVSDirectoryStorageSession) IsMember(arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { - return _AVSDirectoryStorage.Contract.IsMember(&_AVSDirectoryStorage.CallOpts, arg0, arg1, arg2) +// Solidity: function isMember(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageSession) IsMember(operator common.Address, operatorSet IAVSDirectoryOperatorSet) (bool, error) { + return _AVSDirectoryStorage.Contract.IsMember(&_AVSDirectoryStorage.CallOpts, operator, operatorSet) } -// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// IsMember is a free data retrieval call binding the contract method 0xda2ff05d. // -// Solidity: function isMember(address , address , uint32 ) view returns(bool) -func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) IsMember(arg0 common.Address, arg1 common.Address, arg2 uint32) (bool, error) { - return _AVSDirectoryStorage.Contract.IsMember(&_AVSDirectoryStorage.CallOpts, arg0, arg1, arg2) +// Solidity: function isMember(address operator, (address,uint32) operatorSet) view returns(bool) +func (_AVSDirectoryStorage *AVSDirectoryStorageCallerSession) IsMember(operator common.Address, operatorSet IAVSDirectoryOperatorSet) (bool, error) { + return _AVSDirectoryStorage.Contract.IsMember(&_AVSDirectoryStorage.CallOpts, operator, operatorSet) } // IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. diff --git a/pkg/bindings/IAVSDirectory/binding.go b/pkg/bindings/IAVSDirectory/binding.go index 8ac23677e..2d2b818b6 100644 --- a/pkg/bindings/IAVSDirectory/binding.go +++ b/pkg/bindings/IAVSDirectory/binding.go @@ -44,7 +44,7 @@ type ISignatureUtilsSignatureWithSaltAndExpiry struct { // IAVSDirectoryMetaData contains all meta data concerning the IAVSDirectory contract. var IAVSDirectoryMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", + ABI: "[{\"type\":\"function\",\"name\":\"OPERATOR_AVS_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_REGISTRATION_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"becomeOperatorSetAVS\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateOperatorAVSRegistrationDigestHash\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetForceDeregistrationTypehash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateOperatorSetRegistrationDigestHash\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"cancelSalt\",\"inputs\":[{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterOperatorFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"forceDeregisterFromOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMember\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSetAVS\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"migrateOperatorsToOperatorSets\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[][]\",\"internalType\":\"uint32[][]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerOperatorToAVS\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerOperatorToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"operatorSignature\",\"type\":\"tuple\",\"internalType\":\"structISignatureUtils.SignatureWithSaltAndExpiry\",\"components\":[{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSMetadataURIUpdated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AVSMigratedToOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAVSRegistrationStatusUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"status\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIAVSDirectory.OperatorAVSRegistrationStatus\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorMigratedToOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"indexed\":false,\"internalType\":\"uint32[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false}]", } // IAVSDirectoryABI is the input ABI used to generate the binding from. @@ -379,12 +379,12 @@ func (_IAVSDirectory *IAVSDirectoryCallerSession) DomainSeparator() ([32]byte, e return _IAVSDirectory.Contract.DomainSeparator(&_IAVSDirectory.CallOpts) } -// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// IsMember is a free data retrieval call binding the contract method 0xda2ff05d. // -// Solidity: function isMember(address avs, address operator, uint32 operatorSetId) view returns(bool) -func (_IAVSDirectory *IAVSDirectoryCaller) IsMember(opts *bind.CallOpts, avs common.Address, operator common.Address, operatorSetId uint32) (bool, error) { +// Solidity: function isMember(address operator, (address,uint32) operatorSet) view returns(bool) +func (_IAVSDirectory *IAVSDirectoryCaller) IsMember(opts *bind.CallOpts, operator common.Address, operatorSet IAVSDirectoryOperatorSet) (bool, error) { var out []interface{} - err := _IAVSDirectory.contract.Call(opts, &out, "isMember", avs, operator, operatorSetId) + err := _IAVSDirectory.contract.Call(opts, &out, "isMember", operator, operatorSet) if err != nil { return *new(bool), err @@ -396,18 +396,18 @@ func (_IAVSDirectory *IAVSDirectoryCaller) IsMember(opts *bind.CallOpts, avs com } -// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// IsMember is a free data retrieval call binding the contract method 0xda2ff05d. // -// Solidity: function isMember(address avs, address operator, uint32 operatorSetId) view returns(bool) -func (_IAVSDirectory *IAVSDirectorySession) IsMember(avs common.Address, operator common.Address, operatorSetId uint32) (bool, error) { - return _IAVSDirectory.Contract.IsMember(&_IAVSDirectory.CallOpts, avs, operator, operatorSetId) +// Solidity: function isMember(address operator, (address,uint32) operatorSet) view returns(bool) +func (_IAVSDirectory *IAVSDirectorySession) IsMember(operator common.Address, operatorSet IAVSDirectoryOperatorSet) (bool, error) { + return _IAVSDirectory.Contract.IsMember(&_IAVSDirectory.CallOpts, operator, operatorSet) } -// IsMember is a free data retrieval call binding the contract method 0x3c4385d0. +// IsMember is a free data retrieval call binding the contract method 0xda2ff05d. // -// Solidity: function isMember(address avs, address operator, uint32 operatorSetId) view returns(bool) -func (_IAVSDirectory *IAVSDirectoryCallerSession) IsMember(avs common.Address, operator common.Address, operatorSetId uint32) (bool, error) { - return _IAVSDirectory.Contract.IsMember(&_IAVSDirectory.CallOpts, avs, operator, operatorSetId) +// Solidity: function isMember(address operator, (address,uint32) operatorSet) view returns(bool) +func (_IAVSDirectory *IAVSDirectoryCallerSession) IsMember(operator common.Address, operatorSet IAVSDirectoryOperatorSet) (bool, error) { + return _IAVSDirectory.Contract.IsMember(&_IAVSDirectory.CallOpts, operator, operatorSet) } // IsOperatorSet is a free data retrieval call binding the contract method 0x84d76f7b. diff --git a/pkg/bindings/RewardsCoordinator/binding.go b/pkg/bindings/RewardsCoordinator/binding.go index 5434aa08c..89a1e4d9a 100644 --- a/pkg/bindings/RewardsCoordinator/binding.go +++ b/pkg/bindings/RewardsCoordinator/binding.go @@ -95,7 +95,7 @@ type IRewardsCoordinatorTokenTreeMerkleLeaf struct { // RewardsCoordinatorMetaData contains all meta data concerning the RewardsCoordinator contract. var RewardsCoordinatorMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegationManager\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_strategyManager\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"},{\"name\":\"_avsDirectory\",\"type\":\"address\",\"internalType\":\"contractIAVSDirectory\"},{\"name\":\"_CALCULATION_INTERVAL_SECONDS\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_REWARDS_DURATION\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_MAX_FUTURE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_OPERATOR_SET_MAX_RETROACTIVE_LENGTH\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"CALCULATION_INTERVAL_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_FUTURE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_REWARDS_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"OPERATOR_SET_MAX_RETROACTIVE_LENGTH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activationDelay\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"avsDirectory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSDirectory\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"beaconChainETHStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"calculateEarnerLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"calculateTokenLeafHash\",\"inputs\":[{\"name\":\"leaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"checkClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimerFor\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createAVSRewardsSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRewardsForAllSubmission\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.RewardsSubmission[]\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cumulativeClaimed\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currRewardsCalculationEndTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"delegationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"disableRoot\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"domainSeparator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentClaimableDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getCurrentDistributionRoot\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootAtIndex\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.DistributionRoot\",\"components\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"disabled\",\"type\":\"bool\",\"internalType\":\"bool\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getDistributionRootsLength\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionBips\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorCommissionUpdateHistoryLength\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRootIndexFromHash\",\"inputs\":[{\"name\":\"rootHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"globalOperatorCommissionBips\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAVSRewardsSubmissionHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRewardsSubmissionForAllHash\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"operatorCommissionUpdates\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"pauseAll\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[{\"name\":\"index\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"paused\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pauserRegistry\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"processClaim\",\"inputs\":[{\"name\":\"claim\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.RewardsMerkleClaim\",\"components\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"earnerTreeProof\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"earnerLeaf\",\"type\":\"tuple\",\"internalType\":\"structIRewardsCoordinator.EarnerTreeMerkleLeaf\",\"components\":[{\"name\":\"earner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"earnerTokenRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"tokenIndices\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"tokenTreeProofs\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"},{\"name\":\"tokenLeaves\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.TokenTreeMerkleLeaf[]\",\"components\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"cumulativeEarnings\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}]},{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardOperatorSetForRange\",\"inputs\":[{\"name\":\"rewardsSubmissions\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.OperatorSetRewardsSubmission[]\",\"components\":[{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"rewardsUpdater\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setActivationDelay\",\"inputs\":[{\"name\":\"_activationDelay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setClaimerFor\",\"inputs\":[{\"name\":\"claimer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setGlobalOperatorCommission\",\"inputs\":[{\"name\":\"_globalCommissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setOperatorCommissionBips\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"commissionBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"outputs\":[{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setPauserRegistry\",\"inputs\":[{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsForAllSubmitter\",\"inputs\":[{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_newValue\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setRewardsUpdater\",\"inputs\":[{\"name\":\"_rewardsUpdater\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"strategyManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategyManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submissionNonce\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitRoot\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"AVSRewardsSubmissionCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ActivationDelaySet\",\"inputs\":[{\"name\":\"oldActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"newActivationDelay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ClaimerForSet\",\"inputs\":[{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldClaimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootDisabled\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DistributionRootSubmitted\",\"inputs\":[{\"name\":\"rootIndex\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsCalculationEndTimestamp\",\"type\":\"uint32\",\"indexed\":true,\"internalType\":\"uint32\"},{\"name\":\"activatedAt\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"GlobalCommissionBipsSet\",\"inputs\":[{\"name\":\"oldGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"newGlobalCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorCommissionUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":true,\"internalType\":\"structIAVSDirectory.OperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"rewardType\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"newCommissionBips\",\"type\":\"uint16\",\"indexed\":false,\"internalType\":\"uint16\"},{\"name\":\"effectTimestamp\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetRewardCreated\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.OperatorSetRewardsSubmission\",\"components\":[{\"name\":\"rewardType\",\"type\":\"uint8\",\"internalType\":\"enumIRewardsCoordinator.RewardType\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Paused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PauserRegistrySet\",\"inputs\":[{\"name\":\"pauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"newPauserRegistry\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIPauserRegistry\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsClaimed\",\"inputs\":[{\"name\":\"root\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"earner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"claimer\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"token\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIERC20\"},{\"name\":\"claimedAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsForAllSubmitterSet\",\"inputs\":[{\"name\":\"rewardsForAllSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"},{\"name\":\"newValue\",\"type\":\"bool\",\"indexed\":true,\"internalType\":\"bool\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsSubmissionForAllCreated\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"submissionNonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"rewardsSubmissionHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"rewardsSubmission\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structIRewardsCoordinator.RewardsSubmission\",\"components\":[{\"name\":\"strategiesAndMultipliers\",\"type\":\"tuple[]\",\"internalType\":\"structIRewardsCoordinator.StrategyAndMultiplier[]\",\"components\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"multiplier\",\"type\":\"uint96\",\"internalType\":\"uint96\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTimestamp\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"duration\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardsUpdaterSet\",\"inputs\":[{\"name\":\"oldRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newRewardsUpdater\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101e06040523480156200001257600080fd5b506040516200511f3803806200511f8339810160408190526200003591620003c0565b898989898989898989896200004b878462000497565b63ffffffff1615620000f05760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000ff620151808862000497565b63ffffffff1615620001a05760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e7565b620001ac878362000497565b63ffffffff1615620002635760405162461bcd60e51b815260206004820152606d60248201527f52657761726473436f6f7264696e61746f723a204f50455241544f525f53455460448201527f5f47454e455349535f524557415244535f54494d455354414d50206d7573742060648201527f62652061206d756c7469706c65206f662043414c43554c4154494f4e5f494e5460848201526c455256414c5f5345434f4e445360981b60a482015260c401620000e7565b6001600160a01b03998a166101605297891661018052959097166101a05263ffffffff93841660805291831660a052821661010052811660c05292831660e0528216610120521661014052620002b8620002ce565b5050466101c05250620004c99650505050505050565b600054610100900460ff1615620003385760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e7565b60005460ff90811610156200038b576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620003a357600080fd5b50565b805163ffffffff81168114620003bb57600080fd5b919050565b6000806000806000806000806000806101408b8d031215620003e157600080fd5b8a51620003ee816200038d565b60208c0151909a5062000401816200038d565b60408c015190995062000414816200038d565b97506200042460608c01620003a6565b96506200043460808c01620003a6565b95506200044460a08c01620003a6565b94506200045460c08c01620003a6565b93506200046460e08c01620003a6565b9250620004756101008c01620003a6565b9150620004866101208c01620003a6565b90509295989b9194979a5092959850565b600063ffffffff80841680620004bd57634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051614b896200059660003960006124e80152600081816106970152610e1c01526000818161059d01526130d9015260006108e801526000818161053c0152610f930152600081816108750152610fb4015260008181610576015261124701526000818161048d01526112680152600081816103b90152612fd601526000818161080d0152612cda0152600081816107b301528181612d8a0152612e540152614b896000f3fe608060405234801561001057600080fd5b50600436106103775760003560e01c8063715018a6116101d3578063c46db60611610104578063f2fde38b116100a2578063f96abf2e1161007c578063f96abf2e14610938578063fabc1cbc1461094b578063fbf1e2c11461095e578063fce36c7d1461097157600080fd5b8063f2fde38b1461090a578063f698da251461091d578063f8cd84481461092557600080fd5b8063de02e503116100de578063de02e503146108aa578063e221b245146108bd578063e810ce21146108d0578063ea4d3c9b146108e357600080fd5b8063c46db60614610842578063d11e9ae514610870578063d4540a551461089757600080fd5b80639104c31911610171578063a0169ddd1161014b578063a0169ddd146107d5578063bb7e451f146107e8578063bf21a8aa14610808578063c336f19d1461082f57600080fd5b80639104c3191461078b5780639be3d4e4146107a65780639d45c281146107ae57600080fd5b8063863cb9a9116101ad578063863cb9a914610729578063865c69531461073c578063886f1195146107675780638da5cb5b1461077a57600080fd5b8063715018a6146106e75780637adace91146106ef5780637b8f8b051461072157600080fd5b806339b70e38116102ad57806358baaa3e1161024b5780635c975abb116102255780635c975abb146106775780635e9d83481461067f5780636b3aa72e146106925780636d21117e146106b957600080fd5b806358baaa3e14610639578063595c6a671461064c5780635ac86ab71461065457600080fd5b80633ccc861d116102875780633ccc861d146105e95780633efe1db6146105fc5780634d18cc351461060f5780634d7a80d41461062657600080fd5b806339b70e38146105985780633a8c0786146105bf5780633c8fcf7c146105d657600080fd5b8063136439dd1161031a5780632c9c60cf116102f45780632c9c60cf146105245780633486e32e1461053757806336af41fa1461055e57806337838ed01461057157600080fd5b8063136439dd146104af578063149bc872146104c25780632b9f64a4146104e357600080fd5b80630e9a53cf116103565780630e9a53cf146104185780630eb383451461046057806310d67a2f14610475578063131433b41461048857600080fd5b806218572c1461037c57806304a0c502146103b4578063092db007146103f0575b600080fd5b61039f61038a366004613f70565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ab565b60cb5461040590600160e01b900461ffff1681565b60405161ffff90911681526020016103ab565b610420610984565b604080518251815260208084015163ffffffff908116918301919091528383015116918101919091526060918201511515918101919091526080016103ab565b61047361046e366004613f9b565b610a63565b005b610473610483366004613f70565b610ae5565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736104bd366004613fd4565b610ba1565b6104d56104d0366004614005565b610ce0565b6040519081526020016103ab565b61050c6104f1366004613f70565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ab565b61047361053236600461406d565b610d56565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61047361056c36600461406d565b61109e565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103db90600160a01b900463ffffffff1681565b6103db6105e43660046140d5565b611336565b6104736105f736600461412c565b6115c4565b61047361060a366004614187565b611986565b60cb546103db90600160c01b900463ffffffff1681565b6104056106343660046141b3565b611c57565b6104736106473660046141f0565b611e06565b610473611e17565b61039f61066236600461420b565b606654600160ff9092169190911b9081161490565b6066546104d5565b61039f61068d36600461422e565b611ede565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b61039f6106c7366004614263565b60cf60209081526000928352604080842090915290825290205460ff1681565b610473611f6b565b6107026106fd36600461428f565b611f7f565b6040805161ffff909316835263ffffffff9091166020830152016103ab565b60ca546104d5565b610473610737366004613f70565b611fe7565b6104d561074a3660046142ef565b60cd60209081526000928352604080842090915290825290205481565b60655461050c906001600160a01b031681565b6033546001600160a01b031661050c565b61050c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610420611ff8565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736107e3366004613f70565b612096565b6104d56107f6366004613f70565b60ce6020526000908152604090205481565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104d561083d3660046141b3565b6120f5565b61039f610850366004614263565b60d060209081526000928352604080842090915290825290205460ff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736108a536600461431d565b6121a8565b6104206108b8366004613fd4565b6122f0565b6104736108cb366004614390565b612382565b6103db6108de366004613fd4565b612393565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b610473610918366004613f70565b61246e565b6104d56124e4565b6104d5610933366004614005565b612522565b6104736109463660046141f0565b612533565b610473610959366004613fd4565b612769565b60cb5461050c906001600160a01b031681565b61047361097f36600461406d565b6128c5565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b8015610a5f57600060ca6109c16001846143c1565b815481106109d1576109d16143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a415750806040015163ffffffff164210155b15610a4c5792915050565b5080610a57816143ee565b9150506109ac565b5090565b610a6b612a42565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190614405565b6001600160a01b0316336001600160a01b031614610b955760405162461bcd60e51b8152600401610b8c90614422565b60405180910390fd5b610b9e81612a9c565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d919061446c565b610c295760405162461bcd60e51b8152600401610b8c90614489565b60665481811614610ca25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610b8c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610cf06020840184613f70565b8360200135604051602001610d399392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460049060109081161415610d7f5760405162461bcd60e51b8152600401610b8c906144d1565b60026097541415610da25760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b828110156110935736848483818110610dc557610dc56143d8565b9050602002810190610dd7919061453f565b33600081815260ce60209081526040808320549051949550939192610e0292909185918791016146fc565b6040516020818303038152906040528051906020012090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166384d76f7b33856020016020810190610e5d91906141f0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015263ffffffff166024820152604401602060405180830381865afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed0919061446c565b610f4c5760405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e7265776172644f70657261746f60448201527f72536574466f7252616e67653a20696e76616c6964206f70657261746f7253656064820152601d60fa1b608482015260a401610b8c565b610fd8610f5c604085018561472c565b610f6c6080870160608801613f70565b6080870135610f8160c0890160a08a016141f0565b610f9160e08a0160c08b016141f0565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b93565b33600090815260cf602090815260408083208484529091529020805460ff1916600190811790915561100b908390614776565b33600081815260ce602052604090819020929092559051829184917f29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b29061105390889061478e565b60405180910390a46110853330608086018035906110749060608901613f70565b6001600160a01b03169291906132ab565b836001019350505050610daa565b505060016097555050565b606654600190600290811614156110c75760405162461bcd60e51b8152600401610b8c906144d1565b33600090815260d1602052604090205460ff166111665760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a401610b8c565b600260975414156111895760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b8281101561109357368484838181106111ac576111ac6143d8565b90506020028101906111be91906147a1565b33600081815260ce602090815260408083205490519495509391926111e99290918591879101614836565b60408051601f198184030181529190528051602090910120905061128c611210848061472c565b6112206040870160208801613f70565b60408701356112356080890160608a016141f0565b61124560a08a0160808b016141f0565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b93565b33600090815260d0602090815260408083208484529091529020805460ff191660019081179091556112bf908390614776565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf2704829061130790889061485d565b60405180910390a46113283330604086018035906110749060208901613f70565b836001019350505050611191565b600061271061ffff831611156113c25760405162461bcd60e51b815260206004820152604560248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72436f60448201527f6d6d697373696f6e426970733a20636f6d6d697373696f6e4269707320746f6f606482015264040d0d2ced60db1b608482015260a401610b8c565b6113cf62093a8042614776565b33600090815260d360209081526040822092935090919082906113f490880188613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020600086602001602081019061142991906141f0565b63ffffffff1663ffffffff16815260200190815260200160002060008560008111156114575761145761455f565b80156114655761146561455f565b8152602081019190915260400160002080549091508015806114c0575063ffffffff8316826114956001846143c1565b815481106114a5576114a56143d8565b60009182526020909120015462010000900463ffffffff1614155b15611523576040805180820190915261ffff808616825263ffffffff808616602080850191825286546001810188556000888152919091209451940180549151909216620100000265ffffffffffff199091169390921692909217179055611560565b83826115306001846143c1565b81548110611540576115406143d8565b6000918252602090912001805461ffff191661ffff929092169190911790555b8560405161156e9190614870565b6040518091039020336001600160a01b03167f811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba8787876040516115b3939291906148a8565b60405180910390a350509392505050565b606654600290600490811614156115ed5760405162461bcd60e51b8152600401610b8c906144d1565b600260975414156116105760405162461bcd60e51b8152600401610b8c90614508565b6002609755600060ca61162660208601866141f0565b63ffffffff168154811061163c5761163c6143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061169d848261331c565b60006116af6080860160608701613f70565b6001600160a01b03808216600090815260cc602052604090205491925016806116d55750805b336001600160a01b038216146117535760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608401610b8c565b60005b61176360a08801886148d4565b9050811015611978573661177a60e089018961472c565b8381811061178a5761178a6143d8565b6001600160a01b038716600090815260cd6020908152604080832093029490940194509290915082906117bf90850185613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808260200135116118795760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a401610b8c565b60006118898260208501356143c1565b6001600160a01b038716600090815260cd602090815260408220929350850180359291906118b79087613f70565b6001600160a01b03168152602080820192909252604001600020919091556118f9908a9083906118e990870187613f70565b6001600160a01b031691906135ed565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061193d6020890189613f70565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050806119719061491e565b9050611756565b505060016097555050505050565b606654600390600890811614156119af5760405162461bcd60e51b8152600401610b8c906144d1565b60cb546001600160a01b031633146119d95760405162461bcd60e51b8152600401610b8c90614939565b60cb5463ffffffff600160c01b909104811690831611611a755760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a401610b8c565b428263ffffffff1610611b0e5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a401610b8c565b60ca5460cb54600090611b2e90600160a01b900463ffffffff164261498d565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b60cb546001600160a01b038416600090815260d36020908152604082209192600160e01b900461ffff169183918290611c9290880188613f70565b6001600160a01b03166001600160a01b031681526020019081526020016000206000866020016020810190611cc791906141f0565b63ffffffff1663ffffffff1681526020019081526020016000206000856000811115611cf557611cf561455f565b8015611d0357611d0361455f565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611d77576000848152602090819020604080518082019091529084015461ffff8116825262010000900463ffffffff1681830152825260019092019101611d31565b5050825192935050505b8015611df95763ffffffff421682611d9a6001846143c1565b81518110611daa57611daa6143d8565b60200260200101516020015163ffffffff1611611df05781611dcd6001836143c1565b81518110611ddd57611ddd6143d8565b6020026020010151600001519250611df9565b60001901611d81565b50909150505b9392505050565b611e0e612a42565b610b9e8161361d565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e83919061446c565b611e9f5760405162461bcd60e51b8152600401610b8c90614489565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000611f638260ca611ef360208301836141f0565b63ffffffff1681548110611f0957611f096143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015261331c565b506001919050565b611f73612a42565b611f7d600061368e565b565b60d36020528460005260406000206020528360005260406000206020528260005260406000206020528160005260406000208181548110611fbf57600080fd5b60009182526020909120015461ffff8116955062010000900463ffffffff1693508592505050565b611fef612a42565b610b9e816136e0565b60408051608081018252600080825260208201819052918101829052606081019190915260ca805461202c906001906143c1565b8154811061203c5761203c6143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b6001600160a01b038316600090815260d360209081526040822090829061211e90860186613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020600084602001602081019061215391906141f0565b63ffffffff1663ffffffff16815260200190815260200160002060008360008111156121815761218161455f565b801561218f5761218f61455f565b8152602081019190915260400160002054949350505050565b600054610100900460ff16158080156121c85750600054600160ff909116105b806121e25750303b1580156121e2575060005460ff166001145b6122455760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b8c565b6000805460ff191660011790558015612268576000805461ff0019166101001790555b61227061373c565b60c95561227d86866137d3565b6122868761368e565b61228f846136e0565b6122988361361d565b6122a1826138bd565b80156122e7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8281548110612327576123276143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b61238a612a42565b610b9e816138bd565b60ca546000905b63ffffffff8116156123ff578260ca6123b46001846149b5565b63ffffffff16815481106123ca576123ca6143d8565b90600052602060002090600202016000015414156123ed57611dff6001826149b5565b806123f7816149da565b91505061239a565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608401610b8c565b612476612a42565b6001600160a01b0381166124db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b8c565b610b9e8161368e565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612515575060c95490565b61251d61373c565b905090565b60006001610cf06020840184613f70565b6066546003906008908116141561255c5760405162461bcd60e51b8152600401610b8c906144d1565b60cb546001600160a01b031633146125865760405162461bcd60e51b8152600401610b8c90614939565b60ca5463ffffffff8316106125f75760405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608401610b8c565b600060ca8363ffffffff1681548110612612576126126143d8565b906000526020600020906002020190508060010160089054906101000a900460ff161561269f5760405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608401610b8c565b6001810154600160201b900463ffffffff16421061271e5760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608401610b8c565b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e09190614405565b6001600160a01b0316336001600160a01b0316146128105760405162461bcd60e51b8152600401610b8c90614422565b60665419811960665419161461288e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610b8c565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610cd5565b606654600090600190811614156128ee5760405162461bcd60e51b8152600401610b8c906144d1565b600260975414156129115760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b828110156110935736848483818110612934576129346143d8565b905060200281019061294691906147a1565b33600081815260ce602090815260408083205490519495509391926129719290918591879101614836565b60408051601f1981840301815291905280516020909101209050612998611210848061472c565b33600090815260cf602090815260408083208484529091529020805460ff191660019081179091556129cb908390614776565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612a1390889061485d565b60405180910390a4612a343330604086018035906110749060208901613f70565b836001019350505050612919565b6033546001600160a01b03163314611f7d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b8c565b6001600160a01b038116612b2a5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610b8c565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b86612bf6576040805162461bcd60e51b8152602060048201526024810191909152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206e6f2073747261746567696573207365746064820152608401610b8c565b60008511612c645760405162461bcd60e51b81526020600482015260416024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a401610b8c565b6f4b3b4ca85a86c47a098a223fffffffff851115612cd85760405162461bcd60e51b815260206004820152603f6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608401610b8c565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168363ffffffff161115612d855760405162461bcd60e51b81526020600482015260546024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a401610b8c565b612daf7f000000000000000000000000000000000000000000000000000000000000000084614a10565b63ffffffff1615612e4f5760405162461bcd60e51b815260206004820152606a6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c401610b8c565b612e797f000000000000000000000000000000000000000000000000000000000000000085614a10565b63ffffffff1615612f1f5760405162461bcd60e51b81526020600482015260706024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c401610b8c565b8363ffffffff168263ffffffff1642612f3891906143c1565b11158015612f5257508363ffffffff168163ffffffff1611155b612fcc5760405162461bcd60e51b81526020600482015260516024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a401610b8c565b612ffc63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614776565b8463ffffffff1611156130815760405162461bcd60e51b81526020600482015260536024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a401610b8c565b6000805b8881101561329f5760008a8a838181106130a1576130a16143d8565b6130b79260206040909202019081019150613f70565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613122573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613146919061446c565b8061316d57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6131e05760405162461bcd60e51b815260206004820152604a6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a401610b8c565b806001600160a01b0316836001600160a01b03161061328d5760405162461bcd60e51b81526020600482015260696024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c401610b8c565b91506132988161491e565b9050613085565b50505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526133169085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613928565b50505050565b8060600151156133755760405162461bcd60e51b81526020600482015260306024820152600080516020614b1483398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608401610b8c565b806040015163ffffffff164210156133dc5760405162461bcd60e51b81526020600482015260366024820152600080516020614b148339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608401610b8c565b6133e960c08301836148d4565b90506133f860a08401846148d4565b9050146134705760405162461bcd60e51b815260206004820152604c6024820152600080516020614b1483398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a401610b8c565b61347d60e083018361472c565b905061348c60c08401846148d4565b9050146135025760405162461bcd60e51b815260206004820152604a6024820152600080516020614b1483398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610b8c565b805161352e9061351860408501602086016141f0565b6135256040860186614a33565b866060016139fa565b60005b61353e60a08401846148d4565b90508110156135e8576135d8608084013561355c60a08601866148d4565b8481811061356c5761356c6143d8565b905060200201602081019061358191906141f0565b61358e60c08701876148d4565b8581811061359e5761359e6143d8565b90506020028101906135b09190614a33565b6135bd60e089018961472c565b878181106135cd576135cd6143d8565b905060400201613b6e565b6135e18161491e565b9050613531565b505050565b6040516001600160a01b0383166024820152604481018290526135e890849063a9059cbb60e01b906064016132df565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b03161580156137f457506001600160a01b03821615155b6138765760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610b8c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26138b982612a9c565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b600061397d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613cbf9092919063ffffffff16565b8051909150156135e8578080602001905181019061399b919061446c565b6135e85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b8c565b613a05602083614a7a565b6001901b8463ffffffff1610613a8f5760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a401610b8c565b6000613a9a82610ce0565b9050613ae584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916613cd6565b613b665760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a401610b8c565b505050505050565b613b79602083614a7a565b6001901b8463ffffffff1610613bf75760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608401610b8c565b6000613c0282612522565b9050613c4d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916613cd6565b613b665760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608401610b8c565b6060613cce8484600085613cee565b949350505050565b600083613ce4868585613e1f565b1495945050505050565b606082471015613d4f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b8c565b6001600160a01b0385163b613da65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b8c565b600080866001600160a01b03168587604051613dc29190614aba565b60006040518083038185875af1925050503d8060008114613dff576040519150601f19603f3d011682016040523d82523d6000602084013e613e04565b606091505b5091509150613e14828286613f22565b979650505050505050565b600060208451613e2f9190614acc565b15613eb65760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610b8c565b8260205b85518111613f1957613ecd600285614acc565b613eee57816000528086015160205260406000209150600284049350613f07565b8086015160005281602052604060002091506002840493505b613f12602082614776565b9050613eba565b50949350505050565b60608315613f31575081611dff565b825115613f415782518084602001fd5b8160405162461bcd60e51b8152600401610b8c9190614ae0565b6001600160a01b0381168114610b9e57600080fd5b600060208284031215613f8257600080fd5b8135611dff81613f5b565b8015158114610b9e57600080fd5b60008060408385031215613fae57600080fd5b8235613fb981613f5b565b91506020830135613fc981613f8d565b809150509250929050565b600060208284031215613fe657600080fd5b5035919050565b600060408284031215613fff57600080fd5b50919050565b60006040828403121561401757600080fd5b611dff8383613fed565b60008083601f84011261403357600080fd5b50813567ffffffffffffffff81111561404b57600080fd5b6020830191508360208260051b850101111561406657600080fd5b9250929050565b6000806020838503121561408057600080fd5b823567ffffffffffffffff81111561409757600080fd5b6140a385828601614021565b90969095509350505050565b8035600181106140be57600080fd5b919050565b803561ffff811681146140be57600080fd5b6000806000608084860312156140ea57600080fd5b6140f48585613fed565b9250614102604085016140af565b9150614110606085016140c3565b90509250925092565b60006101008284031215613fff57600080fd5b6000806040838503121561413f57600080fd5b823567ffffffffffffffff81111561415657600080fd5b61416285828601614119565b9250506020830135613fc981613f5b565b803563ffffffff811681146140be57600080fd5b6000806040838503121561419a57600080fd5b823591506141aa60208401614173565b90509250929050565b6000806000608084860312156141c857600080fd5b83356141d381613f5b565b92506141e28560208601613fed565b9150614110606085016140af565b60006020828403121561420257600080fd5b611dff82614173565b60006020828403121561421d57600080fd5b813560ff81168114611dff57600080fd5b60006020828403121561424057600080fd5b813567ffffffffffffffff81111561425757600080fd5b613cce84828501614119565b6000806040838503121561427657600080fd5b823561428181613f5b565b946020939093013593505050565b600080600080600060a086880312156142a757600080fd5b85356142b281613f5b565b945060208601356142c281613f5b565b93506142d060408701614173565b92506142de606087016140af565b949793965091946080013592915050565b6000806040838503121561430257600080fd5b823561430d81613f5b565b91506020830135613fc981613f5b565b60008060008060008060c0878903121561433657600080fd5b863561434181613f5b565b9550602087013561435181613f5b565b945060408701359350606087013561436881613f5b565b925061437660808801614173565b915061438460a088016140c3565b90509295509295509295565b6000602082840312156143a257600080fd5b611dff826140c3565b634e487b7160e01b600052601160045260246000fd5b6000828210156143d3576143d36143ab565b500390565b634e487b7160e01b600052603260045260246000fd5b6000816143fd576143fd6143ab565b506000190190565b60006020828403121561441757600080fd5b8151611dff81613f5b565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561447e57600080fd5b8151611dff81613f8d565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000823560de1983360301811261455557600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b6001811061459357634e487b7160e01b600052602160045260246000fd5b9052565b6000808335601e198436030181126145ae57600080fd5b830160208101925035905067ffffffffffffffff8111156145ce57600080fd5b8060061b360383131561406657600080fd5b818352600060208085019450826000805b8681101561464557823561460481613f5b565b6001600160a01b03168852828401356bffffffffffffffffffffffff811680821461462d578384fd5b898601525060409788019792909201916001016145f1565b50959695505050505050565b6146638261465e836140af565b614575565b600061467160208301614173565b63ffffffff808216602086015261468b6040850185614597565b925060e060408701526146a260e0870184836145e0565b92505060608401356146b381613f5b565b6001600160a01b0316606086015260808481013590860152806146d860a08601614173565b1660a0860152806146eb60c08601614173565b1660c0860152508091505092915050565b60018060a01b03841681528260208201526060604082015260006147236060830184614651565b95945050505050565b6000808335601e1984360301811261474357600080fd5b83018035915067ffffffffffffffff82111561475e57600080fd5b6020019150600681901b360382131561406657600080fd5b60008219821115614789576147896143ab565b500190565b602081526000611dff6020830184614651565b60008235609e1983360301811261455557600080fd5b60006147c38283614597565b60a085526147d560a0860182846145e0565b91505060208301356147e681613f5b565b6001600160a01b031660208501526040838101359085015261480a60608401614173565b63ffffffff80821660608701528061482460808701614173565b16608087015250508091505092915050565b60018060a01b038416815282602082015260606040820152600061472360608301846147b7565b602081526000611dff60208301846147b7565b6000823561487d81613f5b565b6001600160a01b0316825263ffffffff61489960208501614173565b16602083015250604001919050565b606081016148b68286614575565b61ffff8416602083015263ffffffff83166040830152949350505050565b6000808335601e198436030181126148eb57600080fd5b83018035915067ffffffffffffffff82111561490657600080fd5b6020019150600581901b360382131561406657600080fd5b6000600019821415614932576149326143ab565b5060010190565b60208082526034908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6040820152733a103a3432903932bbb0b93239aab83230ba32b960611b606082015260800190565b600063ffffffff8083168185168083038211156149ac576149ac6143ab565b01949350505050565b600063ffffffff838116908316818110156149d2576149d26143ab565b039392505050565b600063ffffffff8216806149f0576149f06143ab565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff80841680614a2757614a276149fa565b92169190910692915050565b6000808335601e19843603018112614a4a57600080fd5b83018035915067ffffffffffffffff821115614a6557600080fd5b60200191503681900382131561406657600080fd5b600082614a8957614a896149fa565b500490565b60005b83811015614aa9578181015183820152602001614a91565b838111156133165750506000910152565b60008251614555818460208701614a8e565b600082614adb57614adb6149fa565b500690565b6020815260008251806020840152614aff816040850160208701614a8e565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2052657761726473436f6f7264696e61746f722e5f76616c696461746552657761a2646970667358221220a9636d70699ce75a19e01142faac9b11ad37a676fd0b1d4f22c1ba2b9cba410864736f6c634300080c0033", + Bin: "0x6101e06040523480156200001257600080fd5b506040516200511f3803806200511f8339810160408190526200003591620003c0565b898989898989898989896200004b878462000497565b63ffffffff1615620000f05760405162461bcd60e51b815260206004820152606060248201527f52657761726473436f6f7264696e61746f723a2047454e455349535f5245574160448201527f5244535f54494d455354414d50206d7573742062652061206d756c7469706c6560648201527f206f662043414c43554c4154494f4e5f494e54455256414c5f5345434f4e4453608482015260a4015b60405180910390fd5b620000ff620151808862000497565b63ffffffff1615620001a05760405162461bcd60e51b815260206004820152605760248201527f52657761726473436f6f7264696e61746f723a2043414c43554c4154494f4e5f60448201527f494e54455256414c5f5345434f4e4453206d7573742062652061206d756c746960648201527f706c65206f6620534e415053484f545f434144454e4345000000000000000000608482015260a401620000e7565b620001ac878362000497565b63ffffffff1615620002635760405162461bcd60e51b815260206004820152606d60248201527f52657761726473436f6f7264696e61746f723a204f50455241544f525f53455460448201527f5f47454e455349535f524557415244535f54494d455354414d50206d7573742060648201527f62652061206d756c7469706c65206f662043414c43554c4154494f4e5f494e5460848201526c455256414c5f5345434f4e445360981b60a482015260c401620000e7565b6001600160a01b03998a166101605297891661018052959097166101a05263ffffffff93841660805291831660a052821661010052811660c05292831660e0528216610120521661014052620002b8620002ce565b5050466101c05250620004c99650505050505050565b600054610100900460ff1615620003385760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401620000e7565b60005460ff90811610156200038b576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114620003a357600080fd5b50565b805163ffffffff81168114620003bb57600080fd5b919050565b6000806000806000806000806000806101408b8d031215620003e157600080fd5b8a51620003ee816200038d565b60208c0151909a5062000401816200038d565b60408c015190995062000414816200038d565b97506200042460608c01620003a6565b96506200043460808c01620003a6565b95506200044460a08c01620003a6565b94506200045460c08c01620003a6565b93506200046460e08c01620003a6565b9250620004756101008c01620003a6565b9150620004866101208c01620003a6565b90509295989b9194979a5092959850565b600063ffffffff80841680620004bd57634e487b7160e01b600052601260045260246000fd5b92169190910692915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c051614b896200059660003960006124e80152600081816106970152610e1c01526000818161059d01526130d9015260006108e801526000818161053c0152610f930152600081816108750152610fb4015260008181610576015261124701526000818161048d01526112680152600081816103b90152612fd601526000818161080d0152612cda0152600081816107b301528181612d8a0152612e540152614b896000f3fe608060405234801561001057600080fd5b50600436106103775760003560e01c8063715018a6116101d3578063c46db60611610104578063f2fde38b116100a2578063f96abf2e1161007c578063f96abf2e14610938578063fabc1cbc1461094b578063fbf1e2c11461095e578063fce36c7d1461097157600080fd5b8063f2fde38b1461090a578063f698da251461091d578063f8cd84481461092557600080fd5b8063de02e503116100de578063de02e503146108aa578063e221b245146108bd578063e810ce21146108d0578063ea4d3c9b146108e357600080fd5b8063c46db60614610842578063d11e9ae514610870578063d4540a551461089757600080fd5b80639104c31911610171578063a0169ddd1161014b578063a0169ddd146107d5578063bb7e451f146107e8578063bf21a8aa14610808578063c336f19d1461082f57600080fd5b80639104c3191461078b5780639be3d4e4146107a65780639d45c281146107ae57600080fd5b8063863cb9a9116101ad578063863cb9a914610729578063865c69531461073c578063886f1195146107675780638da5cb5b1461077a57600080fd5b8063715018a6146106e75780637adace91146106ef5780637b8f8b051461072157600080fd5b806339b70e38116102ad57806358baaa3e1161024b5780635c975abb116102255780635c975abb146106775780635e9d83481461067f5780636b3aa72e146106925780636d21117e146106b957600080fd5b806358baaa3e14610639578063595c6a671461064c5780635ac86ab71461065457600080fd5b80633ccc861d116102875780633ccc861d146105e95780633efe1db6146105fc5780634d18cc351461060f5780634d7a80d41461062657600080fd5b806339b70e38146105985780633a8c0786146105bf5780633c8fcf7c146105d657600080fd5b8063136439dd1161031a5780632c9c60cf116102f45780632c9c60cf146105245780633486e32e1461053757806336af41fa1461055e57806337838ed01461057157600080fd5b8063136439dd146104af578063149bc872146104c25780632b9f64a4146104e357600080fd5b80630e9a53cf116103565780630e9a53cf146104185780630eb383451461046057806310d67a2f14610475578063131433b41461048857600080fd5b806218572c1461037c57806304a0c502146103b4578063092db007146103f0575b600080fd5b61039f61038a366004613f70565b60d16020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff90911681526020016103ab565b60cb5461040590600160e01b900461ffff1681565b60405161ffff90911681526020016103ab565b610420610984565b604080518251815260208084015163ffffffff908116918301919091528383015116918101919091526060918201511515918101919091526080016103ab565b61047361046e366004613f9b565b610a63565b005b610473610483366004613f70565b610ae5565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736104bd366004613fd4565b610ba1565b6104d56104d0366004614005565b610ce0565b6040519081526020016103ab565b61050c6104f1366004613f70565b60cc602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103ab565b61047361053236600461406d565b610d56565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61047361056c36600461406d565b61109e565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b60cb546103db90600160a01b900463ffffffff1681565b6103db6105e43660046140d5565b611336565b6104736105f736600461412c565b6115c4565b61047361060a366004614187565b611986565b60cb546103db90600160c01b900463ffffffff1681565b6104056106343660046141b3565b611c57565b6104736106473660046141f0565b611e06565b610473611e17565b61039f61066236600461420b565b606654600160ff9092169190911b9081161490565b6066546104d5565b61039f61068d36600461422e565b611ede565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b61039f6106c7366004614263565b60cf60209081526000928352604080842090915290825290205460ff1681565b610473611f6b565b6107026106fd36600461428f565b611f7f565b6040805161ffff909316835263ffffffff9091166020830152016103ab565b60ca546104d5565b610473610737366004613f70565b611fe7565b6104d561074a3660046142ef565b60cd60209081526000928352604080842090915290825290205481565b60655461050c906001600160a01b031681565b6033546001600160a01b031661050c565b61050c73beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac081565b610420611ff8565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736107e3366004613f70565b612096565b6104d56107f6366004613f70565b60ce6020526000908152604090205481565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104d561083d3660046141b3565b6120f5565b61039f610850366004614263565b60d060209081526000928352604080842090915290825290205460ff1681565b6103db7f000000000000000000000000000000000000000000000000000000000000000081565b6104736108a536600461431d565b6121a8565b6104206108b8366004613fd4565b6122f0565b6104736108cb366004614390565b612382565b6103db6108de366004613fd4565b612393565b61050c7f000000000000000000000000000000000000000000000000000000000000000081565b610473610918366004613f70565b61246e565b6104d56124e4565b6104d5610933366004614005565b612522565b6104736109463660046141f0565b612533565b610473610959366004613fd4565b612769565b60cb5461050c906001600160a01b031681565b61047361097f36600461406d565b6128c5565b60408051608081018252600080825260208201819052918101829052606081019190915260ca545b8015610a5f57600060ca6109c16001846143c1565b815481106109d1576109d16143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161580156060830181905291925090610a415750806040015163ffffffff164210155b15610a4c5792915050565b5080610a57816143ee565b9150506109ac565b5090565b610a6b612a42565b6001600160a01b038216600081815260d1602052604080822054905160ff9091169284151592841515927f4de6293e668df1398422e1def12118052c1539a03cbfedc145895d48d7685f1c9190a4506001600160a01b0391909116600090815260d160205260409020805460ff1916911515919091179055565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5c9190614405565b6001600160a01b0316336001600160a01b031614610b955760405162461bcd60e51b8152600401610b8c90614422565b60405180910390fd5b610b9e81612a9c565b50565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015610be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0d919061446c565b610c295760405162461bcd60e51b8152600401610b8c90614489565b60665481811614610ca25760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e70617573653a20696e76616c696420617474656d70742060448201527f746f20756e70617573652066756e6374696f6e616c69747900000000000000006064820152608401610b8c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d906020015b60405180910390a250565b600080610cf06020840184613f70565b8360200135604051602001610d399392919060f89390931b6001600160f81b031916835260609190911b6bffffffffffffffffffffffff19166001830152601582015260350190565b604051602081830303815290604052805190602001209050919050565b60665460049060109081161415610d7f5760405162461bcd60e51b8152600401610b8c906144d1565b60026097541415610da25760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b828110156110935736848483818110610dc557610dc56143d8565b9050602002810190610dd7919061453f565b33600081815260ce60209081526040808320549051949550939192610e0292909185918791016146fc565b6040516020818303038152906040528051906020012090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166384d76f7b33856020016020810190610e5d91906141f0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015263ffffffff166024820152604401602060405180830381865afa158015610eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed0919061446c565b610f4c5760405162461bcd60e51b815260206004820152604160248201527f52657761726473436f6f7264696e61746f722e7265776172644f70657261746f60448201527f72536574466f7252616e67653a20696e76616c6964206f70657261746f7253656064820152601d60fa1b608482015260a401610b8c565b610fd8610f5c604085018561472c565b610f6c6080870160608801613f70565b6080870135610f8160c0890160a08a016141f0565b610f9160e08a0160c08b016141f0565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b93565b33600090815260cf602090815260408083208484529091529020805460ff1916600190811790915561100b908390614776565b33600081815260ce602052604090819020929092559051829184917f29a8ee4f31259a5f344a2cca256440ea6638a3278972b1ee9a7aab99b00aa3b29061105390889061478e565b60405180910390a46110853330608086018035906110749060608901613f70565b6001600160a01b03169291906132ab565b836001019350505050610daa565b505060016097555050565b606654600190600290811614156110c75760405162461bcd60e51b8152600401610b8c906144d1565b33600090815260d1602052604090205460ff166111665760405162461bcd60e51b815260206004820152605160248201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f60448201527f7420612076616c69642063726561746552657761726473466f72416c6c53756260648201527036b4b9b9b4b7b71039bab136b4ba3a32b960791b608482015260a401610b8c565b600260975414156111895760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b8281101561109357368484838181106111ac576111ac6143d8565b90506020028101906111be91906147a1565b33600081815260ce602090815260408083205490519495509391926111e99290918591879101614836565b60408051601f198184030181529190528051602090910120905061128c611210848061472c565b6112206040870160208801613f70565b60408701356112356080890160608a016141f0565b61124560a08a0160808b016141f0565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612b93565b33600090815260d0602090815260408083208484529091529020805460ff191660019081179091556112bf908390614776565b33600081815260ce602052604090819020929092559051829184917f51088b8c89628df3a8174002c2a034d0152fce6af8415d651b2a4734bf2704829061130790889061485d565b60405180910390a46113283330604086018035906110749060208901613f70565b836001019350505050611191565b600061271061ffff831611156113c25760405162461bcd60e51b815260206004820152604560248201527f52657761726473436f6f7264696e61746f722e7365744f70657261746f72436f60448201527f6d6d697373696f6e426970733a20636f6d6d697373696f6e4269707320746f6f606482015264040d0d2ced60db1b608482015260a401610b8c565b6113cf62093a8042614776565b33600090815260d360209081526040822092935090919082906113f490880188613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020600086602001602081019061142991906141f0565b63ffffffff1663ffffffff16815260200190815260200160002060008560008111156114575761145761455f565b80156114655761146561455f565b8152602081019190915260400160002080549091508015806114c0575063ffffffff8316826114956001846143c1565b815481106114a5576114a56143d8565b60009182526020909120015462010000900463ffffffff1614155b15611523576040805180820190915261ffff808616825263ffffffff808616602080850191825286546001810188556000888152919091209451940180549151909216620100000265ffffffffffff199091169390921692909217179055611560565b83826115306001846143c1565b81548110611540576115406143d8565b6000918252602090912001805461ffff191661ffff929092169190911790555b8560405161156e9190614870565b6040518091039020336001600160a01b03167f811b77cd39953efa46bbcbf8afd10756fac937e63667afdd6bab4dd69c788dba8787876040516115b3939291906148a8565b60405180910390a350509392505050565b606654600290600490811614156115ed5760405162461bcd60e51b8152600401610b8c906144d1565b600260975414156116105760405162461bcd60e51b8152600401610b8c90614508565b6002609755600060ca61162660208601866141f0565b63ffffffff168154811061163c5761163c6143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152905061169d848261331c565b60006116af6080860160608701613f70565b6001600160a01b03808216600090815260cc602052604090205491925016806116d55750805b336001600160a01b038216146117535760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063616c6c6572206973206e6f742076616c696420636c61696d6572000000006064820152608401610b8c565b60005b61176360a08801886148d4565b9050811015611978573661177a60e089018961472c565b8381811061178a5761178a6143d8565b6001600160a01b038716600090815260cd6020908152604080832093029490940194509290915082906117bf90850185613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050808260200135116118795760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e70726f63657373436c61696d3a60448201527f2063756d756c61746976654561726e696e6773206d75737420626520677420746064820152741a185b8818dd5b5d5b185d1a5d9950db185a5b5959605a1b608482015260a401610b8c565b60006118898260208501356143c1565b6001600160a01b038716600090815260cd602090815260408220929350850180359291906118b79087613f70565b6001600160a01b03168152602080820192909252604001600020919091556118f9908a9083906118e990870187613f70565b6001600160a01b031691906135ed565b86516001600160a01b03808b1691878216918916907f9543dbd55580842586a951f0386e24d68a5df99ae29e3b216588b45fd684ce319061193d6020890189613f70565b604080519283526001600160a01b039091166020830152810186905260600160405180910390a4505050806119719061491e565b9050611756565b505060016097555050505050565b606654600390600890811614156119af5760405162461bcd60e51b8152600401610b8c906144d1565b60cb546001600160a01b031633146119d95760405162461bcd60e51b8152600401610b8c90614939565b60cb5463ffffffff600160c01b909104811690831611611a755760405162461bcd60e51b815260206004820152604b60248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a206e60448201527f657720726f6f74206d75737420626520666f72206e657765722063616c63756c60648201526a185d1959081c195c9a5bd960aa1b608482015260a401610b8c565b428263ffffffff1610611b0e5760405162461bcd60e51b815260206004820152605560248201527f52657761726473436f6f7264696e61746f722e7375626d6974526f6f743a207260448201527f65776172647343616c63756c6174696f6e456e6454696d657374616d702063616064820152746e6e6f7420626520696e207468652066757475726560581b608482015260a401610b8c565b60ca5460cb54600090611b2e90600160a01b900463ffffffff164261498d565b6040805160808101825287815263ffffffff878116602080840182815286841685870181815260006060880181815260ca8054600181018255925297517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee160029092029182015592517f42d72674974f694b5f5159593243114d38a5c39c89d6b62fee061ff523240ee290930180549151975193871667ffffffffffffffff1990921691909117600160201b978716979097029690961760ff60401b1916600160401b921515929092029190911790945560cb805463ffffffff60c01b1916600160c01b840217905593519283529394508892908616917fecd866c3c158fa00bf34d803d5f6023000b57080bcb48af004c2b4b46b3afd08910160405180910390a45050505050565b60cb546001600160a01b038416600090815260d36020908152604082209192600160e01b900461ffff169183918290611c9290880188613f70565b6001600160a01b03166001600160a01b031681526020019081526020016000206000866020016020810190611cc791906141f0565b63ffffffff1663ffffffff1681526020019081526020016000206000856000811115611cf557611cf561455f565b8015611d0357611d0361455f565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611d77576000848152602090819020604080518082019091529084015461ffff8116825262010000900463ffffffff1681830152825260019092019101611d31565b5050825192935050505b8015611df95763ffffffff421682611d9a6001846143c1565b81518110611daa57611daa6143d8565b60200260200101516020015163ffffffff1611611df05781611dcd6001836143c1565b81518110611ddd57611ddd6143d8565b6020026020010151600001519250611df9565b60001901611d81565b50909150505b9392505050565b611e0e612a42565b610b9e8161361d565b60655460405163237dfb4760e11b81523360048201526001600160a01b03909116906346fbf68e90602401602060405180830381865afa158015611e5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e83919061446c565b611e9f5760405162461bcd60e51b8152600401610b8c90614489565b600019606681905560405190815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a2565b6000611f638260ca611ef360208301836141f0565b63ffffffff1681548110611f0957611f096143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015261331c565b506001919050565b611f73612a42565b611f7d600061368e565b565b60d36020528460005260406000206020528360005260406000206020528260005260406000206020528160005260406000208181548110611fbf57600080fd5b60009182526020909120015461ffff8116955062010000900463ffffffff1693508592505050565b611fef612a42565b610b9e816136e0565b60408051608081018252600080825260208201819052918101829052606081019190915260ca805461202c906001906143c1565b8154811061203c5761203c6143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff1615156060820152919050565b33600081815260cc602052604080822080546001600160a01b031981166001600160a01b038781169182179093559251911692839185917fbab947934d42e0ad206f25c9cab18b5bb6ae144acfb00f40b4e3aa59590ca31291a4505050565b6001600160a01b038316600090815260d360209081526040822090829061211e90860186613f70565b6001600160a01b03166001600160a01b03168152602001908152602001600020600084602001602081019061215391906141f0565b63ffffffff1663ffffffff16815260200190815260200160002060008360008111156121815761218161455f565b801561218f5761218f61455f565b8152602081019190915260400160002054949350505050565b600054610100900460ff16158080156121c85750600054600160ff909116105b806121e25750303b1580156121e2575060005460ff166001145b6122455760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610b8c565b6000805460ff191660011790558015612268576000805461ff0019166101001790555b61227061373c565b60c95561227d86866137d3565b6122868761368e565b61228f846136e0565b6122988361361d565b6122a1826138bd565b80156122e7576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260ca8281548110612327576123276143d8565b600091825260209182902060408051608081018252600293909302909101805483526001015463ffffffff80821694840194909452600160201b810490931690820152600160401b90910460ff161515606082015292915050565b61238a612a42565b610b9e816138bd565b60ca546000905b63ffffffff8116156123ff578260ca6123b46001846149b5565b63ffffffff16815481106123ca576123ca6143d8565b90600052602060002090600202016000015414156123ed57611dff6001826149b5565b806123f7816149da565b91505061239a565b5060405162461bcd60e51b815260206004820152603760248201527f52657761726473436f6f7264696e61746f722e676574526f6f74496e6465784660448201527f726f6d486173683a20726f6f74206e6f7420666f756e640000000000000000006064820152608401610b8c565b612476612a42565b6001600160a01b0381166124db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b8c565b610b9e8161368e565b60007f0000000000000000000000000000000000000000000000000000000000000000461415612515575060c95490565b61251d61373c565b905090565b60006001610cf06020840184613f70565b6066546003906008908116141561255c5760405162461bcd60e51b8152600401610b8c906144d1565b60cb546001600160a01b031633146125865760405162461bcd60e51b8152600401610b8c90614939565b60ca5463ffffffff8316106125f75760405162461bcd60e51b815260206004820152603160248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152700d2dcecc2d8d2c840e4dedee892dcc8caf607b1b6064820152608401610b8c565b600060ca8363ffffffff1681548110612612576126126143d8565b906000526020600020906002020190508060010160089054906101000a900460ff161561269f5760405162461bcd60e51b815260206004820152603560248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152741c9bdbdd08185b1c9958591e48191a5cd8589b1959605a1b6064820152608401610b8c565b6001810154600160201b900463ffffffff16421061271e5760405162461bcd60e51b815260206004820152603660248201527f52657761726473436f6f7264696e61746f722e64697361626c65526f6f743a206044820152751c9bdbdd08185b1c9958591e481858dd1a5d985d195960521b6064820152608401610b8c565b60018101805460ff60401b1916600160401b17905560405163ffffffff8416907fd850e6e5dfa497b72661fa73df2923464eaed9dc2ff1d3cb82bccbfeabe5c41e90600090a2505050565b606560009054906101000a90046001600160a01b03166001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127e09190614405565b6001600160a01b0316336001600160a01b0316146128105760405162461bcd60e51b8152600401610b8c90614422565b60665419811960665419161461288e5760405162461bcd60e51b815260206004820152603860248201527f5061757361626c652e756e70617573653a20696e76616c696420617474656d7060448201527f7420746f2070617573652066756e6374696f6e616c69747900000000000000006064820152608401610b8c565b606681905560405181815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c90602001610cd5565b606654600090600190811614156128ee5760405162461bcd60e51b8152600401610b8c906144d1565b600260975414156129115760405162461bcd60e51b8152600401610b8c90614508565b600260975560005b828110156110935736848483818110612934576129346143d8565b905060200281019061294691906147a1565b33600081815260ce602090815260408083205490519495509391926129719290918591879101614836565b60408051601f1981840301815291905280516020909101209050612998611210848061472c565b33600090815260cf602090815260408083208484529091529020805460ff191660019081179091556129cb908390614776565b33600081815260ce602052604090819020929092559051829184917f450a367a380c4e339e5ae7340c8464ef27af7781ad9945cfe8abd828f89e628190612a1390889061485d565b60405180910390a4612a343330604086018035906110749060208901613f70565b836001019350505050612919565b6033546001600160a01b03163314611f7d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b8c565b6001600160a01b038116612b2a5760405162461bcd60e51b815260206004820152604960248201527f5061757361626c652e5f73657450617573657252656769737472793a206e657760448201527f50617573657252656769737472792063616e6e6f7420626520746865207a65726064820152686f206164647265737360b81b608482015260a401610b8c565b606554604080516001600160a01b03928316815291831660208301527f6e9fcd539896fca60e8b0f01dd580233e48a6b0f7df013b89ba7f565869acdb6910160405180910390a1606580546001600160a01b0319166001600160a01b0392909216919091179055565b86612bf6576040805162461bcd60e51b8152602060048201526024810191909152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206e6f2073747261746567696573207365746064820152608401610b8c565b60008511612c645760405162461bcd60e51b81526020600482015260416024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20616d6f756e742063616e6e6f74206265206064820152600360fc1b608482015260a401610b8c565b6f4b3b4ca85a86c47a098a223fffffffff851115612cd85760405162461bcd60e51b815260206004820152603f6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20616d6f756e7420746f6f206c61726765006064820152608401610b8c565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168363ffffffff161115612d855760405162461bcd60e51b81526020600482015260546024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e20657863656564732060648201527326a0ac2fa922aba0a92229afa22aa920aa24a7a760611b608482015260a401610b8c565b612daf7f000000000000000000000000000000000000000000000000000000000000000084614a10565b63ffffffff1615612e4f5760405162461bcd60e51b815260206004820152606a6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a206475726174696f6e206d7573742062652060648201527f61206d756c7469706c65206f662043414c43554c4154494f4e5f494e54455256608482015269414c5f5345434f4e445360b01b60a482015260c401610b8c565b612e797f000000000000000000000000000000000000000000000000000000000000000085614a10565b63ffffffff1615612f1f5760405162461bcd60e51b81526020600482015260706024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d70206d7560648201527f73742062652061206d756c7469706c65206f662043414c43554c4154494f4e5f60848201526f494e54455256414c5f5345434f4e445360801b60a482015260c401610b8c565b8363ffffffff168263ffffffff1642612f3891906143c1565b11158015612f5257508363ffffffff168163ffffffff1611155b612fcc5760405162461bcd60e51b81526020600482015260516024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152701bc819985c881a5b881d1a19481c185cdd607a1b608482015260a401610b8c565b612ffc63ffffffff7f00000000000000000000000000000000000000000000000000000000000000001642614776565b8463ffffffff1611156130815760405162461bcd60e51b81526020600482015260536024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20737461727454696d657374616d7020746f6064820152726f2066617220696e207468652066757475726560681b608482015260a401610b8c565b6000805b8881101561329f5760008a8a838181106130a1576130a16143d8565b6130b79260206040909202019081019150613f70565b60405163198f077960e21b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063663c1de490602401602060405180830381865afa158015613122573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613146919061446c565b8061316d57506001600160a01b03811673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac0145b6131e05760405162461bcd60e51b815260206004820152604a6024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a20696e76616c69642073747261746567792060648201526918dbdb9cda59195c995960b21b608482015260a401610b8c565b806001600160a01b0316836001600160a01b03161061328d5760405162461bcd60e51b81526020600482015260696024820152600080516020614b3483398151915260448201527f7264735375626d697373696f6e3a2073747261746567696573206d757374206260648201527f6520696e20617363656e64696e67206f7264657220746f2068616e646c65206460848201526875706c69636174657360b81b60a482015260c401610b8c565b91506132988161491e565b9050613085565b50505050505050505050565b6040516001600160a01b03808516602483015283166044820152606481018290526133169085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613928565b50505050565b8060600151156133755760405162461bcd60e51b81526020600482015260306024820152600080516020614b1483398151915260448201526f1c9bdbdd081a5cc8191a5cd8589b195960821b6064820152608401610b8c565b806040015163ffffffff164210156133dc5760405162461bcd60e51b81526020600482015260366024820152600080516020614b148339815191526044820152751c9bdbdd081b9bdd081858dd1a5d985d1959081e595d60521b6064820152608401610b8c565b6133e960c08301836148d4565b90506133f860a08401846148d4565b9050146134705760405162461bcd60e51b815260206004820152604c6024820152600080516020614b1483398151915260448201527f746f6b656e496e646963657320616e6420746f6b656e50726f6f6673206c656e60648201526b0cee8d040dad2e6dac2e8c6d60a31b608482015260a401610b8c565b61347d60e083018361472c565b905061348c60c08401846148d4565b9050146135025760405162461bcd60e51b815260206004820152604a6024820152600080516020614b1483398151915260448201527f746f6b656e5472656550726f6f667320616e64206c6561766573206c656e67746064820152690d040dad2e6dac2e8c6d60b31b608482015260a401610b8c565b805161352e9061351860408501602086016141f0565b6135256040860186614a33565b866060016139fa565b60005b61353e60a08401846148d4565b90508110156135e8576135d8608084013561355c60a08601866148d4565b8481811061356c5761356c6143d8565b905060200201602081019061358191906141f0565b61358e60c08701876148d4565b8581811061359e5761359e6143d8565b90506020028101906135b09190614a33565b6135bd60e089018961472c565b878181106135cd576135cd6143d8565b905060400201613b6e565b6135e18161491e565b9050613531565b505050565b6040516001600160a01b0383166024820152604481018290526135e890849063a9059cbb60e01b906064016132df565b60cb546040805163ffffffff600160a01b9093048316815291831660208301527faf557c6c02c208794817a705609cfa935f827312a1adfdd26494b6b95dd2b4b3910160405180910390a160cb805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60cb546040516001600160a01b038084169216907f237b82f438d75fc568ebab484b75b01d9287b9e98b490b7c23221623b6705dbb90600090a360cb80546001600160a01b0319166001600160a01b0392909216919091179055565b604080518082018252600a81526922b4b3b2b72630bcb2b960b11b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea81840152466060820152306080808301919091528351808303909101815260a0909101909252815191012090565b6065546001600160a01b03161580156137f457506001600160a01b03821615155b6138765760405162461bcd60e51b815260206004820152604760248201527f5061757361626c652e5f696e697469616c697a655061757365723a205f696e6960448201527f7469616c697a6550617573657228292063616e206f6e6c792062652063616c6c6064820152666564206f6e636560c81b608482015260a401610b8c565b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a26138b982612a9c565b5050565b60cb546040805161ffff600160e01b9093048316815291831660208301527f8cdc428b0431b82d1619763f443a48197db344ba96905f3949643acd1c863a06910160405180910390a160cb805461ffff909216600160e01b0261ffff60e01b19909216919091179055565b600061397d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613cbf9092919063ffffffff16565b8051909150156135e8578080602001905181019061399b919061446c565b6135e85760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610b8c565b613a05602083614a7a565b6001901b8463ffffffff1610613a8f5760405162461bcd60e51b815260206004820152604360248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e65724c656166496e6064820152620c8caf60eb1b608482015260a401610b8c565b6000613a9a82610ce0565b9050613ae584848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916613cd6565b613b665760405162461bcd60e51b815260206004820152604660248201527f52657761726473436f6f7264696e61746f722e5f7665726966794561726e657260448201527f436c61696d50726f6f663a20696e76616c6964206561726e657220636c61696d60648201526510383937b7b360d11b608482015260a401610b8c565b505050505050565b613b79602083614a7a565b6001901b8463ffffffff1610613bf75760405162461bcd60e51b815260206004820152603c60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e4c656166496e646578000000006064820152608401610b8c565b6000613c0282612522565b9050613c4d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92508591505063ffffffff8916613cd6565b613b665760405162461bcd60e51b815260206004820152603f60248201527f52657761726473436f6f7264696e61746f722e5f766572696679546f6b656e4360448201527f6c61696d3a20696e76616c696420746f6b656e20636c61696d2070726f6f66006064820152608401610b8c565b6060613cce8484600085613cee565b949350505050565b600083613ce4868585613e1f565b1495945050505050565b606082471015613d4f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610b8c565b6001600160a01b0385163b613da65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b8c565b600080866001600160a01b03168587604051613dc29190614aba565b60006040518083038185875af1925050503d8060008114613dff576040519150601f19603f3d011682016040523d82523d6000602084013e613e04565b606091505b5091509150613e14828286613f22565b979650505050505050565b600060208451613e2f9190614acc565b15613eb65760405162461bcd60e51b815260206004820152604b60248201527f4d65726b6c652e70726f63657373496e636c7573696f6e50726f6f664b65636360448201527f616b3a2070726f6f66206c656e6774682073686f756c642062652061206d756c60648201526a3a34b836329037b310199960a91b608482015260a401610b8c565b8260205b85518111613f1957613ecd600285614acc565b613eee57816000528086015160205260406000209150600284049350613f07565b8086015160005281602052604060002091506002840493505b613f12602082614776565b9050613eba565b50949350505050565b60608315613f31575081611dff565b825115613f415782518084602001fd5b8160405162461bcd60e51b8152600401610b8c9190614ae0565b6001600160a01b0381168114610b9e57600080fd5b600060208284031215613f8257600080fd5b8135611dff81613f5b565b8015158114610b9e57600080fd5b60008060408385031215613fae57600080fd5b8235613fb981613f5b565b91506020830135613fc981613f8d565b809150509250929050565b600060208284031215613fe657600080fd5b5035919050565b600060408284031215613fff57600080fd5b50919050565b60006040828403121561401757600080fd5b611dff8383613fed565b60008083601f84011261403357600080fd5b50813567ffffffffffffffff81111561404b57600080fd5b6020830191508360208260051b850101111561406657600080fd5b9250929050565b6000806020838503121561408057600080fd5b823567ffffffffffffffff81111561409757600080fd5b6140a385828601614021565b90969095509350505050565b8035600181106140be57600080fd5b919050565b803561ffff811681146140be57600080fd5b6000806000608084860312156140ea57600080fd5b6140f48585613fed565b9250614102604085016140af565b9150614110606085016140c3565b90509250925092565b60006101008284031215613fff57600080fd5b6000806040838503121561413f57600080fd5b823567ffffffffffffffff81111561415657600080fd5b61416285828601614119565b9250506020830135613fc981613f5b565b803563ffffffff811681146140be57600080fd5b6000806040838503121561419a57600080fd5b823591506141aa60208401614173565b90509250929050565b6000806000608084860312156141c857600080fd5b83356141d381613f5b565b92506141e28560208601613fed565b9150614110606085016140af565b60006020828403121561420257600080fd5b611dff82614173565b60006020828403121561421d57600080fd5b813560ff81168114611dff57600080fd5b60006020828403121561424057600080fd5b813567ffffffffffffffff81111561425757600080fd5b613cce84828501614119565b6000806040838503121561427657600080fd5b823561428181613f5b565b946020939093013593505050565b600080600080600060a086880312156142a757600080fd5b85356142b281613f5b565b945060208601356142c281613f5b565b93506142d060408701614173565b92506142de606087016140af565b949793965091946080013592915050565b6000806040838503121561430257600080fd5b823561430d81613f5b565b91506020830135613fc981613f5b565b60008060008060008060c0878903121561433657600080fd5b863561434181613f5b565b9550602087013561435181613f5b565b945060408701359350606087013561436881613f5b565b925061437660808801614173565b915061438460a088016140c3565b90509295509295509295565b6000602082840312156143a257600080fd5b611dff826140c3565b634e487b7160e01b600052601160045260246000fd5b6000828210156143d3576143d36143ab565b500390565b634e487b7160e01b600052603260045260246000fd5b6000816143fd576143fd6143ab565b506000190190565b60006020828403121561441757600080fd5b8151611dff81613f5b565b6020808252602a908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526939903ab73830bab9b2b960b11b606082015260800190565b60006020828403121561447e57600080fd5b8151611dff81613f8d565b60208082526028908201527f6d73672e73656e646572206973206e6f74207065726d697373696f6e6564206160408201526739903830bab9b2b960c11b606082015260800190565b60208082526019908201527f5061757361626c653a20696e6465782069732070617573656400000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000823560de1983360301811261455557600080fd5b9190910192915050565b634e487b7160e01b600052602160045260246000fd5b6001811061459357634e487b7160e01b600052602160045260246000fd5b9052565b6000808335601e198436030181126145ae57600080fd5b830160208101925035905067ffffffffffffffff8111156145ce57600080fd5b8060061b360383131561406657600080fd5b818352600060208085019450826000805b8681101561464557823561460481613f5b565b6001600160a01b03168852828401356bffffffffffffffffffffffff811680821461462d578384fd5b898601525060409788019792909201916001016145f1565b50959695505050505050565b6146638261465e836140af565b614575565b600061467160208301614173565b63ffffffff808216602086015261468b6040850185614597565b925060e060408701526146a260e0870184836145e0565b92505060608401356146b381613f5b565b6001600160a01b0316606086015260808481013590860152806146d860a08601614173565b1660a0860152806146eb60c08601614173565b1660c0860152508091505092915050565b60018060a01b03841681528260208201526060604082015260006147236060830184614651565b95945050505050565b6000808335601e1984360301811261474357600080fd5b83018035915067ffffffffffffffff82111561475e57600080fd5b6020019150600681901b360382131561406657600080fd5b60008219821115614789576147896143ab565b500190565b602081526000611dff6020830184614651565b60008235609e1983360301811261455557600080fd5b60006147c38283614597565b60a085526147d560a0860182846145e0565b91505060208301356147e681613f5b565b6001600160a01b031660208501526040838101359085015261480a60608401614173565b63ffffffff80821660608701528061482460808701614173565b16608087015250508091505092915050565b60018060a01b038416815282602082015260606040820152600061472360608301846147b7565b602081526000611dff60208301846147b7565b6000823561487d81613f5b565b6001600160a01b0316825263ffffffff61489960208501614173565b16602083015250604001919050565b606081016148b68286614575565b61ffff8416602083015263ffffffff83166040830152949350505050565b6000808335601e198436030181126148eb57600080fd5b83018035915067ffffffffffffffff82111561490657600080fd5b6020019150600581901b360382131561406657600080fd5b6000600019821415614932576149326143ab565b5060010190565b60208082526034908201527f52657761726473436f6f7264696e61746f723a2063616c6c6572206973206e6f6040820152733a103a3432903932bbb0b93239aab83230ba32b960611b606082015260800190565b600063ffffffff8083168185168083038211156149ac576149ac6143ab565b01949350505050565b600063ffffffff838116908316818110156149d2576149d26143ab565b039392505050565b600063ffffffff8216806149f0576149f06143ab565b6000190192915050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff80841680614a2757614a276149fa565b92169190910692915050565b6000808335601e19843603018112614a4a57600080fd5b83018035915067ffffffffffffffff821115614a6557600080fd5b60200191503681900382131561406657600080fd5b600082614a8957614a896149fa565b500490565b60005b83811015614aa9578181015183820152602001614a91565b838111156133165750506000910152565b60008251614555818460208701614a8e565b600082614adb57614adb6149fa565b500690565b6020815260008251806020840152614aff816040850160208701614a8e565b601f01601f1916919091016040019291505056fe52657761726473436f6f7264696e61746f722e5f636865636b436c61696d3a2052657761726473436f6f7264696e61746f722e5f76616c696461746552657761a264697066735822122081bfea0ff18c77d9aa123f75430baf1826b71fddd7eaee08727ea21cff07837b64736f6c634300080c0033", } // RewardsCoordinatorABI is the input ABI used to generate the binding from. diff --git a/script/deploy/mainnet/Deploy_Strategy_Factory.s.sol b/script/deploy/mainnet/Deploy_Strategy_Factory.s.sol new file mode 100644 index 000000000..d3f7928ea --- /dev/null +++ b/script/deploy/mainnet/Deploy_Strategy_Factory.s.sol @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "@openzeppelin/contracts/utils/Create2.sol"; +import "../../utils/ExistingDeploymentParser.sol"; + +import "../../../src/contracts/strategies/StrategyFactory.sol"; + +/** + * @notice Script used for the first deployment of EigenLayer core contracts to Holesky + * FORK LOCAL + * anvil --fork-url $RPC_MAINNET + * forge script script/deploy/mainnet/Deploy_Strategy_Factory.s.sol:MainnetStrategyFactoryDeploy --rpc-url http://127.0.0.1:8545 --private-key $PRIVATE_KEY --broadcast -vvvv + * + * MAINNET + * forge script script/deploy/mainnet/Deploy_Strategy_Factory.s.sol:MainnetStrategyFactoryDeploy --rpc-url $RPC_MAINNET --private-key $PRIVATE_KEY --verify --broadcast -vvvv + * + */ + +contract MainnetStrategyFactoryDeploy is ExistingDeploymentParser { + function run() external virtual { + // Use rewards config + _parseInitialDeploymentParams( + "script/configs/mainnet/v0.3.0-mainnet-rewards.config.json" + ); + _parseDeployedContracts( + "script/configs/mainnet/Mainnet_curent_deployment.config.json" + ); + + // START RECORDING TRANSACTIONS FOR DEPLOYMENT + vm.startBroadcast(); + + emit log_named_address("Deployer Address", msg.sender); + + _deployStrategyFactory(); + + // STOP RECORDING TRANSACTIONS FOR DEPLOYMENT + vm.stopBroadcast(); + + // Sanity Checks + _verifyContractPointers(); + _verifyImplementations(); + _verifyContractsInitialized({isInitialDeployment: true}); + _verifyInitializationParams(); + + logAndOutputContractAddresses("script/output/mainnet/v0.3.2-mainnet-strategy-factory.output.json"); + } + + /** + * @notice Deploy StrategyFactory for Mainnet + */ + + function _deployStrategyFactory() internal { + strategyFactoryImplementation = new StrategyFactory( + strategyManager + ); + + + + } +} \ No newline at end of file diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index a21fb5d48..ec1a01a4f 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -4,6 +4,7 @@ pragma solidity ^0.8.12; import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; import "@openzeppelin-upgrades/contracts/security/ReentrancyGuardUpgradeable.sol"; + import "../permissions/Pausable.sol"; import "../libraries/EIP1271SignatureUtils.sol"; import "./AVSDirectoryStorage.sol"; @@ -15,6 +16,8 @@ contract AVSDirectory is AVSDirectoryStorage, ReentrancyGuardUpgradeable { + using EnumerableSet for EnumerableSet.Bytes32Set; + /// @dev Index for flag that pauses operator register/deregister to avs when set. uint8 internal constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0; /// @dev Index for flag that pauses operator register/deregister to operator sets when set. @@ -371,23 +374,23 @@ contract AVSDirectory is function _registerToOperatorSets(address operator, address avs, uint32[] calldata operatorSetIds) internal { // Loop over `operatorSetIds` array and register `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { + OperatorSet memory operatorSet = OperatorSet(avs, operatorSetIds[i]); + require( isOperatorSet[avs][operatorSetIds[i]], "AVSDirectory._registerOperatorToOperatorSets: invalid operator set" ); - // Assert `operator` has not already been registered to `operatorSetIds[i]`. require( - !isMember[avs][operator][operatorSetIds[i]], + !isMember(operator, operatorSet), "AVSDirectory._registerOperatorToOperatorSets: operator already registered to operator set" ); ++operatorSetMemberCount[avs][operatorSetIds[i]]; - // Mutate `isMember` to `true`. - isMember[avs][operator][operatorSetIds[i]] = true; + _operatorSetsMemberOf[operator].add(_encodeOperatorSet(operatorSet)); - emit OperatorAddedToOperatorSet(operator, OperatorSet({avs: avs, operatorSetId: operatorSetIds[i]})); + emit OperatorAddedToOperatorSet(operator, operatorSet); } } @@ -401,18 +404,18 @@ contract AVSDirectory is function _deregisterFromOperatorSets(address avs, address operator, uint32[] calldata operatorSetIds) internal { // Loop over `operatorSetIds` array and deregister `operator` for each item. for (uint256 i = 0; i < operatorSetIds.length; ++i) { - // Assert `operator` is registered for this iterations operator set. + OperatorSet memory operatorSet = OperatorSet(avs, operatorSetIds[i]); + require( - isMember[avs][operator][operatorSetIds[i]], + isMember(operator, operatorSet), "AVSDirectory._deregisterOperatorFromOperatorSet: operator not registered for operator set" ); --operatorSetMemberCount[avs][operatorSetIds[i]]; - // Mutate `isMember` to `false`. - isMember[avs][operator][operatorSetIds[i]] = false; + _operatorSetsMemberOf[operator].remove(_encodeOperatorSet(operatorSet)); - emit OperatorRemovedFromOperatorSet(operator, OperatorSet({avs: avs, operatorSetId: operatorSetIds[i]})); + emit OperatorRemovedFromOperatorSet(operator, operatorSet); } } @@ -422,6 +425,43 @@ contract AVSDirectory is * */ + /// @notice Returns operator sets an operator is registered to in the order they were registered. + /// @param operator The operator address to query. + /// @param index The index of the enumerated list of operator sets. + function operatorSetsMemberOf(address operator, uint256 index) public view returns (OperatorSet memory) { + return _decodeOperatorSet(_operatorSetsMemberOf[operator].at(index)); + } + + /// @notice Returns an array of operator sets an operator is registered to. + /// @param operator The operator address to query. + /// @param start The starting index of the array to query. + /// @param length The amount of items of the array to return. + function operatorSetsMemberOf( + address operator, + uint256 start, + uint256 length + ) public view returns (OperatorSet[] memory operatorSets) { + uint256 maxLength = _operatorSetsMemberOf[operator].length() - start; + if (length > maxLength) length = maxLength; + operatorSets = new OperatorSet[](length); + for (uint256 i; i < length; ++i) { + operatorSets[i] = _decodeOperatorSet(_operatorSetsMemberOf[operator].at(start + i)); + } + } + + /// @notice Returns the total number of operator sets an operator is registered to. + /// @param operator The operator address to query. + function inTotalOperatorSets(address operator) public view returns (uint256) { + return _operatorSetsMemberOf[operator].length(); + } + + /// @notice Returns whether or not an operator is registered to an operator set. + /// @param operator The operator address to query. + /// @param operatorSet The `OperatorSet` to query. + function isMember(address operator, OperatorSet memory operatorSet) public view returns (bool) { + return _operatorSetsMemberOf[operator].contains(_encodeOperatorSet(operatorSet)); + } + /** * @notice Calculates the digest hash to be signed by an operator to register with an AVS. * @@ -493,7 +533,24 @@ contract AVSDirectory is } } + /// @notice Returns an EIP-712 encoded hash struct. function _calculateDigestHash(bytes32 structHash) internal view returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", _calculateDomainSeparator(), structHash)); } + + /// @dev Returns an `OperatorSet` encoded into a 32-byte value. + /// @param operatorSet The `OperatorSet` to encode. + function _encodeOperatorSet(OperatorSet memory operatorSet) internal pure returns (bytes32) { + return bytes32(abi.encodePacked(operatorSet.avs, uint96(operatorSet.operatorSetId))); + } + + /// @dev Returns an `OperatorSet` decoded from an encoded 32-byte value. + /// @param encoded The encoded `OperatorSet` to decode. + /// @dev Assumes `encoded` is encoded via `_encodeOperatorSet(operatorSet)`. + function _decodeOperatorSet(bytes32 encoded) internal pure returns (OperatorSet memory) { + return OperatorSet({ + avs: address(uint160(uint256(encoded) >> 96)), + operatorSetId: uint32(uint256(encoded) & type(uint96).max) + }); + } } diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index b1c6a5e43..2ca60b0a3 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -1,10 +1,14 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.12; +import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; + import "../interfaces/IAVSDirectory.sol"; import "../interfaces/IDelegationManager.sol"; abstract contract AVSDirectoryStorage is IAVSDirectory { + using EnumerableSet for EnumerableSet.Bytes32Set; + /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); @@ -44,12 +48,13 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { /// @notice Mapping: avs => operatorSetId => Whether or not an operator set is valid. mapping(address => mapping(uint32 => bool)) public isOperatorSet; - /// @notice Mapping: avs = operator => operatorSetId => Whether or not an operator is a member of an operator set. - mapping(address => mapping(address => mapping(uint32 => bool))) public isMember; - /// @notice Mapping: avs => operatorSetId => Total operators within the given operator set. mapping(address => mapping(uint32 => uint256)) public operatorSetMemberCount; + /// @notice Mapping: operator => List of operator sets that operator is registered to. + /// @dev Each item is formatted as such: bytes32(abi.encodePacked(avs, uint96(operatorSetId))) + mapping(address => EnumerableSet.Bytes32Set) internal _operatorSetsMemberOf; + constructor(IDelegationManager _delegation) { delegation = _delegation; } diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index ca66898c9..9871e2992 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -174,7 +174,7 @@ interface IAVSDirectory is ISignatureUtils { */ function operatorSaltIsSpent(address operator, bytes32 salt) external view returns (bool); - function isMember(address avs, address operator, uint32 operatorSetId) external view returns (bool); + function isMember(address operator, OperatorSet memory operatorSet) external view returns (bool); function isOperatorSetAVS(address avs) external view returns (bool); diff --git a/src/test/mocks/AVSDirectoryMock.sol b/src/test/mocks/AVSDirectoryMock.sol index 8361d2944..f88529874 100644 --- a/src/test/mocks/AVSDirectoryMock.sol +++ b/src/test/mocks/AVSDirectoryMock.sol @@ -80,4 +80,6 @@ contract AVSDirectoryMock is IAVSDirectory, Test { /// @notice The EIP-712 typehash for the OperatorSetRegistration struct used by the contract. function OPERATOR_SET_REGISTRATION_TYPEHASH() external view returns (bytes32) {} + + function isMember(address operator, IAVSDirectory.OperatorSet memory operatorSet) external view returns (bool) {} } \ No newline at end of file diff --git a/src/test/unit/AVSDirectoryUnit.t.sol b/src/test/unit/AVSDirectoryUnit.t.sol index 027d92e41..a51855ddd 100644 --- a/src/test/unit/AVSDirectoryUnit.t.sol +++ b/src/test/unit/AVSDirectoryUnit.t.sol @@ -463,18 +463,18 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSet is AVSDirectoryUnit function testFuzz_MultipleCorrectness( uint256 operatorPk, - uint256 operatorSetIdsLength, + uint256 totalSets, bytes32 salt, uint256 expiry ) public virtual { avsDirectory.becomeOperatorSetAVS(); operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); - operatorSetIdsLength = bound(operatorSetIdsLength, 1, 16); + totalSets = bound(totalSets, 1, 64); expiry = bound(expiry, 1, type(uint256).max); cheats.warp(0); - uint32[] memory oids = new uint32[](operatorSetIdsLength); + uint32[] memory oids = new uint32[](totalSets); for (uint256 i; i < oids.length; ++i) { oids[i] = uint32(uint256(keccak256(abi.encodePacked(i))) % type(uint32).max); _createOperatorSet(oids[i]); @@ -496,11 +496,18 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSet is AVSDirectoryUnit operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) ); + IAVSDirectory.OperatorSet[] memory operatorSets = + avsDirectory.operatorSetsMemberOf(operator, 0, type(uint256).max); + for (uint256 i; i < oids.length; ++i) { - assertTrue(avsDirectory.isMember(address(this), operator, oids[i])); + assertTrue(avsDirectory.isMember(operator, IAVSDirectory.OperatorSet(address(this), oids[i]))); assertEq(avsDirectory.operatorSetMemberCount(address(this), oids[i]), 1); + assertEq(operatorSets[i].avs, address(this)); + assertEq(operatorSets[i].operatorSetId, oids[i]); } + assertEq(operatorSets.length, totalSets); + assertEq(avsDirectory.inTotalOperatorSets(operator), totalSets); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); } @@ -534,7 +541,14 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSet is AVSDirectoryUnit operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) ); - assertTrue(avsDirectory.isMember(address(this), operator, operatorSetId)); + assertTrue(avsDirectory.isMember(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId))); + + IAVSDirectory.OperatorSet memory operatorSet = avsDirectory.operatorSetsMemberOf(operator, 0); + + assertEq(operatorSet.avs, address(this)); + assertEq(operatorSet.operatorSetId, oids[0]); + + assertEq(avsDirectory.inTotalOperatorSets(operator), 1); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 1); } @@ -547,7 +561,7 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSet is AVSDirectoryUnit ) public virtual { avsDirectory.becomeOperatorSetAVS(); operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); - totalSets = bound(totalSets, 1, 32); + totalSets = bound(totalSets, 1, 64); expiry = bound(expiry, 1, type(uint256).max); cheats.warp(0); @@ -566,21 +580,30 @@ contract AVSDirectoryUnitTests_registerOperatorToOperatorSet is AVSDirectoryUnit _registerOperatorWithBaseDetails(operator); - for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { + for (uint32 i = 1; i < totalSets + 1; ++i) { cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); + emit OperatorAddedToOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), i)); } avsDirectory.registerOperatorToOperatorSets( operator, oids, ISignatureUtils.SignatureWithSaltAndExpiry(abi.encodePacked(r, s, v), salt, expiry) ); - for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { - assertTrue(avsDirectory.isMember(address(this), operator, operatorSetId)); - assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 1); + IAVSDirectory.OperatorSet[] memory operatorSets = + avsDirectory.operatorSetsMemberOf(operator, 0, type(uint256).max); + + for (uint32 i = 1; i < totalSets + 1; ++i) { + assertTrue(avsDirectory.isMember(operator, IAVSDirectory.OperatorSet(address(this), i))); + assertEq(avsDirectory.operatorSetMemberCount(address(this), i), 1); + + assertEq(operatorSets[i - 1].avs, address(this)); + assertEq(operatorSets[i - 1].operatorSetId, i); } + assertEq(avsDirectory.inTotalOperatorSets(operator), totalSets); assertTrue(avsDirectory.operatorSaltIsSpent(operator, salt)); + + assertEq(operatorSets.length, totalSets); } } @@ -624,7 +647,7 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn bytes32 salt ) public { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); - operatorSetsToAdd = uint8(bound(operatorSetsToAdd, 1, type(uint8).max)); + operatorSetsToAdd = uint8(bound(operatorSetsToAdd, 1, 64)); address operator = cheats.addr(operatorPk); // Create operator sets @@ -650,9 +673,17 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, emptySig); for (uint32 i = 0; i < operatorSetsToAdd; i++) { - assertFalse(avsDirectory.isMember(address(this), operator, oids[i]), "operator still in operator set"); + assertFalse( + avsDirectory.isMember(operator, IAVSDirectory.OperatorSet(address(this), oids[i])), + "operator still in operator set" + ); } + IAVSDirectory.OperatorSet[] memory operatorSets = + avsDirectory.operatorSetsMemberOf(operator, 0, type(uint256).max); + + assertEq(operatorSets.length, 0); + assertEq(avsDirectory.inTotalOperatorSets(operator), 0); assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 0); } @@ -698,8 +729,10 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn bytes32 salt1, bytes32 salt2 ) public { + cheats.assume(salt1 != salt2); + operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); - operatorSetsToAdd = uint8(bound(operatorSetsToAdd, 1, type(uint8).max)); + operatorSetsToAdd = uint8(bound(operatorSetsToAdd, 1, 64)); address operator = cheats.addr(operatorPk); // Create operator sets @@ -725,7 +758,7 @@ contract AVSDirectoryUnitTests_forceDeregisterFromOperatorSets is AVSDirectoryUn avsDirectory.forceDeregisterFromOperatorSets(operator, address(this), oids, operatorSig); for (uint32 i = 0; i < operatorSetsToAdd; i++) { - assertFalse(avsDirectory.isMember(address(this), operator, oids[i])); + assertFalse(avsDirectory.isMember(operator, IAVSDirectory.OperatorSet(address(this), oids[i]))); } } @@ -773,19 +806,26 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector _registerOperatorToOperatorSet(operatorPk, operatorSetId, salt, expiry); - assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 1); - address operator = cheats.addr(operatorPk); uint32[] memory oids = new uint32[](1); oids[0] = operatorSetId; + // sanity + assertEq(avsDirectory.inTotalOperatorSets(operator), 1); + assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 1); + cheats.expectEmit(true, false, false, false, address(avsDirectory)); emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); + // out of bounds array access + vm.expectRevert(); + avsDirectory.operatorSetsMemberOf(operator, 0); + + assertEq(avsDirectory.inTotalOperatorSets(operator), 0); assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 0); - assertEq(avsDirectory.isMember(address(this), operator, operatorSetId), false); + assertEq(avsDirectory.isMember(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)), false); } function testFuzz_Correctness_MultipleSets( @@ -795,41 +835,50 @@ contract AVSDirectoryUnitTests_deregisterOperatorFromOperatorSets is AVSDirector uint256 expiry ) public virtual { operatorPk = bound(operatorPk, 1, MAX_PRIVATE_KEY); - totalSets = bound(totalSets, 1, 32); + totalSets = bound(totalSets, 1, 64); uint32[] memory oids = new uint32[](totalSets); - for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { - _createOperatorSet(operatorSetId); - oids[operatorSetId - 1] = operatorSetId; + for (uint32 i = 1; i < totalSets + 1; ++i) { + _createOperatorSet(i); + oids[i - 1] = i; } _registerOperatorToOperatorSets(operatorPk, oids, salt, expiry); - for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { - assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 1); + for (uint32 i = 1; i < totalSets + 1; ++i) { + assertEq(avsDirectory.operatorSetMemberCount(address(this), i), 1); } address operator = cheats.addr(operatorPk); - for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { + // sanity + assertEq(avsDirectory.inTotalOperatorSets(operator), totalSets); + + for (uint32 i = 1; i < totalSets + 1; ++i) { cheats.expectEmit(true, false, false, false, address(avsDirectory)); - emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), operatorSetId)); + emit OperatorRemovedFromOperatorSet(operator, IAVSDirectory.OperatorSet(address(this), i)); } avsDirectory.deregisterOperatorFromOperatorSets(operator, oids); - for (uint32 operatorSetId = 1; operatorSetId < totalSets + 1; ++operatorSetId) { - assertEq(avsDirectory.operatorSetMemberCount(address(this), operatorSetId), 0); - assertEq(avsDirectory.isMember(address(this), operator, operatorSetId), false); + for (uint32 i = 1; i < totalSets + 1; ++i) { + assertEq(avsDirectory.operatorSetMemberCount(address(this), i), 0); + assertEq(avsDirectory.isMember(operator, IAVSDirectory.OperatorSet(address(this), i)), false); } + + IAVSDirectory.OperatorSet[] memory operatorSets = + avsDirectory.operatorSetsMemberOf(operator, 0, type(uint256).max); + + assertEq(operatorSets.length, 0); + assertEq(avsDirectory.inTotalOperatorSets(operator), 0); } } contract AVSDirectoryUnitTests_createOperatorSet is AVSDirectoryUnitTests { function testFuzz_createOperatorSet(uint256 totalSets) public { - totalSets = bound(totalSets, 1, 32); - + totalSets = bound(totalSets, 1, 64); + uint32[] memory oids = new uint32[](totalSets); for (uint32 i; i < totalSets; ++i) { @@ -1032,7 +1081,7 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni avsDirectory.migrateOperatorsToOperatorSets(operators, operatorSetIds); // Checks - assertTrue(avsDirectory.isMember(address(this), operator, 1)); + assertTrue(avsDirectory.isMember(operator, IAVSDirectory.OperatorSet(address(this), 1))); assertTrue( avsDirectory.avsOperatorStatus(address(this), operator) == IAVSDirectory.OperatorAVSRegistrationStatus.UNREGISTERED @@ -1046,7 +1095,8 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni bytes32 salt, uint8 numOids ) public { - numOperators = uint8(bound(numOperators, 1, 100)); + numOperators = uint8(bound(numOperators, 1, 64)); + // Create Operator Set IDs uint32[] memory oids = new uint32[](numOids); for (uint32 i = 0; i < numOids; i++) { @@ -1087,7 +1137,7 @@ contract AVSDirectoryUnitTests_migrateOperatorsToOperatorSets is AVSDirectoryUni // Checks for (uint256 i = 0; i < numOperators; i++) { for (uint256 j = 0; j < oids.length; j++) { - assertTrue(avsDirectory.isMember(address(this), operators[i], oids[j])); + assertTrue(avsDirectory.isMember(operators[i], IAVSDirectory.OperatorSet(address(this), oids[j]))); } assertTrue( avsDirectory.avsOperatorStatus(address(this), operators[i]) From c4a4ed068b01b0866945bfa7ed5af8b9758bcac8 Mon Sep 17 00:00:00 2001 From: Michael Sun Date: Fri, 9 Aug 2024 13:01:40 -0400 Subject: [PATCH 35/43] feat: draft with pending todos --- src/contracts/core/AVSDirectory.sol | 387 ++++++++++++++---- src/contracts/core/AVSDirectoryStorage.sol | 26 +- src/contracts/interfaces/IAVSDirectory.sol | 162 +++++++- .../libraries/MagnitudeCheckpoints.sol | 273 ++++++++++++ src/test/mocks/AVSDirectoryMock.sol | 34 ++ 5 files changed, 787 insertions(+), 95 deletions(-) create mode 100644 src/contracts/libraries/MagnitudeCheckpoints.sol diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index ec1a01a4f..4d3645bd5 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -17,12 +17,18 @@ contract AVSDirectory is ReentrancyGuardUpgradeable { using EnumerableSet for EnumerableSet.Bytes32Set; + using MagnitudeCheckpoints for MagnitudeCheckpoints.History; /// @dev Index for flag that pauses operator register/deregister to avs when set. uint8 internal constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0; /// @dev Index for flag that pauses operator register/deregister to operator sets when set. uint8 internal constant PAUSER_OPERATOR_REGISTER_DEREGISTER_TO_OPERATOR_SETS = 1; + /// @dev BIPS factor for slashable bips + uint256 internal constant BIPS_FACTOR = 10_000; + /// @dev Delay before allocations take effect and how long until deallocations are completable + uint32 public constant ALLOCATION_DELAY = 21 days; + /// @dev Returns the chain ID from the time the contract was deployed. uint256 internal immutable ORIGINAL_CHAIN_ID; @@ -249,114 +255,168 @@ contract AVSDirectory is } /** - * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. - * - * @param metadataURI The URI for metadata associated with an AVS. - * - * @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event. + * @notice Allocates a set of magnitude adjustments to increase the slashable stake of an operator set for the + * given operator for the given strategy. + * free magnitude for each strategy will decrement by the sum of all + * allocations for that strategy and the allocations will take effect 21 days from calling. + * + * @param operator address to increase allocations for + * @param allocations array of magnitude adjustments for multiple strategies and corresponding operator sets + * @param operatorSignature signature of the operator if msg.sender is not the operator */ - function updateAVSMetadataURI(string calldata metadataURI) external override { - emit AVSMetadataURIUpdated(msg.sender, metadataURI); + function allocate( + address operator, + MagnitudeAdjustment[] calldata allocations, + SignatureWithSaltAndExpiry calldata operatorSignature + ) external { + // TODO signature verification + + uint32 effectTimestamp = uint32(block.timestamp) + ALLOCATION_DELAY; + for (uint256 i = 0; i < allocations.length; ++i) { + _allocate(operator, allocations[i], effectTimestamp); + } } /** - * @notice Called by an operator to cancel a salt that has been used to register with an AVS. + * @notice Queues a set of magnitude adjustments to decrease the slashable stake of an operator set for the given operator for the given strategy. + * The deallocations will take effect 21 days from calling. In order for the operator to have their nonslashable magnitude increased, + * they must call the contract again to complete the deallocation. Stake deallocations are still subject to slashing until 21 days have passed since queuing. * - * @param salt A unique and single use value associated with the approver signature. + * @param operator address to decrease allocations for + * @param deallocations array of magnitude adjustments for multiple strategies and corresponding operator sets + * @param operatorSignature signature of the operator if msg.sender is not the operator */ - function cancelSalt(bytes32 salt) external override { - // Mutate `operatorSaltIsSpent` to `true` to prevent future spending. - operatorSaltIsSpent[msg.sender][salt] = true; + function queueDeallocate( + address operator, + MagnitudeAdjustment[] calldata deallocations, + SignatureWithSaltAndExpiry calldata operatorSignature + ) external { + // TODO signature verification + + uint32 completableTimestamp = uint32(block.timestamp) + ALLOCATION_DELAY; + // deallocate for each strategy + for (uint256 i = 0; i < deallocations.length; ++i) { + _queueDeallocate(operator, deallocations[i], completableTimestamp); + } } /** + * @notice Complete queued deallocations of slashable stake for an operator, permissionlessly called by anyone + * Increments the free magnitude of the operator by the sum of all deallocation amounts for each strategy. + * If the operator was slashed, this will be a smaller amount than during queuing. * - * LEGACY EXTERNAL FUNCTIONS - SUPPORT DEPRECATED BY SLASHING RELEASE + * @param operator address to complete deallocations for + * @param strategies a list of strategies to complete deallocations for + * @param operatorSets a 2d list of operator sets to complete deallocations for, one list for each strategy * + * @dev can be called permissionlessly by anyone */ + function completeDeallocations( + address operator, + IStrategy[] calldata strategies, + OperatorSet[][] calldata operatorSets + ) external { + // complete all queued deallocations for strategies + for (uint256 i = 0; i < strategies.length; ++i) { + uint64 freeMagnitudeToAdd = 0; + // complete all queued deallocations for specified operatorSets + for (uint256 j = 0; j < operatorSets[i].length; ++j) { + freeMagnitudeToAdd += _completeDeallocation(operator, strategies[i], operatorSets[i][j]); + } + // add to free available magnitude + freeMagnitude[operator][strategies[i]] += freeMagnitudeToAdd; + } + } /** - * @notice Called by the AVS's service manager contract to register an operator with the AVS. - * - * @param operator The address of the operator to register. - * @param operatorSignature The signature, salt, and expiry of the operator's signature. - * - * @dev msg.sender must be the AVS. - * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. + * @notice Called by an AVS to slash an operator for given operatorSetId, list of strategies, and bipsToSlash. + * For each given (operator, operatorSetId, strategy) tuple, bipsToSlash + * bips of the operatorSet's slashable stake allocation will be slashed + * + * @param operator the address to slash + * @param operatorSetId the ID of the operatorSet the operator is being slashed on behalf of + * @param strategies the set of strategies to slash + * @param bipsToSlash the number of bips to slash, this will be proportional to the + * operator's slashable stake allocation for the operatorSet */ - function registerOperatorToAVS( + function slashOperator( address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature - ) external override onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) { - // Assert `operatorSignature.expiry` has not elapsed. + uint32 operatorSetId, + IStrategy[] calldata strategies, + uint16 bipsToSlash + ) external { require( - operatorSignature.expiry >= block.timestamp, - "AVSDirectory.registerOperatorToAVS: operator signature expired" + isOperatorSlashable(operator, OperatorSet({avs: msg.sender, operatorSetId: operatorSetId})), + "AVSDirectory.slashOperator: operator not slashable for operatorSet" ); - // Assert that the AVS is not an operator set AVS. - require(!isOperatorSetAVS[msg.sender], "AVSDirectory.registerOperatorToAVS: AVS is an operator set AVS"); - - // Assert that the `operator` is not actively registered to the AVS. - require( - avsOperatorStatus[msg.sender][operator] != OperatorAVSRegistrationStatus.REGISTERED, - "AVSDirectory.registerOperatorToAVS: operator already registered" - ); - - // Assert `operator` has not already spent `operatorSignature.salt`. - require( - !operatorSaltIsSpent[operator][operatorSignature.salt], - "AVSDirectory.registerOperatorToAVS: salt already spent" - ); - - // Assert `operator` is a registered operator. - require( - delegation.isOperator(operator), - "AVSDirectory.registerOperatorToAVS: operator not registered to EigenLayer yet" - ); - - // Assert that `operatorSignature.signature` is a valid signature for the operator AVS registration. - EIP1271SignatureUtils.checkSignature_EIP1271({ - signer: operator, - digestHash: calculateOperatorAVSRegistrationDigestHash({ - operator: operator, - avs: msg.sender, - salt: operatorSignature.salt, - expiry: operatorSignature.expiry - }), - signature: operatorSignature.signature - }); - - // Mutate `operatorSaltIsSpent` to `true` to prevent future respending. - operatorSaltIsSpent[operator][operatorSignature.salt] = true; - - // Set the operator as registered - avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.REGISTERED; - - emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.REGISTERED); + for (uint256 i = 0; i < strategies.length; ++i) { + // 1. calculate slashed magnitude from current allocation + // update current and all following queued magnitude updates for (operator, strategy, operatorSetId) tuple + uint64 slashedMagnitude; + { + uint64 currentMagnitude = uint64( + _magnitudeUpdate[operator][strategies[i]][msg.sender][operatorSetId].upperLookupRecent( + uint32(block.timestamp) + ) + ); + /// TODO: add wrapping library for rounding up for slashing accounting + slashedMagnitude = uint64(uint256(bipsToSlash) * uint256(currentMagnitude) / BIPS_FACTOR); + + _magnitudeUpdate[operator][strategies[i]][msg.sender][operatorSetId].decrementAtAndFutureCheckpoints({ + timestamp: uint32(block.timestamp), + decrementValue: slashedMagnitude + }); + } + + // 2. if there are any pending deallocations then need to update and decrement if they fall within slashable window + uint64 slashedFromDeallocation = 0; + { + uint256 queuedDeallocationsLen = + _queuedDeallocations[operator][strategies[i]][msg.sender][operatorSetId].length; + for (uint256 j = queuedDeallocationsLen; j > 0; --j) { + QueuedDeallocation storage queuedDeallocation = + _queuedDeallocations[operator][strategies[i]][msg.sender][operatorSetId][j - 1]; + + // if queued deallocation is still within slashable window, then slash and keep track of sum to decrement from totalMagnitude + if (uint32(block.timestamp) + ALLOCATION_DELAY > queuedDeallocation.completableTimestamp) { + uint64 slashedAmount = + uint64(uint256(bipsToSlash) * uint256(queuedDeallocation.magnitudeDiff) / BIPS_FACTOR); + queuedDeallocation.magnitudeDiff -= slashedAmount; + slashedFromDeallocation += slashedAmount; + } else { + break; + } + } + } + + // 3. update totalMagnitude, get total magnitude and subtract slashedMagnitude and slashedFromDeallocation + _totalMagnitudeUpdate[operator][strategies[i]].push({ + timestamp: uint32(block.timestamp), + value: _totalMagnitudeUpdate[operator][strategies[i]].latest() - slashedMagnitude - slashedFromDeallocation + }); + } } /** - * @notice Called by an AVS to deregister an operator from the AVS. + * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. * - * @param operator The address of the operator to deregister. + * @param metadataURI The URI for metadata associated with an AVS. * - * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. + * @dev Note that the `metadataURI` is *never stored* and is only emitted in the `AVSMetadataURIUpdated` event. */ - function deregisterOperatorFromAVS(address operator) - external - override - onlyWhenNotPaused(PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS) - { - require( - avsOperatorStatus[msg.sender][operator] == OperatorAVSRegistrationStatus.REGISTERED, - "AVSDirectory.deregisterOperatorFromAVS: operator not registered" - ); - - // Set the operator as deregistered - avsOperatorStatus[msg.sender][operator] = OperatorAVSRegistrationStatus.UNREGISTERED; + function updateAVSMetadataURI(string calldata metadataURI) external override { + emit AVSMetadataURIUpdated(msg.sender, metadataURI); + } - emit OperatorAVSRegistrationStatusUpdated(operator, msg.sender, OperatorAVSRegistrationStatus.UNREGISTERED); + /** + * @notice Called by an operator to cancel a salt that has been used to register with an AVS. + * + * @param salt A unique and single use value associated with the approver signature. + */ + function cancelSalt(bytes32 salt) external override { + // Mutate `operatorSaltIsSpent` to `true` to prevent future spending. + operatorSaltIsSpent[msg.sender][salt] = true; } /** @@ -390,6 +450,14 @@ contract AVSDirectory is _operatorSetsMemberOf[operator].add(_encodeOperatorSet(operatorSet)); + OperatorSetRegistrationStatus storage registrationStatus = + operatorSetStatus[avs][operator][operatorSetIds[i]]; + require( + !registrationStatus.registered, + "AVSDirectory._registerOperatorToOperatorSets: operator already registered for operator set" + ); + registrationStatus.registered = true; + emit OperatorAddedToOperatorSet(operator, operatorSet); } } @@ -419,6 +487,130 @@ contract AVSDirectory is } } + /** + * @notice For a single strategy, allocate magnitude to a list of operator sets and then update freeMagnitude + * for the strategy after all allocations + * @param operator address to allocate magnitude for + * @param allocation magnitude adjustment for a single strategy and multiple operator sets + * @param effectTimestamp timestamp when the allocation will take effect + */ + function _allocate(address operator, MagnitudeAdjustment calldata allocation, uint32 effectTimestamp) internal { + IStrategy strategy = allocation.strategy; + OperatorSet[] calldata operatorSets = allocation.operatorSets; + uint64 freeAllocatableMagnitude = freeMagnitude[operator][strategy]; + + for (uint256 i = 0; i < operatorSets.length; ++i) { + // 1. check freeMagnitude available, that is the allocation of stake is backed and not slashable + require( + freeAllocatableMagnitude >= allocation.magnitudeDiffs[i], + "AVSDirectory.queueAllocations: insufficient available free magnitude to allocate" + ); + // 2. rate limiting of 1 pending allocation at a time + // read number of checkpoints after current timestamp + (uint224 value, uint256 pos) = _magnitudeUpdate[operator][strategy][operatorSets[i].avs][operatorSets[i] + .operatorSetId].upperLookupRecentWithPos(uint32(block.timestamp)); + // no checkpoint exists if value == 0 && pos == 0, so check the negation before checking if there is a + // a pending allocation + if (value != 0 || pos != 0) { + require( + pos + == _magnitudeUpdate[operator][strategy][operatorSets[i].avs][operatorSets[i].operatorSetId].length() + - 1, + "AVSDirectory.queueAllocations: only one pending allocation allowed for op, opSet, strategy" + ); + } + + // 3. allocate magnitude which will take effect in the future 21 days from now + _magnitudeUpdate[operator][strategy][operatorSets[i].avs][operatorSets[i].operatorSetId].push({ + timestamp: effectTimestamp, + value: value + uint224(allocation.magnitudeDiffs[i]) + }); + // 4. keep track of available freeMagnitude to update later + freeAllocatableMagnitude -= allocation.magnitudeDiffs[i]; + } + + // 5. update freeMagnitude after all allocations + freeMagnitude[operator][strategy] = freeAllocatableMagnitude; + } + + /** + * @notice For a single strategy, queue deallocate magnitude for a list of operator sets + * @param operator address to deallocate magnitude for + * @param deallocation magnitude adjustment for a single strategy and multiple operator sets + * @param completableTimestamp timestamp when the queued deallocation can be completed and freeMagnitude updated + */ + function _queueDeallocate( + address operator, + MagnitudeAdjustment calldata deallocation, + uint32 completableTimestamp + ) internal { + IStrategy strategy = deallocation.strategy; + require( + deallocation.operatorSets.length == deallocation.magnitudeDiffs.length, + "AVSDirectory.queueDeallocation: operatorSets and magnitudeDiffs length mismatch" + ); + OperatorSet[] calldata operatorSets = deallocation.operatorSets; + + // deallocate from each operator set for this strategy + for (uint256 i = 0; i < operatorSets.length; ++i) { + // 1. ensure deallocation doesn't exceed current allocation + uint64 currentMagnitude = uint64( + _magnitudeUpdate[operator][strategy][operatorSets[i].avs][operatorSets[i].operatorSetId] + .upperLookupRecent(uint32(block.timestamp)) + ); + require( + deallocation.magnitudeDiffs[i] <= currentMagnitude, + "AVSDirectory.queueDeallocation: cannot deallocate more than what is allocated" + ); + + // 2. update and decrement current and future queued amounts in case any pending allocations exist + _magnitudeUpdate[operator][strategy][operatorSets[i].avs][operatorSets[i].operatorSetId] + .decrementAtAndFutureCheckpoints({ + timestamp: uint32(block.timestamp), + decrementValue: deallocation.magnitudeDiffs[i] + }); + + // TODO: ensure only 1 queued deallocation per operator, operatorSet, strategy + // _verifySinglePendingDeallocation(); + + // 3. queue deallocation for (op, opSet, strategy) for magnitudeDiff amount + _queuedDeallocations[operator][strategy][operatorSets[i].avs][operatorSets[i].operatorSetId].push( + QueuedDeallocation({ + magnitudeDiff: deallocation.magnitudeDiffs[i], + completableTimestamp: completableTimestamp + }) + ); + } + } + + /** + * @notice Completes queued deallocations for a single strategy and multiple operator sets + * @param operator address to complete deallocations for + * @param strategy the strategy to complete deallocations for + * @param operatorSet the operator set to complete deallocations for the given strategy + */ + function _completeDeallocation( + address operator, + IStrategy strategy, + OperatorSet calldata operatorSet + ) internal returns (uint64 freeMagnitudeToAdd) { + QueuedDeallocation[] memory queuedDeallocation = + _queuedDeallocations[operator][strategy][operatorSet.avs][operatorSet.operatorSetId]; + // read last completed deallocation index in the queuedDeallocations array for the (op, opSet, Strategy) tuple + uint256 i = _nextDeallocationIndex[operator][strategy][operatorSet.avs][operatorSet.operatorSetId]; + + for (; i < queuedDeallocation.length; ++i) { + // queued deallocations ordered by timestamp, if completableTimestamp is greater than completeUntilTimestamp, break + if (queuedDeallocation[i].completableTimestamp > uint32(block.timestamp)) { + break; + } + + freeMagnitudeToAdd += queuedDeallocation[i].magnitudeDiff; + } + _nextDeallocationIndex[operator][strategy][operatorSet.avs][operatorSet.operatorSetId] = i; + return freeMagnitudeToAdd; + } + /** * * VIEW FUNCTIONS @@ -462,6 +654,37 @@ contract AVSDirectory is return _operatorSetsMemberOf[operator].contains(_encodeOperatorSet(operatorSet)); } + /** + * @param operator the operator to get the slashable bips for + * @param operatorSet the operatorSet to get the slashable bips for + * @param strategy the strategy to get the slashable bips for + * @param timestamp the timestamp to get the slashable bips for for + * + * @return slashableBips the slashable bips of the given strategy owned by + * the given OperatorSet for the given operator and timestamp + */ + function getSlashableBips( + address operator, + OperatorSet calldata operatorSet, + IStrategy strategy, + uint32 timestamp + ) public view returns (uint16) { + uint64 totalMagnitude = uint64(_totalMagnitudeUpdate[operator][strategy].upperLookup(timestamp)); + uint64 currentMagnitude = uint64( + _magnitudeUpdate[operator][strategy][operatorSet.avs][operatorSet.operatorSetId].upperLookup(timestamp) + ); + + return uint16(currentMagnitude * BIPS_FACTOR / totalMagnitude); + } + + /// @notice operator is slashable by operatorSet if currently registered OR last deregistered within 21 days + function isOperatorSlashable(address operator, OperatorSet memory operatorSet) public view returns (bool) { + OperatorSetRegistrationStatus memory registrationStatus = + operatorSetStatus[operatorSet.avs][operator][operatorSet.operatorSetId]; + return registrationStatus.registered + || registrationStatus.lastDeregisteredTimestamp + ALLOCATION_DELAY >= block.timestamp; + } + /** * @notice Calculates the digest hash to be signed by an operator to register with an AVS. * diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index 2ca60b0a3..66f0d2243 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.12; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "../interfaces/IAVSDirectory.sol"; -import "../interfaces/IDelegationManager.sol"; +import {MagnitudeCheckpoints} from "../libraries/MagnitudeCheckpoints.sol"; abstract contract AVSDirectoryStorage is IAVSDirectory { using EnumerableSet for EnumerableSet.Bytes32Set; @@ -54,6 +54,28 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { /// @notice Mapping: operator => List of operator sets that operator is registered to. /// @dev Each item is formatted as such: bytes32(abi.encodePacked(avs, uint96(operatorSetId))) mapping(address => EnumerableSet.Bytes32Set) internal _operatorSetsMemberOf; + /// @notice Mapping: operator => avs => operatorSetId => operator registration status + mapping(address => mapping(address => mapping(uint32 => OperatorSetRegistrationStatus))) public operatorSetStatus; + + /// @notice Mapping: operator => strategy => checkpointed totalMagnitude + /// Note that totalMagnitude is monotonically decreasing and only gets updated upon slashing + mapping(address => mapping(IStrategy => MagnitudeCheckpoints.History)) internal _totalMagnitudeUpdate; + + /// @notice Mapping: operator => strategy => free available magnitude that can be allocated to operatorSets + /// Decrements whenever allocations take place and increments when deallocations are completed + mapping(address => mapping(IStrategy => uint64)) public freeMagnitude; + + /// @notice Mapping: operator => strategy => avs => operatorSetId => checkpointed magnitude + mapping(address => mapping(IStrategy => mapping(address => mapping(uint32 => MagnitudeCheckpoints.History)))) + internal _magnitudeUpdate; + + /// @notice Mapping: operator => strategy => avs => operatorSetId => queuedDeallocations + mapping(address => mapping(IStrategy => mapping(address => mapping(uint32 => QueuedDeallocation[])))) internal + _queuedDeallocations; + + /// @notice Mapping: operator => strategy => avs => operatorSetId => index pointing to next queuedDeallocation to complete + mapping(address => mapping(IStrategy => mapping(address => mapping(uint32 => uint256)))) internal + _nextDeallocationIndex; constructor(IDelegationManager _delegation) { delegation = _delegation; @@ -64,5 +86,5 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[43] private __gap; + uint256[36] private __gap; } diff --git a/src/contracts/interfaces/IAVSDirectory.sol b/src/contracts/interfaces/IAVSDirectory.sol index 9871e2992..a8308bbd5 100644 --- a/src/contracts/interfaces/IAVSDirectory.sol +++ b/src/contracts/interfaces/IAVSDirectory.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; +import "./IDelegationManager.sol"; import "./ISignatureUtils.sol"; interface IAVSDirectory is ISignatureUtils { @@ -12,12 +13,49 @@ interface IAVSDirectory is ISignatureUtils { } + /** + * @notice Struct representing the registration status of an operator with an operator set. + * Keeps track of last deregistered timestamp for slashability concerns. + * @param registered whether the operator is registered with the operator set + * @param lastDeregisteredTimestamp the timestamp at which the operator was last deregistered + */ + struct OperatorSetRegistrationStatus { + bool registered; + uint32 lastDeregisteredTimestamp; + } + /// @notice Struct representing an operator set struct OperatorSet { address avs; uint32 operatorSetId; } + /** + * @notice this struct is used in allocate and queueDeallocation in order to specify an operator's slashability for a certain operator set + * + * @param strategy the strategy to adjust slashable stake for + * @param operatorSets the operator sets to adjust slashable stake for + * @param magnitudeDiff magnitude difference; the difference in proportional parts of the operator's slashable stake + * that is slashable by the operatorSet. + * Slashable stake for an operator set is (magnitude / totalMagnitude) of an operator's delegated stake. + */ + struct MagnitudeAdjustment { + IStrategy strategy; + OperatorSet[] operatorSets; + uint64[] magnitudeDiffs; + } + + /** + * @notice struct used for queued deallocations. Stored in (operator, strategy, operatorSet) mapping + * to be used in completeDeallocations. + * @param magnitudeDiff the amount of magnitude to deallocate + * @param completableTimestamp the timestamp at which the deallocation can be completed, 21 days from when queued + */ + struct QueuedDeallocation { + uint64 magnitudeDiff; + uint32 completableTimestamp; + } + /// @notice Emitted when an operator set is created by an AVS. event OperatorSetCreated(OperatorSet operatorSet); @@ -45,6 +83,41 @@ interface IAVSDirectory is ISignatureUtils { /// @notice Emitted when an operator is migrated from M2 registration to operator sets. event OperatorMigratedToOperatorSets(address indexed operator, address indexed avs, uint32[] operatorSetIds); + /// @notice Emitted when an operator allocates slashable magnitude to an operator set + event MagnitudeAllocated( + address operator, + IStrategy strategy, + OperatorSet operatorSet, + uint64 magnitudeToAllocate, + uint32 effectTimestamp + ); + + /// @notice Emitted when an operator queues deallocations of slashable magnitude from an operator set + event MagnitudeQueueDeallocated( + address operator, + IStrategy strategy, + OperatorSet operatorSet, + uint64 magnitudeToDeallocate, + uint32 completableTimestamp + ); + + /// @notice Emitted when an operator completes deallocations of slashable magnitude from an operator set + /// and adds back magnitude to free allocatable magnitude + event MagnitudeDeallocationCompleted( + address operator, + IStrategy strategy, + OperatorSet operatorSet, + uint64 freeMagnitudeAdded + ); + + /// @notice Emitted when an operator is slashed by an operator set for a strategy + event OperatorSlashed( + address operator, + uint32 operatorSetId, + IStrategy strategy, + uint16 bipsToSlash + ); + /** * * EXTERNAL FUNCTIONS @@ -129,27 +202,69 @@ interface IAVSDirectory is ISignatureUtils { ) external; /** - * @notice Called by the AVS's service manager contract to register an operator with the AVS. + * @notice Allocates a set of magnitude adjustments to increase the slashable stake of an operator set for the given operator for the given strategy. + * Nonslashable magnitude for each strategy will decrement by the sum of all + * allocations for that strategy and the allocations will take effect 21 days from calling. * - * @param operator The address of the operator to register. - * @param operatorSignature The signature, salt, and expiry of the operator's signature. + * @param operator address to increase allocations for + * @param allocations array of magnitude adjustments for multiple strategies and corresponding operator sets + * @param operatorSignature signature of the operator if msg.sender is not the operator + */ + function allocate( + address operator, + MagnitudeAdjustment[] calldata allocations, + SignatureWithSaltAndExpiry calldata operatorSignature + ) external; + + /** + * @notice Queues a set of magnitude adjustments to decrease the slashable stake of an operator set for the given operator for the given strategy. + * The deallocations will take effect 21 days from calling. In order for the operator to have their nonslashable magnitude increased, + * they must call the contract again to complete the deallocation. Stake deallocations are still subject to slashing until 21 days have passed since queuing. * - * @dev msg.sender must be the AVS. - * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. + * @param operator address to decrease allocations for + * @param deallocations array of magnitude adjustments for multiple strategies and corresponding operator sets + * @param operatorSignature signature of the operator if msg.sender is not the operator */ - function registerOperatorToAVS( + function queueDeallocate( address operator, - ISignatureUtils.SignatureWithSaltAndExpiry memory operatorSignature + MagnitudeAdjustment[] calldata deallocations, + SignatureWithSaltAndExpiry calldata operatorSignature ) external; /** - * @notice Called by an AVS to deregister an operator from the AVS. + * @notice Complete queued deallocations of slashable stake for an operator, permissionlessly called by anyone + * Increments the free magnitude of the operator by the sum of all deallocation amounts for each strategy. + * If the operator was slashed, this will be a smaller amount than during queuing. * - * @param operator The address of the operator to deregister. + * @param operator address to complete deallocations for + * @param strategies a list of strategies to complete deallocations for + * @param operatorSets a 2d list of operator sets to complete deallocations for, one list for each strategy * - * @dev Only used by legacy M2 AVSs that have not integrated with operator sets. + * @dev can be called permissionlessly by anyone */ - function deregisterOperatorFromAVS(address operator) external; + function completeDeallocations( + address operator, + IStrategy[] calldata strategies, + OperatorSet[][] calldata operatorSets + ) external; + + /** + * @notice Called by an AVS to slash an operator for given operatorSetId, list of strategies, and bipsToSlash. + * For each given (operator, operatorSetId, strategy) tuple, bipsToSlash + * bips of the operatorSet's slashable stake allocation will be slashed + * + * @param operator the address to slash + * @param operatorSetId the ID of the operatorSet the operator is being slashed on behalf of + * @param strategies the set of strategies to slash + * @param bipsToSlash the number of bips to slash, this will be proportional to the + * operator's slashable stake allocation for the operatorSet + */ + function slashOperator( + address operator, + uint32 operatorSetId, + IStrategy[] calldata strategies, + uint16 bipsToSlash + ) external; /** * @notice Called by an AVS to emit an `AVSMetadataURIUpdated` event indicating the information has updated. @@ -172,6 +287,31 @@ interface IAVSDirectory is ISignatureUtils { * VIEW FUNCTIONS * */ + + /** + * @notice operator is slashable by operatorSet if currently registered OR last deregistered within 21 days + * @param operator the operator to check slashability for + * @param operatorSet the operatorSet to check slashability for + * @return bool if the operator is slashable by the operatorSet + */ + function isOperatorSlashable(address operator, OperatorSet memory operatorSet) external view returns (bool); + + /** + * @param operator the operator to get the slashable bips for + * @param operatorSet the operatorSet to get the slashable bips for + * @param strategy the strategy to get the slashable bips for + * @param timestamp the timestamp to get the slashable bips for for + * + * @return slashableBips the slashable bips of the given strategy owned by + * the given OperatorSet for the given operator and timestamp + */ + function getSlashableBips( + address operator, + OperatorSet calldata operatorSet, + IStrategy strategy, + uint32 timestamp + ) external view returns (uint16); + function operatorSaltIsSpent(address operator, bytes32 salt) external view returns (bool); function isMember(address operator, OperatorSet memory operatorSet) external view returns (bool); diff --git a/src/contracts/libraries/MagnitudeCheckpoints.sol b/src/contracts/libraries/MagnitudeCheckpoints.sol new file mode 100644 index 000000000..f0f3a7a45 --- /dev/null +++ b/src/contracts/libraries/MagnitudeCheckpoints.sol @@ -0,0 +1,273 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "@openzeppelin-upgrades-v4.9.0/contracts/utils/math/MathUpgradeable.sol"; +import "@openzeppelin-upgrades-v4.9.0/contracts/utils/math/SafeCastUpgradeable.sol"; + +/** + * @title Library for handling checkpointed magnitudes as part of allocating and slashing. + * @notice This library is using OpenZeppelin's CheckpointsUpgradeable library (v4.9.0) + * and removes structs and functions that are unessential. + * Interfaces and structs are renamed for clarity and usage (magnitudes, timestamps, etc). + * Some additional functions have also been added for convenience. + * @dev This library defines the `History` struct, for checkpointing values as they change at different points in + * time, and later looking up past values by block number. See {Votes} as an example. + * + * To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new + * checkpoint for the current transaction block using the {push} function. + * + * _Available since v4.5._ + */ +library MagnitudeCheckpoints { + struct History { + MagnitudeCheckpoint[] _magnitudes; + } + + struct MagnitudeCheckpoint { + uint32 _timestamp; + uint224 _value; + } + + /** + * @dev Pushes a (`timestamp`, `value`) pair into a History so that it is stored as the checkpoint. + * + * Returns previous value and new value. + */ + function push(History storage self, uint32 timestamp, uint224 value) internal returns (uint224, uint224) { + return _insert(self._magnitudes, timestamp, value); + } + + /** + * @dev Returns the value in the first (oldest) checkpoint with timestamp greater or equal than the search timestamp, or zero if there is none. + */ + function lowerLookup(History storage self, uint32 timestamp) internal view returns (uint224) { + uint256 len = self._magnitudes.length; + uint256 pos = _lowerBinaryLookup(self._magnitudes, timestamp, 0, len); + return pos == len ? 0 : _unsafeAccess(self._magnitudes, pos)._value; + } + + /** + * @dev Returns the value in the last (most recent) checkpoint with timestamp lower or equal than the search timestamp, or zero if there is none. + */ + function upperLookup(History storage self, uint32 timestamp) internal view returns (uint224) { + uint256 len = self._magnitudes.length; + uint256 pos = _upperBinaryLookup(self._magnitudes, timestamp, 0, len); + return pos == 0 ? 0 : _unsafeAccess(self._magnitudes, pos - 1)._value; + } + + /** + * @dev Returns the value in the last (most recent) checkpoint with timestamp lower or equal than the search timestamp, or zero if there is none. + * + * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" checkpoint (checkpoints with high timestamps). + */ + function upperLookupRecent(History storage self, uint32 timestamp) internal view returns (uint224) { + uint256 len = self._magnitudes.length; + + uint256 low = 0; + uint256 high = len; + + if (len > 5) { + uint256 mid = len - MathUpgradeable.sqrt(len); + if (timestamp < _unsafeAccess(self._magnitudes, mid)._timestamp) { + high = mid; + } else { + low = mid + 1; + } + } + + uint256 pos = _upperBinaryLookup(self._magnitudes, timestamp, low, high); + + return pos == 0 ? 0 : _unsafeAccess(self._magnitudes, pos - 1)._value; + } + + /** + * @dev Returns the value in the most recent checkpoint, or zero if there are no checkpoints. + */ + function latest(History storage self) internal view returns (uint224) { + uint256 pos = self._magnitudes.length; + return pos == 0 ? 0 : _unsafeAccess(self._magnitudes, pos - 1)._value; + } + + /** + * @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the timestamp and value + * in the most recent checkpoint. + */ + function latestCheckpoint(History storage self) internal view returns (bool exists, uint32 _timestamp, uint224 _value) { + uint256 pos = self._magnitudes.length; + if (pos == 0) { + return (false, 0, 0); + } else { + MagnitudeCheckpoint memory ckpt = _unsafeAccess(self._magnitudes, pos - 1); + return (true, ckpt._timestamp, ckpt._value); + } + } + + /** + * @dev Returns the number of checkpoint. + */ + function length(History storage self) internal view returns (uint256) { + return self._magnitudes.length; + } + + /** + * @dev Pushes a (`timestamp`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint, + * or by updating the last one. + */ + function _insert(MagnitudeCheckpoint[] storage self, uint32 timestamp, uint224 value) private returns (uint224, uint224) { + uint256 pos = self.length; + + if (pos > 0) { + // Copying to memory is important here. + MagnitudeCheckpoint memory last = _unsafeAccess(self, pos - 1); + + // Checkpoint timestamps must be non-decreasing. + require(last._timestamp <= timestamp, "Checkpoint: decreasing timestamps"); + + // Update or push new checkpoint + if (last._timestamp == timestamp) { + _unsafeAccess(self, pos - 1)._value = value; + } else { + self.push(MagnitudeCheckpoint({_timestamp: timestamp, _value: value})); + } + return (last._value, value); + } else { + self.push(MagnitudeCheckpoint({_timestamp: timestamp, _value: value})); + return (0, value); + } + } + + /** + * @dev Return the index of the last (most recent) checkpoint with timestamp lower or equal than the search timestamp, or `high` if there is none. + * `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`. + * + * WARNING: `high` should not be greater than the array's length. + */ + function _upperBinaryLookup( + MagnitudeCheckpoint[] storage self, + uint32 timestamp, + uint256 low, + uint256 high + ) private view returns (uint256) { + while (low < high) { + uint256 mid = MathUpgradeable.average(low, high); + if (_unsafeAccess(self, mid)._timestamp > timestamp) { + high = mid; + } else { + low = mid + 1; + } + } + return high; + } + + /** + * @dev Return the index of the first (oldest) checkpoint with timestamp is greater or equal than the search timestamp, or `high` if there is none. + * `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`. + * + * WARNING: `high` should not be greater than the array's length. + */ + function _lowerBinaryLookup( + MagnitudeCheckpoint[] storage self, + uint32 timestamp, + uint256 low, + uint256 high + ) private view returns (uint256) { + while (low < high) { + uint256 mid = MathUpgradeable.average(low, high); + if (_unsafeAccess(self, mid)._timestamp < timestamp) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + + /** + * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds. + */ + function _unsafeAccess( + MagnitudeCheckpoint[] storage self, + uint256 pos + ) private pure returns (MagnitudeCheckpoint storage result) { + assembly { + mstore(0, self.slot) + result.slot := add(keccak256(0, 0x20), pos) + } + } + + /** + * + * ADDITIONAL FUNCTIONS FROM EIGEN-LABS + * + */ + + /** + * @dev Returns the value in the last (most recent) checkpoint with timestamp lower or equal than the search timestamp, or zero if there is none. + * In addition, returns the position of the checkpoint in the array. + * + * NOTE: That if value != 0 && pos == 0, then that means the value is the first checkpoint and actually exists + * a checkpoint DNE iff value == 0 && pos == 0 + */ + function upperLookupWithPos(History storage self, uint32 timestamp) internal view returns (uint224, uint256) { + uint256 len = self._magnitudes.length; + uint256 pos = _upperBinaryLookup(self._magnitudes, timestamp, 0, len); + return pos == 0 ? (0, 0) : (_unsafeAccess(self._magnitudes, pos - 1)._value, pos - 1); + } + + /** + * @dev Returns the value in the last (most recent) checkpoint with timestamp lower or equal than the search timestamp, or zero if there is none. + * In addition, returns the position of the checkpoint in the array. + * + * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" checkpoint (checkpoints with high timestamps). + * NOTE: That if value != 0 && pos == 0, then that means the value is the first checkpoint and actually exists + * a checkpoint DNE iff value == 0 && pos == 0 => value == 0 + */ + function upperLookupRecentWithPos(History storage self, uint32 timestamp) internal view returns (uint224, uint256) { + uint256 len = self._magnitudes.length; + + uint256 low = 0; + uint256 high = len; + + if (len > 5) { + uint256 mid = len - MathUpgradeable.sqrt(len); + if (timestamp < _unsafeAccess(self._magnitudes, mid)._timestamp) { + high = mid; + } else { + low = mid + 1; + } + } + + uint256 pos = _upperBinaryLookup(self._magnitudes, timestamp, low, high); + + return pos == 0 ? (0, 0) : (_unsafeAccess(self._magnitudes, pos - 1)._value, pos - 1); + } + + /// @notice WARNING: this function is only used because of the invariant property + /// that from the current timestamp, all future checkpointed magnitude values are strictly > current value. + /// Use function with extreme care for other situations. + function decrementAtAndFutureCheckpoints( + History storage self, + uint32 timestamp, + uint224 decrementValue + ) internal { + (uint224 value, uint256 pos) = upperLookupRecentWithPos(self, timestamp); + + // if there is no checkpoint, return + if (value == 0 && pos == 0) { + pos = type(uint256).max; + } + + uint256 len = self._magnitudes.length; + while (pos < len) { + MagnitudeCheckpoint storage current = _unsafeAccess(self._magnitudes, pos); + + // reverts from underflow. Expected to never happen in our usage + current._value -= decrementValue; + + unchecked { + ++pos; + } + } + } +} diff --git a/src/test/mocks/AVSDirectoryMock.sol b/src/test/mocks/AVSDirectoryMock.sol index f88529874..d21604c4a 100644 --- a/src/test/mocks/AVSDirectoryMock.sol +++ b/src/test/mocks/AVSDirectoryMock.sol @@ -36,6 +36,31 @@ contract AVSDirectoryMock is IAVSDirectory, Test { function deregisterOperatorFromAVS(address operator) external {} + function allocate( + address operator, + MagnitudeAdjustment[] calldata allocations, + SignatureWithSaltAndExpiry calldata operatorSignature + ) external {} + + function queueDeallocate( + address operator, + MagnitudeAdjustment[] calldata deallocations, + SignatureWithSaltAndExpiry calldata operatorSignature + ) external {} + + function completeDeallocations( + address operator, + IStrategy[] calldata strategies, + OperatorSet[][] calldata operatorSets + ) external {} + + function slashOperator( + address operator, + uint32 operatorSetId, + IStrategy[] calldata strategies, + uint16 bipsToSlash + ) external {} + function updateAVSMetadataURI(string calldata metadataURI) external {} function cancelSalt(bytes32 salt) external {} @@ -50,6 +75,15 @@ contract AVSDirectoryMock is IAVSDirectory, Test { return true; } + function isOperatorSlashable(address operator, OperatorSet memory operatorSet) external view returns (bool) {} + + function getSlashableBips( + address operator, + OperatorSet calldata operatorSet, + IStrategy strategy, + uint32 timestamp + ) external view returns (uint16) {} + function calculateOperatorAVSRegistrationDigestHash( address operator, address avs, From d795e1cb85e8cb0eccea3982899364d161531e31 Mon Sep 17 00:00:00 2001 From: Michael Sun Date: Mon, 12 Aug 2024 13:23:41 -0400 Subject: [PATCH 36/43] chore: rename back to checkpoints --- src/contracts/core/AVSDirectory.sol | 30 +++- src/contracts/core/AVSDirectoryStorage.sol | 6 +- ...gnitudeCheckpoints.sol => Checkpoints.sol} | 138 +++++++++--------- 3 files changed, 97 insertions(+), 77 deletions(-) rename src/contracts/libraries/{MagnitudeCheckpoints.sol => Checkpoints.sol} (55%) diff --git a/src/contracts/core/AVSDirectory.sol b/src/contracts/core/AVSDirectory.sol index 4d3645bd5..1f471e50c 100644 --- a/src/contracts/core/AVSDirectory.sol +++ b/src/contracts/core/AVSDirectory.sol @@ -17,7 +17,7 @@ contract AVSDirectory is ReentrancyGuardUpgradeable { using EnumerableSet for EnumerableSet.Bytes32Set; - using MagnitudeCheckpoints for MagnitudeCheckpoints.History; + using Checkpoints for Checkpoints.History; /// @dev Index for flag that pauses operator register/deregister to avs when set. uint8 internal constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0; @@ -364,7 +364,7 @@ contract AVSDirectory is slashedMagnitude = uint64(uint256(bipsToSlash) * uint256(currentMagnitude) / BIPS_FACTOR); _magnitudeUpdate[operator][strategies[i]][msg.sender][operatorSetId].decrementAtAndFutureCheckpoints({ - timestamp: uint32(block.timestamp), + key: uint32(block.timestamp), decrementValue: slashedMagnitude }); } @@ -392,7 +392,7 @@ contract AVSDirectory is // 3. update totalMagnitude, get total magnitude and subtract slashedMagnitude and slashedFromDeallocation _totalMagnitudeUpdate[operator][strategies[i]].push({ - timestamp: uint32(block.timestamp), + key: uint32(block.timestamp), value: _totalMagnitudeUpdate[operator][strategies[i]].latest() - slashedMagnitude - slashedFromDeallocation }); } @@ -522,7 +522,7 @@ contract AVSDirectory is // 3. allocate magnitude which will take effect in the future 21 days from now _magnitudeUpdate[operator][strategy][operatorSets[i].avs][operatorSets[i].operatorSetId].push({ - timestamp: effectTimestamp, + key: effectTimestamp, value: value + uint224(allocation.magnitudeDiffs[i]) }); // 4. keep track of available freeMagnitude to update later @@ -566,7 +566,7 @@ contract AVSDirectory is // 2. update and decrement current and future queued amounts in case any pending allocations exist _magnitudeUpdate[operator][strategy][operatorSets[i].avs][operatorSets[i].operatorSetId] .decrementAtAndFutureCheckpoints({ - timestamp: uint32(block.timestamp), + key: uint32(block.timestamp), decrementValue: deallocation.magnitudeDiffs[i] }); @@ -685,6 +685,26 @@ contract AVSDirectory is || registrationStatus.lastDeregisteredTimestamp + ALLOCATION_DELAY >= block.timestamp; } + // /** + // * @notice fetches the minimum slashable shares for a certain operator and operatorSet for a list of strategies + // * from the current timestamp until the given timestamp + // * + // * @param operator the operator to get the minimum slashable shares for + // * @param operatorSet the operatorSet to get the minimum slashable shares for + // * @param strategies the strategies to get the minimum slashable shares for + // * @param timestamp the timestamp to the minimum slashable shares before + // * + // * @dev used to get the slashable stakes of operators to weigh over a given slashability window + // * + // * @return the list of share amounts for each strategy + // */ + // function getMinimumSlashableSharesBefore( + // address operator, + // OperatorSet calldata operatorSet, + // IStrategy[] calldata strategies, + // uint32 timestamp + // ) external view returns (uint256[] calldata) {} + /** * @notice Calculates the digest hash to be signed by an operator to register with an AVS. * diff --git a/src/contracts/core/AVSDirectoryStorage.sol b/src/contracts/core/AVSDirectoryStorage.sol index 66f0d2243..0c54c28bd 100644 --- a/src/contracts/core/AVSDirectoryStorage.sol +++ b/src/contracts/core/AVSDirectoryStorage.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.12; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "../interfaces/IAVSDirectory.sol"; -import {MagnitudeCheckpoints} from "../libraries/MagnitudeCheckpoints.sol"; +import {Checkpoints} from "../libraries/Checkpoints.sol"; abstract contract AVSDirectoryStorage is IAVSDirectory { using EnumerableSet for EnumerableSet.Bytes32Set; @@ -59,14 +59,14 @@ abstract contract AVSDirectoryStorage is IAVSDirectory { /// @notice Mapping: operator => strategy => checkpointed totalMagnitude /// Note that totalMagnitude is monotonically decreasing and only gets updated upon slashing - mapping(address => mapping(IStrategy => MagnitudeCheckpoints.History)) internal _totalMagnitudeUpdate; + mapping(address => mapping(IStrategy => Checkpoints.History)) internal _totalMagnitudeUpdate; /// @notice Mapping: operator => strategy => free available magnitude that can be allocated to operatorSets /// Decrements whenever allocations take place and increments when deallocations are completed mapping(address => mapping(IStrategy => uint64)) public freeMagnitude; /// @notice Mapping: operator => strategy => avs => operatorSetId => checkpointed magnitude - mapping(address => mapping(IStrategy => mapping(address => mapping(uint32 => MagnitudeCheckpoints.History)))) + mapping(address => mapping(IStrategy => mapping(address => mapping(uint32 => Checkpoints.History)))) internal _magnitudeUpdate; /// @notice Mapping: operator => strategy => avs => operatorSetId => queuedDeallocations diff --git a/src/contracts/libraries/MagnitudeCheckpoints.sol b/src/contracts/libraries/Checkpoints.sol similarity index 55% rename from src/contracts/libraries/MagnitudeCheckpoints.sol rename to src/contracts/libraries/Checkpoints.sol index f0f3a7a45..539290f4c 100644 --- a/src/contracts/libraries/MagnitudeCheckpoints.sol +++ b/src/contracts/libraries/Checkpoints.sol @@ -6,10 +6,10 @@ import "@openzeppelin-upgrades-v4.9.0/contracts/utils/math/MathUpgradeable.sol"; import "@openzeppelin-upgrades-v4.9.0/contracts/utils/math/SafeCastUpgradeable.sol"; /** - * @title Library for handling checkpointed magnitudes as part of allocating and slashing. + * @title Library for handling checkpoints as part of allocating and slashing. * @notice This library is using OpenZeppelin's CheckpointsUpgradeable library (v4.9.0) * and removes structs and functions that are unessential. - * Interfaces and structs are renamed for clarity and usage (magnitudes, timestamps, etc). + * Interfaces and structs are renamed for clarity and usage (timestamps, etc). * Some additional functions have also been added for convenience. * @dev This library defines the `History` struct, for checkpointing values as they change at different points in * time, and later looking up past values by block number. See {Votes} as an example. @@ -19,87 +19,87 @@ import "@openzeppelin-upgrades-v4.9.0/contracts/utils/math/SafeCastUpgradeable.s * * _Available since v4.5._ */ -library MagnitudeCheckpoints { +library Checkpoints { struct History { - MagnitudeCheckpoint[] _magnitudes; + Checkpoint[] _checkpoints; } - struct MagnitudeCheckpoint { - uint32 _timestamp; + struct Checkpoint { + uint32 _key; uint224 _value; } /** - * @dev Pushes a (`timestamp`, `value`) pair into a History so that it is stored as the checkpoint. + * @dev Pushes a (`key`, `value`) pair into a History so that it is stored as the checkpoint. * * Returns previous value and new value. */ - function push(History storage self, uint32 timestamp, uint224 value) internal returns (uint224, uint224) { - return _insert(self._magnitudes, timestamp, value); + function push(History storage self, uint32 key, uint224 value) internal returns (uint224, uint224) { + return _insert(self._checkpoints, key, value); } /** - * @dev Returns the value in the first (oldest) checkpoint with timestamp greater or equal than the search timestamp, or zero if there is none. + * @dev Returns the value in the first (oldest) checkpoint with key greater or equal than the search key, or zero if there is none. */ - function lowerLookup(History storage self, uint32 timestamp) internal view returns (uint224) { - uint256 len = self._magnitudes.length; - uint256 pos = _lowerBinaryLookup(self._magnitudes, timestamp, 0, len); - return pos == len ? 0 : _unsafeAccess(self._magnitudes, pos)._value; + function lowerLookup(History storage self, uint32 key) internal view returns (uint224) { + uint256 len = self._checkpoints.length; + uint256 pos = _lowerBinaryLookup(self._checkpoints, key, 0, len); + return pos == len ? 0 : _unsafeAccess(self._checkpoints, pos)._value; } /** - * @dev Returns the value in the last (most recent) checkpoint with timestamp lower or equal than the search timestamp, or zero if there is none. + * @dev Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero if there is none. */ - function upperLookup(History storage self, uint32 timestamp) internal view returns (uint224) { - uint256 len = self._magnitudes.length; - uint256 pos = _upperBinaryLookup(self._magnitudes, timestamp, 0, len); - return pos == 0 ? 0 : _unsafeAccess(self._magnitudes, pos - 1)._value; + function upperLookup(History storage self, uint32 key) internal view returns (uint224) { + uint256 len = self._checkpoints.length; + uint256 pos = _upperBinaryLookup(self._checkpoints, key, 0, len); + return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; } /** - * @dev Returns the value in the last (most recent) checkpoint with timestamp lower or equal than the search timestamp, or zero if there is none. + * @dev Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero if there is none. * - * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" checkpoint (checkpoints with high timestamps). + * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" checkpoint (checkpoints with high keys). */ - function upperLookupRecent(History storage self, uint32 timestamp) internal view returns (uint224) { - uint256 len = self._magnitudes.length; + function upperLookupRecent(History storage self, uint32 key) internal view returns (uint224) { + uint256 len = self._checkpoints.length; uint256 low = 0; uint256 high = len; if (len > 5) { uint256 mid = len - MathUpgradeable.sqrt(len); - if (timestamp < _unsafeAccess(self._magnitudes, mid)._timestamp) { + if (key < _unsafeAccess(self._checkpoints, mid)._key) { high = mid; } else { low = mid + 1; } } - uint256 pos = _upperBinaryLookup(self._magnitudes, timestamp, low, high); + uint256 pos = _upperBinaryLookup(self._checkpoints, key, low, high); - return pos == 0 ? 0 : _unsafeAccess(self._magnitudes, pos - 1)._value; + return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; } /** * @dev Returns the value in the most recent checkpoint, or zero if there are no checkpoints. */ function latest(History storage self) internal view returns (uint224) { - uint256 pos = self._magnitudes.length; - return pos == 0 ? 0 : _unsafeAccess(self._magnitudes, pos - 1)._value; + uint256 pos = self._checkpoints.length; + return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value; } /** - * @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the timestamp and value + * @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value * in the most recent checkpoint. */ - function latestCheckpoint(History storage self) internal view returns (bool exists, uint32 _timestamp, uint224 _value) { - uint256 pos = self._magnitudes.length; + function latestCheckpoint(History storage self) internal view returns (bool exists, uint32 _key, uint224 _value) { + uint256 pos = self._checkpoints.length; if (pos == 0) { return (false, 0, 0); } else { - MagnitudeCheckpoint memory ckpt = _unsafeAccess(self._magnitudes, pos - 1); - return (true, ckpt._timestamp, ckpt._value); + Checkpoint memory ckpt = _unsafeAccess(self._checkpoints, pos - 1); + return (true, ckpt._key, ckpt._value); } } @@ -107,51 +107,51 @@ library MagnitudeCheckpoints { * @dev Returns the number of checkpoint. */ function length(History storage self) internal view returns (uint256) { - return self._magnitudes.length; + return self._checkpoints.length; } /** - * @dev Pushes a (`timestamp`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint, + * @dev Pushes a (`key`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint, * or by updating the last one. */ - function _insert(MagnitudeCheckpoint[] storage self, uint32 timestamp, uint224 value) private returns (uint224, uint224) { + function _insert(Checkpoint[] storage self, uint32 key, uint224 value) private returns (uint224, uint224) { uint256 pos = self.length; if (pos > 0) { // Copying to memory is important here. - MagnitudeCheckpoint memory last = _unsafeAccess(self, pos - 1); + Checkpoint memory last = _unsafeAccess(self, pos - 1); - // Checkpoint timestamps must be non-decreasing. - require(last._timestamp <= timestamp, "Checkpoint: decreasing timestamps"); + // Checkpoint keys must be non-decreasing. + require(last._key <= key, "Checkpoint: decreasing keys"); // Update or push new checkpoint - if (last._timestamp == timestamp) { + if (last._key == key) { _unsafeAccess(self, pos - 1)._value = value; } else { - self.push(MagnitudeCheckpoint({_timestamp: timestamp, _value: value})); + self.push(Checkpoint({_key: key, _value: value})); } return (last._value, value); } else { - self.push(MagnitudeCheckpoint({_timestamp: timestamp, _value: value})); + self.push(Checkpoint({_key: key, _value: value})); return (0, value); } } /** - * @dev Return the index of the last (most recent) checkpoint with timestamp lower or equal than the search timestamp, or `high` if there is none. + * @dev Return the index of the last (most recent) checkpoint with key lower or equal than the search key, or `high` if there is none. * `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`. * * WARNING: `high` should not be greater than the array's length. */ function _upperBinaryLookup( - MagnitudeCheckpoint[] storage self, - uint32 timestamp, + Checkpoint[] storage self, + uint32 key, uint256 low, uint256 high ) private view returns (uint256) { while (low < high) { uint256 mid = MathUpgradeable.average(low, high); - if (_unsafeAccess(self, mid)._timestamp > timestamp) { + if (_unsafeAccess(self, mid)._key > key) { high = mid; } else { low = mid + 1; @@ -161,20 +161,20 @@ library MagnitudeCheckpoints { } /** - * @dev Return the index of the first (oldest) checkpoint with timestamp is greater or equal than the search timestamp, or `high` if there is none. + * @dev Return the index of the first (oldest) checkpoint with key is greater or equal than the search key, or `high` if there is none. * `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`. * * WARNING: `high` should not be greater than the array's length. */ function _lowerBinaryLookup( - MagnitudeCheckpoint[] storage self, - uint32 timestamp, + Checkpoint[] storage self, + uint32 key, uint256 low, uint256 high ) private view returns (uint256) { while (low < high) { uint256 mid = MathUpgradeable.average(low, high); - if (_unsafeAccess(self, mid)._timestamp < timestamp) { + if (_unsafeAccess(self, mid)._key < key) { low = mid + 1; } else { high = mid; @@ -187,9 +187,9 @@ library MagnitudeCheckpoints { * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds. */ function _unsafeAccess( - MagnitudeCheckpoint[] storage self, + Checkpoint[] storage self, uint256 pos - ) private pure returns (MagnitudeCheckpoint storage result) { + ) private pure returns (Checkpoint storage result) { assembly { mstore(0, self.slot) result.slot := add(keccak256(0, 0x20), pos) @@ -203,64 +203,64 @@ library MagnitudeCheckpoints { */ /** - * @dev Returns the value in the last (most recent) checkpoint with timestamp lower or equal than the search timestamp, or zero if there is none. + * @dev Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero if there is none. * In addition, returns the position of the checkpoint in the array. * * NOTE: That if value != 0 && pos == 0, then that means the value is the first checkpoint and actually exists * a checkpoint DNE iff value == 0 && pos == 0 */ - function upperLookupWithPos(History storage self, uint32 timestamp) internal view returns (uint224, uint256) { - uint256 len = self._magnitudes.length; - uint256 pos = _upperBinaryLookup(self._magnitudes, timestamp, 0, len); - return pos == 0 ? (0, 0) : (_unsafeAccess(self._magnitudes, pos - 1)._value, pos - 1); + function upperLookupWithPos(History storage self, uint32 key) internal view returns (uint224, uint256) { + uint256 len = self._checkpoints.length; + uint256 pos = _upperBinaryLookup(self._checkpoints, key, 0, len); + return pos == 0 ? (0, 0) : (_unsafeAccess(self._checkpoints, pos - 1)._value, pos - 1); } /** - * @dev Returns the value in the last (most recent) checkpoint with timestamp lower or equal than the search timestamp, or zero if there is none. + * @dev Returns the value in the last (most recent) checkpoint with key lower or equal than the search key, or zero if there is none. * In addition, returns the position of the checkpoint in the array. * - * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" checkpoint (checkpoints with high timestamps). + * NOTE: This is a variant of {upperLookup} that is optimised to find "recent" checkpoint (checkpoints with high keys). * NOTE: That if value != 0 && pos == 0, then that means the value is the first checkpoint and actually exists * a checkpoint DNE iff value == 0 && pos == 0 => value == 0 */ - function upperLookupRecentWithPos(History storage self, uint32 timestamp) internal view returns (uint224, uint256) { - uint256 len = self._magnitudes.length; + function upperLookupRecentWithPos(History storage self, uint32 key) internal view returns (uint224, uint256) { + uint256 len = self._checkpoints.length; uint256 low = 0; uint256 high = len; if (len > 5) { uint256 mid = len - MathUpgradeable.sqrt(len); - if (timestamp < _unsafeAccess(self._magnitudes, mid)._timestamp) { + if (key < _unsafeAccess(self._checkpoints, mid)._key) { high = mid; } else { low = mid + 1; } } - uint256 pos = _upperBinaryLookup(self._magnitudes, timestamp, low, high); + uint256 pos = _upperBinaryLookup(self._checkpoints, key, low, high); - return pos == 0 ? (0, 0) : (_unsafeAccess(self._magnitudes, pos - 1)._value, pos - 1); + return pos == 0 ? (0, 0) : (_unsafeAccess(self._checkpoints, pos - 1)._value, pos - 1); } /// @notice WARNING: this function is only used because of the invariant property - /// that from the current timestamp, all future checkpointed magnitude values are strictly > current value. + /// that from the current key, all future checkpointed magnitude values are strictly > current value. /// Use function with extreme care for other situations. function decrementAtAndFutureCheckpoints( History storage self, - uint32 timestamp, + uint32 key, uint224 decrementValue ) internal { - (uint224 value, uint256 pos) = upperLookupRecentWithPos(self, timestamp); + (uint224 value, uint256 pos) = upperLookupRecentWithPos(self, key); // if there is no checkpoint, return if (value == 0 && pos == 0) { pos = type(uint256).max; } - uint256 len = self._magnitudes.length; + uint256 len = self._checkpoints.length; while (pos < len) { - MagnitudeCheckpoint storage current = _unsafeAccess(self._magnitudes, pos); + Checkpoint storage current = _unsafeAccess(self._checkpoints, pos); // reverts from underflow. Expected to never happen in our usage current._value -= decrementValue; From 04087491c6fa3f462b07028a279d2b0c66e92494 Mon Sep 17 00:00:00 2001 From: Alex <18387287+wadealexc@users.noreply.github.com> Date: Fri, 9 Aug 2024 18:30:22 -0400 Subject: [PATCH 37/43] feat: partial withdrawal batching (#515) * feat: implement pepe * move state into Storage contract * remove withdrawal proof method * feat: poc for partial withdrawal batching * feat: remove beaconChainOracle in favor of 4788 * modify verifyStaleBalance to use plural form * add pause flags for new methods * deprecate old state variables * minor cleanup and commenting * chore: get things compiling * i commented out/deleted a bajillion tests * fix: adjust storage footprint to be consistent with m2 * feat: adjust verifyStaleBalance to allow anyone to start a checkpoint * removes staleness concept from pod and manager state * clean: clean up start checkpoint logic * clean: remove comments * clean: remove outdated comment and rename proofs method * fix: remove unused variable and deprecate another * chore: rename lastFinalizedCheckpoint to lastCheckpointTimestamp * feat: add events for checkpoint creation and progression * feat: remove unneeded oracle interface from EigenPodManager * feat: remove unnecessary state root caching and add ValidatorWithdrawn event * feat: remove all use of the delayed withdrawal router (#524) * modify activateRestaking flow to use checkpointing * remove withdrawNonBeaconChainETHBalanceWei in favor of checkpointing * feat: remove staleness grace period * feat: add flag to startCheckpoint to prevent 0-balance checkpoints * chore: move currentCheckpoint to a public getter and update IEigenPod interface * chore: fix comment, update interfaces, add event * chore: clarify comment on activateRestaking * feat: skip validator if already checkpointed * fix: finish rebase * chore: make bindings * fix: swap inequality check to correctly skip duplicate proofs * chore: make bindings * test: modify integration test framework to support pepe (#563) * test: basic epoch processing * wip: balance proofs somewhat functional * test: flesh out beacon chain abi and test workflow * test: cleanup * test: add basic invariant checks for checkpoint proofs * test: add tests for full exits * feat: checkpoint proofs use balance container root * also refactors and cleans up BeaconChainProofs * more refactor/cleanup to come * chore: more proof library cleanup, removing unused constants * chore: additional cleanup and renaming of proof constants for consistency * chore: clean comments and reorganize constants * chore: remove delayedWithdrawalRouter from EigenPod * feat: adjust storage sizes for fields in checkpoint struct * feat: remove activateRestaking in favor of startCheckpoint (#577) * see PR comment for details * test: add proofgen test contract * fix: rename and add balance proof * feat: track balance exited for checkpoints * chore: deprecate deneb fork timestamp functions in EigenPodManager * test: fix existing integration tests * test: fix some unit tests and remove many outdated tests * test: start setting up new integration tests * fix: fixes two issues with verifyWC timing * verifyWC -> startCheckpoint in the same block no longer results in a bricked checkpoint * verifyWC using a timestamp older than the current checkpoint no longer allows you to submit a checkpoint proof for the new validator * chore: fix outdated comment * test: fleshed out eigenpod test flows * also reduced number of validators being generated by tests (for speed) * test: flesh out additional pod flows * chore: make bindings * test: add checks for several integration tests * fix: add additional pause condition for verifyStaleBalance * docs: add initial EigenPod docs * docs: clean and update EigenPodManager docs * chore: small wip to eigenpod docs and contract comment cleanup * chore: fix gas metering test to be consistent * also minor clarity tweak in verifyCheckpointProofs * test: eigenpod unit tests with checkpointing (#591) * test: testings init * test: eigenpod unit tests refactor * test: startCheckpoint unit tests * test: pod unit tests * fix: rebase changes * chore: make bindings * chore: revert pod changes * test: add several tests and checks --------- Co-authored-by: wadealexc * chore: cleanup dwr and unused code (#593) * chore: cleanup dwr and unused code * chore: comment out pod specs * feat: remove staleness timing window * chore: update IEigenPod interface with updated comments * chore: fix bindings * test: finish verify start complete flow for pepe integration tests * chore: fix bindings * test: add slashing and native eth integration tests * build: partial withdrawal batching upgrade scripts (#598) * build: preprod pod upgrade scripts * chore: cleanup unused files * chore: add pepe deployment output * docs: finish main eigenpod docs and improve commenting * docs: finish main eigenpod docs * feat: remove hasRestaked and lastCheckpointTimestamp checks * test: add tests for constructor and initialize * test: fix mainnet fork tests and compiler warnings * docs: update diagrams for pepe * chore: upgrade preprod eigenpods (#611) * chore: upgrade preprod eigenpods * chore: remove unneeded logs * chore: deploy and update deployment addresses * feat: public block root getter (#612) * docs: update user flow diagrams to mention supported tokens * also increases resolution * feat: add proof submitter address (#629) * feat: add proof submitter address * test: add event emission test * docs: fix comments and add proof submitter to docs * chore: add sigma prime audit * feat: deploy new pods to holesky preprod * includes proofSubmitter address * feat: update PEPE events (#632) * feat: mock out new events for EigenPodManager * chore: make bindings * feat: remove unneeded event change and update tests * chore: make bindings * fix: final event versions * chore: upgrade preprod with new PEPE events * docs: update audit report * fix: reject credential proofs if activation epoch is not set (#668) * fix: reject credential proofs if activation epoch is not set * chore: make bindings * chore: fix formatting and borked config * fix: fix borked addresses in holesky config * chore: fix formatting again * chore: upgrade preprod with new credential check * chore: deploy pepe to holesky --- README.md | 7 +- ...ainnet (PEPE) - Sigma Prime - Jul 2024.pdf | Bin 0 -> 399800 bytes certora/harnesses/EigenPodHarness.sol | 3 +- certora/scripts/core/verifyStrategyManager.sh | 2 +- certora/scripts/pods/verifyEigenPod.sh | 36 +- certora/scripts/pods/verifyEigenPodManager.sh | 28 +- certora/specs/core/Slasher.spec | 3 - certora/specs/core/StrategyManager.spec | 3 - certora/specs/pods/EigenPod.spec | 1 - certora/specs/pods/EigenPodManager.spec | 2 - docs/README.md | 28 +- docs/core/EigenPod.md | 411 +++ docs/core/EigenPodManager.md | 576 +---- .../EL_completing_queued_withdrawal.png | Bin 64111 -> 0 bytes docs/images/EL_delegating.png | Bin 46920 -> 0 bytes docs/images/EL_depositing.png | Bin 65455 -> 0 bytes docs/images/EL_depositing_BeaconChainETH.png | Bin 40071 -> 0 bytes .../images/EL_depositing_BeaconChainETH_2.png | Bin 69580 -> 0 bytes docs/images/EL_eigenpods_architecture.png | Bin 46623 -> 0 bytes docs/images/EL_operator_registration.png | Bin 48248 -> 0 bytes docs/images/EL_queuing_a_withdrawal.png | Bin 52566 -> 0 bytes docs/images/EigenPods_Architecture.png | Bin 42555 -> 0 bytes .../Complete Withdrawal as Shares.png | Bin 68315 -> 94305 bytes .../Complete Withdrawal as Tokens.png | Bin 193954 -> 257024 bytes .../Staker Flow Diagrams/Delegating.png | Bin 61308 -> 92863 bytes .../Staker Flow Diagrams/Depositing.png | Bin 219382 -> 304285 bytes .../Partial Withdrawals.png | Bin 101971 -> 0 bytes .../Staker Flow Diagrams/Queue Withdrawal.png | Bin 71050 -> 96263 bytes .../Staker Flow Diagrams/Validator Exits.png | Bin 88354 -> 132409 bytes .../Staker Flow Diagrams/Validator Yield.png | Bin 0 -> 133416 bytes docs/images/Withdrawal_Credential_Proof.png | Bin 41481 -> 0 bytes docs/images/Withdrawal_Proof.png | Bin 83903 -> 0 bytes docs/images/Withdrawal_Proof_Diagram.png | Bin 2661557 -> 0 bytes docs/images/middleware_outline_doc.png | Bin 479322 -> 0 bytes docs/images/operator_deregister.png | Bin 387078 -> 0 bytes docs/images/operator_opting.png | Bin 390735 -> 0 bytes docs/images/samplemerkle.png | Bin 18663 -> 0 bytes docs/images/slashing.png | Bin 280358 -> 0 bytes docs/images/staker_opting.png | Bin 384035 -> 0 bytes docs/images/staker_withdrawing.png | Bin 515446 -> 0 bytes docs/images/staterootproof.png | Bin 28999 -> 0 bytes docs/images/three_middlewares.png | Bin 19891 -> 0 bytes .../three_middlewares_withdrawal_queued.png | Bin 24661 -> 0 bytes docs/images/withdrawal.png | Bin 33323 -> 0 bytes pkg/bindings/BeaconChainProofs/binding.go | 2 +- .../DelayedWithdrawalRouter/binding.go | 1969 -------------- pkg/bindings/EigenPod/binding.go | 1159 +++++---- pkg/bindings/EigenPodManager/binding.go | 418 +-- .../EigenPodManagerStorage/binding.go | 340 +-- pkg/bindings/EigenPodStorage/binding.go | 2268 +++++++++++++++++ pkg/bindings/EigenStrategy/binding.go | 2 +- pkg/bindings/IBeaconChainOracle/binding.go | 212 -- .../IDelayedWithdrawalRouter/binding.go | 902 ------- pkg/bindings/IEigenPod/binding.go | 1073 ++++---- pkg/bindings/IEigenPodManager/binding.go | 340 +-- pkg/bindings/StrategyBase/binding.go | 2 +- pkg/bindings/StrategyBaseTVLLimits/binding.go | 2 +- pkg/bindings/StrategyFactory/binding.go | 2 +- pkg/bindings/StrategyManager/binding.go | 2 +- .../goerli/M1_deploy_goerli.config.json | 54 - ....json => eigenlayer_addresses.config.json} | 33 +- .../eigenlayer_addresses_preprod.config.json | 48 + .../holesky/eigenlayer_preprod.config.json | 56 + .../devnet/M2_Deploy_From_Scratch.s.sol | 88 - script/deploy/goerli/GoerliUpgrade1.s.sol | 90 - script/deploy/goerli/GoerliUpgrade2.s.sol | 129 - .../Deploy_Preprod_RewardsCoordinator.s.sol | 2 +- .../Deploy_Test_RewardsCoordinator.s.sol | 2 +- .../deploy/holesky/Eigen_Token_Deploy.s.sol | 2 +- .../holesky/M2_Deploy_From_Scratch.s.sol | 25 +- script/deploy/holesky/M2_Deploy_Preprod.s.sol | 2 +- script/deploy/holesky/v040-holesky-pepe.s.sol | 78 + .../v040-rc0-holesky-preprod-pepe.s.sol | 69 + .../v040-rc1-holesky-preprod-pepe.s.sol | 58 + .../v040-rc2-holesky-preprod-pepe.s.sol | 58 + .../v040-rc3-holesky-preprod-pepe.s.sol | 58 + .../v040-rc4-holesky-preprod-pepe.s.sol | 79 + .../v040-rc5-holesky-preprod-pepe.s.sol | 79 + .../EigenPod_Minor_Upgrade_Deploy.s.sol | 23 +- script/deploy/mainnet/M1_Deploy.s.sol | 85 +- script/deploy/mainnet/M2Deploy.s.sol | 76 +- .../deploy/mainnet/M2_Mainnet_Upgrade.s.sol | 54 +- .../mainnet/v0.3.0-mainnet-rewards.s.sol | 2 +- .../goerli/GV2_deployment_2024_6_2.json | 30 - .../GV2_preprod_deployment_2024_30_1.json | 30 - .../M1_deployment_goerli_2023_3_23.json | 37 - .../goerli/M2_deployment_data_goerli.json | 19 - .../M2_preprod_deployment_from_scratch.json | 33 - script/output/goerli/deployment_output.json | 29 - script/output/holesky/v040-rc0.output.json | 34 + script/output/holesky/v040-rc1.output.json | 34 + script/output/holesky/v040-rc2.output.json | 34 + script/output/holesky/v040-rc3.output.json | 34 + script/output/holesky/v040-rc4.output.json | 34 + script/output/holesky/v040-rc5.output.json | 34 + script/output/holesky/v040.output.json | 34 + script/utils/ExistingDeploymentParser.sol | 126 +- .../interfaces/IBeaconChainOracle.sol | 12 - .../interfaces/IDelayedWithdrawalRouter.sol | 74 - src/contracts/interfaces/IEigenPod.sol | 309 ++- src/contracts/interfaces/IEigenPodManager.sol | 35 +- src/contracts/libraries/BeaconChainProofs.sol | 498 ++-- .../pods/DelayedWithdrawalRouter.sol | 233 -- src/contracts/pods/EigenPod.sol | 965 ++++--- src/contracts/pods/EigenPodManager.sol | 73 +- src/contracts/pods/EigenPodManagerStorage.sol | 20 +- .../pods/EigenPodPausingConstants.sol | 18 +- src/contracts/pods/EigenPodStorage.sol | 85 + src/test/DepositWithdraw.t.sol | 6 +- src/test/EigenLayerDeployer.t.sol | 97 - src/test/EigenPod.t.sol | 2030 --------------- src/test/events/IEigenPodEvents.sol | 34 +- src/test/events/IEigenPodManagerEvents.sol | 6 +- src/test/harnesses/EigenPodHarness.sol | 83 +- src/test/integration/IntegrationBase.t.sol | 472 +++- src/test/integration/IntegrationChecks.t.sol | 111 +- .../integration/IntegrationDeployer.t.sol | 160 +- src/test/integration/TimeMachine.t.sol | 12 - .../mainnet/IEigenPod.sol | 1 - .../integration/mocks/BeaconChainMock.t.sol | 1486 ++++++----- .../mocks/BeaconChainOracleMock.t.sol | 17 - .../mocks/EIP_4788_Oracle_Mock.t.sol | 32 + .../integration/tests/Upgrade_Setup.t.sol | 5 - .../VerifyWC_StartCP_CompleteCP.t.sol | 756 ++++++ src/test/integration/users/User.t.sol | 437 ++-- src/test/integration/users/User_M1.t.sol | 4 +- src/test/integration/utils/PrintUtils.t.sol | 119 + src/test/mocks/BeaconChainOracleMock.sol | 53 - .../mocks/DelayedWithdrawalRouterMock.sol | 52 - src/test/mocks/EigenPodManagerMock.sol | 40 +- src/test/mocks/EigenPodMock.sol | 58 +- src/test/mocks/IBeaconChainOracleMock.sol | 67 - src/test/tree/EigenPodUnit.tree | 171 +- src/test/unit/AVSDirectoryUnit.t.sol | 14 + .../unit/DelayedWithdrawalRouterUnit.t.sol | 474 ---- src/test/unit/DelegationUnit.t.sol | 3 +- src/test/unit/EigenPod-PodManagerUnit.t.sol | 648 ----- src/test/unit/EigenPodManagerUnit.t.sol | 51 +- src/test/unit/EigenPodUnit.t.sol | 2197 ++++++++++------ src/test/utils/BeaconChainProofsWrapper.sol | 41 + src/test/utils/EigenLayerUnitTestSetup.sol | 2 +- src/test/utils/EigenPodUser.t.sol | 251 ++ src/test/utils/ProofParsing.sol | 10 +- 143 files changed, 10526 insertions(+), 13381 deletions(-) create mode 100644 audits/M4 Mainnet (PEPE) - Sigma Prime - Jul 2024.pdf create mode 100644 docs/core/EigenPod.md delete mode 100644 docs/images/EL_completing_queued_withdrawal.png delete mode 100644 docs/images/EL_delegating.png delete mode 100644 docs/images/EL_depositing.png delete mode 100644 docs/images/EL_depositing_BeaconChainETH.png delete mode 100644 docs/images/EL_depositing_BeaconChainETH_2.png delete mode 100644 docs/images/EL_eigenpods_architecture.png delete mode 100644 docs/images/EL_operator_registration.png delete mode 100644 docs/images/EL_queuing_a_withdrawal.png delete mode 100644 docs/images/EigenPods_Architecture.png delete mode 100644 docs/images/Staker Flow Diagrams/Partial Withdrawals.png create mode 100644 docs/images/Staker Flow Diagrams/Validator Yield.png delete mode 100644 docs/images/Withdrawal_Credential_Proof.png delete mode 100644 docs/images/Withdrawal_Proof.png delete mode 100644 docs/images/Withdrawal_Proof_Diagram.png delete mode 100644 docs/images/middleware_outline_doc.png delete mode 100644 docs/images/operator_deregister.png delete mode 100644 docs/images/operator_opting.png delete mode 100644 docs/images/samplemerkle.png delete mode 100644 docs/images/slashing.png delete mode 100644 docs/images/staker_opting.png delete mode 100644 docs/images/staker_withdrawing.png delete mode 100644 docs/images/staterootproof.png delete mode 100644 docs/images/three_middlewares.png delete mode 100644 docs/images/three_middlewares_withdrawal_queued.png delete mode 100644 docs/images/withdrawal.png delete mode 100644 pkg/bindings/DelayedWithdrawalRouter/binding.go create mode 100644 pkg/bindings/EigenPodStorage/binding.go delete mode 100644 pkg/bindings/IBeaconChainOracle/binding.go delete mode 100644 pkg/bindings/IDelayedWithdrawalRouter/binding.go delete mode 100644 script/configs/goerli/M1_deploy_goerli.config.json rename script/configs/holesky/{Holesky_current_deployment.config.json => eigenlayer_addresses.config.json} (79%) create mode 100644 script/configs/holesky/eigenlayer_addresses_preprod.config.json create mode 100644 script/configs/holesky/eigenlayer_preprod.config.json delete mode 100644 script/deploy/goerli/GoerliUpgrade1.s.sol delete mode 100644 script/deploy/goerli/GoerliUpgrade2.s.sol create mode 100644 script/deploy/holesky/v040-holesky-pepe.s.sol create mode 100644 script/deploy/holesky/v040-rc0-holesky-preprod-pepe.s.sol create mode 100644 script/deploy/holesky/v040-rc1-holesky-preprod-pepe.s.sol create mode 100644 script/deploy/holesky/v040-rc2-holesky-preprod-pepe.s.sol create mode 100644 script/deploy/holesky/v040-rc3-holesky-preprod-pepe.s.sol create mode 100644 script/deploy/holesky/v040-rc4-holesky-preprod-pepe.s.sol create mode 100644 script/deploy/holesky/v040-rc5-holesky-preprod-pepe.s.sol delete mode 100644 script/output/goerli/GV2_deployment_2024_6_2.json delete mode 100644 script/output/goerli/GV2_preprod_deployment_2024_30_1.json delete mode 100644 script/output/goerli/M1_deployment_goerli_2023_3_23.json delete mode 100644 script/output/goerli/M2_deployment_data_goerli.json delete mode 100644 script/output/goerli/M2_preprod_deployment_from_scratch.json delete mode 100644 script/output/goerli/deployment_output.json create mode 100644 script/output/holesky/v040-rc0.output.json create mode 100644 script/output/holesky/v040-rc1.output.json create mode 100644 script/output/holesky/v040-rc2.output.json create mode 100644 script/output/holesky/v040-rc3.output.json create mode 100644 script/output/holesky/v040-rc4.output.json create mode 100644 script/output/holesky/v040-rc5.output.json create mode 100644 script/output/holesky/v040.output.json delete mode 100644 src/contracts/interfaces/IBeaconChainOracle.sol delete mode 100644 src/contracts/interfaces/IDelayedWithdrawalRouter.sol delete mode 100644 src/contracts/pods/DelayedWithdrawalRouter.sol create mode 100644 src/contracts/pods/EigenPodStorage.sol delete mode 100644 src/test/EigenPod.t.sol delete mode 100644 src/test/integration/mocks/BeaconChainOracleMock.t.sol create mode 100644 src/test/integration/mocks/EIP_4788_Oracle_Mock.t.sol create mode 100644 src/test/integration/tests/eigenpod/VerifyWC_StartCP_CompleteCP.t.sol create mode 100644 src/test/integration/utils/PrintUtils.t.sol delete mode 100644 src/test/mocks/BeaconChainOracleMock.sol delete mode 100644 src/test/mocks/DelayedWithdrawalRouterMock.sol delete mode 100644 src/test/mocks/IBeaconChainOracleMock.sol delete mode 100644 src/test/unit/DelayedWithdrawalRouterUnit.t.sol delete mode 100644 src/test/unit/EigenPod-PodManagerUnit.t.sol create mode 100644 src/test/utils/BeaconChainProofsWrapper.sol create mode 100644 src/test/utils/EigenPodUser.t.sol diff --git a/README.md b/README.md index 0edc06365..431f58c8c 100644 --- a/README.md +++ b/README.md @@ -183,10 +183,10 @@ You can view the deployed contract addresses below, or check out the code itself | -------- | -------- | -------- | -------- | | [`DelegationManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/DelegationManager.sol) | [`0xA44151489861Fe9e3055d95adC98FbD462B948e7`](https://holesky.etherscan.io/address/0xA44151489861Fe9e3055d95adC98FbD462B948e7) | [`0x83f8...0D76`](https://holesky.etherscan.io/address/0x83f8F8f0BB125F7870F6bfCf76853f874C330D76) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | | [`StrategyManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/StrategyManager.sol) | [`0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6`](https://holesky.etherscan.io/address/0xdfB5f6CE42aAA7830E94ECFCcAd411beF4d4D5b6) | [`0x59f7...3a18`](https://holesky.etherscan.io/address/0x59f766A603C53f3AC8Be43bBe158c1519b193a18) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | -| [`EigenPodManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/EigenPodManager.sol) | [`0x30770d7E3e71112d7A6b7259542D1f680a70e315`](https://holesky.etherscan.io/address/0x30770d7E3e71112d7A6b7259542D1f680a70e315) | [`0x5265...4a7B`](https://holesky.etherscan.io/address/0x5265C162f7d5F3fE3175a78828ab16bf5E324a7B) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| [`EigenPodManager`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/EigenPodManager.sol) | [`0x30770d7E3e71112d7A6b7259542D1f680a70e315`](https://holesky.etherscan.io/address/0x30770d7E3e71112d7A6b7259542D1f680a70e315) | [`0x91A6...CCc5`](https://holesky.etherscan.io/address/0x91A6525a4a843F5a5B633905300c33F79413CCc5) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | | [`AVSDirectory`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/AVSDirectory.sol) | [`0x055733000064333CaDDbC92763c58BF0192fFeBf`](https://holesky.etherscan.io/address/0x055733000064333CaDDbC92763c58BF0192fFeBf) | [`0xEF5B...3e3a`](https://holesky.etherscan.io/address/0xEF5BA995Bc7722fd1e163edF8Dc09375de3d3e3a) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | | [`Slasher`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/Slasher.sol) | [`0xcAe751b75833ef09627549868A04E32679386e7C`](https://holesky.etherscan.io/address/0xcAe751b75833ef09627549868A04E32679386e7C) | [`0x9971...345A`](https://holesky.etherscan.io/address/0x99715D255E34a39bE9943b82F281CA734bcF345A) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | -| [`RewardsCoordinator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/RewardsCoordinator.sol) | [`0xAcc1fb458a1317E886dB376Fc8141540537E68fE`](https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE) | [`0x123C...3D02`](https://holesky.etherscan.io/address/0x123C1A3543DBCA3f704E703dDda7FAAaA8e43D02) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | +| [`RewardsCoordinator`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/core/RewardsCoordinator.sol) | [`0xAcc1fb458a1317E886dB376Fc8141540537E68fE`](https://holesky.etherscan.io/address/0xAcc1fb458a1317E886dB376Fc8141540537E68fE) | [`0xe546...7f97`](https://holesky.etherscan.io/address/0xe54625095656206AC1B42819875343453c447f97) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | ###### Strategies @@ -227,9 +227,8 @@ The following strategies differ significantly from the other strategies deployed | Name | Proxy | Implementation | Notes | | -------- | -------- | -------- | -------- | -| [`EigenPod (beacon)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/EigenPod.sol) | [`0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D`](https://holesky.etherscan.io/address/0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D) | [`0xe98f...641c`](https://holesky.etherscan.io/address/0xe98f9298344527608A1BCC23907B8145F9Cb641c) | - Beacon: [`BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/BeaconProxy.sol)
- Pods: [`UpgradeableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/UpgradeableBeacon.sol) | +| [`EigenPod (beacon)`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/EigenPod.sol) | [`0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D`](https://holesky.etherscan.io/address/0x7261C2bd75a7ACE1762f6d7FAe8F63215581832D) | [`0x10ad...319c`](https://holesky.etherscan.io/address/0x10ad7e30e3F52076C8462D573530f4461377319c) | - Beacon: [`BeaconProxy`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/BeaconProxy.sol)
- Pods: [`UpgradeableBeacon`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/beacon/UpgradeableBeacon.sol) | | [`DelayedWithdrawalRouter`](https://github.com/Layr-Labs/eigenlayer-contracts/blob/testnet-holesky/src/contracts/pods/DelayedWithdrawalRouter.sol) | [`0x642c646053eaf2254f088e9019ACD73d9AE0FA32`](https://holesky.etherscan.io/address/0x642c646053eaf2254f088e9019ACD73d9AE0FA32) | [`0xcE8b...3407`](https://holesky.etherscan.io/address/0xcE8b8D99773a718423F8040a6e52c06a4ce63407) | Proxy: [`TUP@4.7.1`](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.7.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) | -| [`EigenLayerBeaconOracle`](https://github.com/succinctlabs/eigenlayer-beacon-oracle/blob/main/contracts/src/EigenLayerBeaconOracle.sol) | - | [`0x4C11...8f25`](https://holesky.etherscan.io/address/0x4C116BB629bff7A8373c2378bBd919f8349B8f25) | Provided by [Succinct](https://succinct.xyz/) | ###### EIGEN/bEIGEN diff --git a/audits/M4 Mainnet (PEPE) - Sigma Prime - Jul 2024.pdf b/audits/M4 Mainnet (PEPE) - Sigma Prime - Jul 2024.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d073fe6f5f6222a7d8169267317f597114c69856 GIT binary patch literal 399800 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
  • x|B2*LO$kLGmhBNOc!h(8E_{Uz%h0g#eFB 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 - | File | Type | Proxy | | -------- | -------- | -------- | | [`EigenPodManager.sol`](../../src/contracts/pods/EigenPodManager.sol) | Singleton | Transparent proxy | | [`EigenPod.sol`](../../src/contracts/pods/EigenPod.sol) | Instanced, deployed per-user | Beacon proxy | -| [`DelayedWithdrawalRouter.sol`](../../src/contracts/pods/DelayedWithdrawalRouter.sol) | Singleton | Transparent proxy | -| [`succinctlabs/EigenLayerBeaconOracle.sol`](https://github.com/succinctlabs/telepathy-contracts/blob/main/external/integrations/eigenlayer/EigenLayerBeaconOracle.sol) | Singleton | UUPS Proxy | - -The `EigenPodManager` and `EigenPod` contracts allow Stakers to restake beacon chain ETH which can then be delegated to Operators via the `DelegationManager`. - -The `EigenPodManager` is the entry point for this process, allowing Stakers to deploy an `EigenPod` and begin restaking. While actively restaking, a Staker uses their `EigenPod` to validate various beacon chain state proofs of validator balance and withdrawal status. When exiting, a Staker uses the `DelegationManager` to undelegate or queue a withdrawal from EigenLayer. -`EigenPods` serve as the withdrawal credentials for one or more beacon chain validators controlled by a Staker. Their primary role is to validate beacon chain proofs for each of the Staker's validators. Beacon chain proofs are used to verify a validator's: -* `EigenPod.verifyWithdrawalCredentials`: withdrawal credentials and effective balance -* `EigenPod.verifyBalanceUpdates`: effective balance (when it changes) -* `EigenPod.verifyAndProcessWithdrawals`: withdrawable epoch, and processed withdrawals within historical block summary +The `EigenPodManager` manages the relationship between a Staker's `EigenPod`, the delegatable shares each Staker holds in the beacon chain ETH strategy, and the withdrawal of those shares via the `DelegationManager`. These functions together support Stakers' ability to restake beacon chain ETH and delegate restaked ETH to Operators in order to earn additional yield. -See [/proofs](./proofs/) for detailed documentation on each of the state proofs used in these methods. Additionally, proofs are checked against a beacon chain block root supplied by Succinct's Telepathy protocol ([docs link](https://docs.telepathy.xyz/)). +The `EigenPodManager` is the entry point for this process, allowing Stakers to deploy an `EigenPod` and begin restaking. After a Staker deploys their `EigenPod`, the `EigenPodManager` receives various updates from the pod that add or remove shares from the Staker. #### High-level Concepts -The functions of the `EigenPodManager` and `EigenPod` contracts are tightly linked. Rather than writing two separate docs pages, documentation for both contracts is included in this file. This document organizes methods according to the following themes (click each to be taken to the relevant section): +This document organizes methods according to the following themes (click each to be taken to the relevant section): * [Depositing Into EigenLayer](#depositing-into-eigenlayer) -* [Restaking Beacon Chain ETH](#restaking-beacon-chain-eth) * [Withdrawal Processing](#withdrawal-processing) -* [System Configuration](#system-configuration) * [Other Methods](#other-methods) #### Important State Variables -* `EigenPodManager`: - * `mapping(address => IEigenPod) public ownerToPod`: Tracks the deployed `EigenPod` for each Staker - * `mapping(address => int256) public podOwnerShares`: Keeps track of the actively restaked beacon chain ETH for each Staker. - * In some cases, a beacon chain balance update may cause a Staker's balance to drop below zero. This is because when queueing for a withdrawal in the `DelegationManager`, the Staker's current shares are fully removed. If the Staker's beacon chain balance drops after this occurs, their `podOwnerShares` may go negative. This is a temporary change to account for the drop in balance, and is ultimately corrected when the withdrawal is finally processed. - * Since balances on the consensus layer are stored only in Gwei amounts, the EigenPodManager enforces the invariant that `podOwnerShares` is always a whole Gwei amount for every staker, i.e. `podOwnerShares[staker] % 1e9 == 0` always. -* `EigenPod`: - * `_validatorPubkeyHashToInfo[bytes32] -> (ValidatorInfo)`: individual validators are identified within an `EigenPod` according to their public key hash. This mapping keeps track of the following for each validator: - * `validatorStatus`: (`INACTIVE`, `ACTIVE`, `WITHDRAWN`) - * `validatorIndex`: A `uint40` that is unique for each validator making a successful deposit via the deposit contract - * `mostRecentBalanceUpdateTimestamp`: A timestamp that represents the most recent successful proof of the validator's effective balance - * `restakedBalanceGwei`: set to the validator's balance. - * `withdrawableRestakedExecutionLayerGwei`: When a Staker proves that a validator has exited from the beacon chain, the withdrawal amount is added to this variable. When completing a withdrawal of beacon chain ETH, the withdrawal amount is subtracted from this variable. See also: - * [`DelegationManager`: "Undelegating and Withdrawing"](./DelegationManager.md#undelegating-and-withdrawing) - * [`EigenPodManager`: "Withdrawal Processing"](#withdrawal-processing) - -#### Important Definitions - -* "Pod Owner": A Staker who has deployed an `EigenPod` is a Pod Owner. The terms are used interchangeably in this document. - * Pod Owners can only deploy a single `EigenPod`, but can restake any number of beacon chain validators from the same `EigenPod`. - * Pod Owners can delegate their `EigenPodManager` shares to Operators (via `DelegationManager`). - * These shares correspond to the amount of provably-restaked beacon chain ETH held by the Pod Owner via their `EigenPod`. -* `EigenPod`: - * `_podWithdrawalCredentials() -> (bytes memory)`: - * Gives `abi.encodePacked(bytes1(uint8(1)), bytes11(0), address(EigenPod))` - * These are the `0x01` withdrawal credentials of the `EigenPod`, used as a validator's withdrawal credentials on the beacon chain. +* `mapping(address => IEigenPod) public ownerToPod`: Tracks the deployed `EigenPod` for each Staker +* `mapping(address => int256) public podOwnerShares`: Keeps track of the actively restaked beacon chain ETH for each Staker. + * In some cases, a beacon chain balance update may cause a Staker's balance to drop below zero. This is because when queueing for a withdrawal in the `DelegationManager`, the Staker's current shares are fully removed. If the Staker's beacon chain balance drops after this occurs, their `podOwnerShares` may go negative. This is a temporary change to account for the drop in balance, and is ultimately corrected when the withdrawal is finally processed. + * Since balances on the consensus layer are stored only in Gwei amounts, the EigenPodManager enforces the invariant that `podOwnerShares` is always a whole Gwei amount for every staker, i.e. `podOwnerShares[staker] % 1e9 == 0` always. --- ### Depositing Into EigenLayer Before a Staker begins restaking beacon chain ETH, they need to deploy an `EigenPod`, stake, and start a beacon chain validator: -* [`EigenPodManager.createPod`](#eigenpodmanagercreatepod) -* [`EigenPodManager.stake`](#eigenpodmanagerstake) - * [`EigenPod.stake`](#eigenpodstake) +* [`createPod`](#createpod) +* [`stake`](#stake) -To complete the deposit process, the Staker needs to prove that the validator's withdrawal credentials are pointed at the `EigenPod`: -* [`EigenPod.verifyWithdrawalCredentials`](#eigenpodverifywithdrawalcredentials) - -#### `EigenPodManager.createPod` +#### `createPod` ```solidity -function createPod() external onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) returns (address) +function createPod() + external + onlyWhenNotPaused(PAUSED_NEW_EIGENPODS) + returns (address) ``` Allows a Staker to deploy an `EigenPod` instance, if they have not done so already. -Each Staker can only deploy a single `EigenPod` instance, but a single `EigenPod` can serve as the withdrawal credentials for any number of beacon chain validators. Each `EigenPod` is created using Create2 and the beacon proxy pattern, using the Staker's address as the Create2 salt. +Each Staker can only deploy a single `EigenPod` instance, but a single `EigenPod` can serve as the fee recipient / withdrawal credentials for any number of beacon chain validators. Each `EigenPod` is created using Create2 and the beacon proxy pattern, using the Staker's address as the Create2 salt. As part of the `EigenPod` deployment process, the Staker is made the Pod Owner, a permissioned role within the `EigenPod`. @@ -97,10 +57,7 @@ As part of the `EigenPod` deployment process, the Staker is made the Pod Owner, * Caller MUST NOT have deployed an `EigenPod` already * Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS` -*As of M2*: -* `EigenPods` are initialized with restaking enabled by default (`hasRestaked = true`). Pods deployed before M2 may not have this enabled, and will need to call `EigenPod.activateRestaking()`. - -#### `EigenPodManager.stake` +#### `stake` ```solidity function stake( @@ -117,177 +74,24 @@ Allows a Staker to deposit 32 ETH into the beacon chain deposit contract, provid *Effects*: * Deploys and initializes an `EigenPod` on behalf of Staker, if this has not been done already -* See [`EigenPod.stake`](#eigenpodstake) +* See [`EigenPod.stake`](./EigenPod.md#stake) *Requirements*: * Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS` -* See [`EigenPod.stake`](#eigenpodstake) - -##### `EigenPod.stake` - -```solidity -function stake( - bytes calldata pubkey, - bytes calldata signature, - bytes32 depositDataRoot -) - external - payable - onlyEigenPodManager -``` - -Handles the call to the beacon chain deposit contract. Only called via `EigenPodManager.stake`. - -*Effects*: -* Deposits 32 ETH into the beacon chain deposit contract, and provides the pod's address as the deposit's withdrawal credentials - -*Requirements*: -* Caller MUST be the `EigenPodManager` -* Call value MUST be 32 ETH -* Deposit contract `deposit` method MUST succeed given the provided `pubkey`, `signature`, and `depositDataRoot` - -#### `EigenPod.verifyWithdrawalCredentials` - -```solidity -function verifyWithdrawalCredentials( - uint64 oracleTimestamp, - BeaconChainProofs.StateRootProof calldata stateRootProof, - uint40[] calldata validatorIndices, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields -) - external - onlyEigenPodOwner - onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS) - hasEnabledRestaking -``` - -Once a Pod Owner has deposited ETH into the beacon chain deposit contract, they can call this method to "fully restake" one or more validators by proving the validator's withdrawal credentials are pointed at the `EigenPod`. This activation will mean that the ETH in those validators: -* is awarded to the Staker/Pod Owner in `EigenPodManager.podOwnerShares` -* is delegatable to an Operator (via the `DelegationManager`) - -For each successfully proven validator, that validator's status becomes `VALIDATOR_STATUS.ACTIVE`, and the sum of restakable ether across all newly-proven validators is provided to [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate), where it is added to the Pod Owner's shares. If the Pod Owner is delegated to an Operator via the `DelegationManager`, this sum is also added to the Operator's delegated shares for the beacon chain ETH strategy. - -For each validator the Pod Owner wants to verify, the Pod Owner must supply: -* `validatorIndices`: their validator's `ValidatorIndex` (see [consensus specs](https://eth2book.info/capella/part3/config/types/#validatorindex)) -* `validatorFields`: the fields of the `Validator` container associated with the validator (see [consensus specs](https://eth2book.info/capella/part3/containers/dependencies/#validator)) -* `stateRootProof`: a proof that will verify `stateRootProof.beaconStateRoot` against an oracle-provided beacon block root -* `validatorFieldsProofs`: a proof that the `Validator` container belongs to the associated validator at the given `ValidatorIndex` within `stateRootProof.beaconStateRoot` -* `oracleTimestamp`: a timestamp used to fetch a beacon block root from `EigenPodManager.beaconChainOracle` - -*Beacon chain proofs used*: -* [`verifyStateRootAgainstLatestBlockRoot`](./proofs/BeaconChainProofs.md#beaconchainproofsverifystaterootagainstlatestblockroot) -* [`verifyValidatorFields`](./proofs/BeaconChainProofs.md#beaconchainproofsverifyvalidatorfields) - -*Effects*: -* For each validator (`_validatorPubkeyHashToInfo[pubkeyHash]`) the validator's info is set for the first time: - * `VALIDATOR_STATUS` moves from `INACTIVE` to `ACTIVE` - * `validatorIndex` is recorded - * `mostRecentBalanceUpdateTimestamp` is set to the `oracleTimestamp` used to fetch the beacon block root - * `restakedBalanceGwei` is set to the validator's effective balance -* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) - -*Requirements*: -* Caller MUST be the Pod Owner -* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_CREDENTIALS` -* Pod MUST have enabled restaking -* All input array lengths MUST be equal -* `oracleTimestamp`: - * MUST be greater than or equal to the timestamp of the first slot in the epoch following `mostRecentWithdrawalTimestamp` - * MUST be no more than `VERIFY_BALANCE_UPDATE_WINDOW_SECONDS` (~4.5 hrs) old - * MUST be queryable via `EigenPodManager.getBlockRootAtTimestamp` (fails if `stateRoot == 0`) -* `BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot` MUST verify the provided `beaconStateRoot` against the oracle-provided `latestBlockRoot` -* For each validator: - * The validator's status MUST initially be `VALIDATOR_STATUS.INACTIVE` - * `BeaconChainProofs.verifyValidatorFields` MUST verify the provided `validatorFields` against the `beaconStateRoot` - * The aforementioned proofs MUST show that the validator's withdrawal credentials are set to the `EigenPod` -* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) - -*As of M2*: -* Restaking is enabled by default for pods deployed after M2. See `activateRestaking` for more info. - ---- - -### Restaking Beacon Chain ETH - -At this point, a Staker/Pod Owner has deployed their `EigenPod`, started their beacon chain validator, and proven that its withdrawal credentials are pointed to their `EigenPod`. They are now free to delegate to an Operator (if they have not already), or start up + verify additional beacon chain validators that also withdraw to the same `EigenPod`. - -The primary method concerning actively restaked validators is: -* [`EigenPod.verifyBalanceUpdates`](#eigenpodverifybalanceupdates) - -#### `EigenPod.verifyBalanceUpdates` - -```solidity -function verifyBalanceUpdates( - uint64 oracleTimestamp, - uint40[] calldata validatorIndices, - BeaconChainProofs.StateRootProof calldata stateRootProof, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields -) - external - onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE) -``` - -Anyone (not just the Pod Owner) may call this method with one or more valid balance update proofs to record beacon chain balance updates in one or more of the `EigenPod's` validators. - -A successful balance update proof updates the `EigenPod's` view of a validator's [effective balance](https://eth2book.info/capella/part2/incentives/balances/). If the validator's effective balance has changed, the difference is sent to `EigenPodManager.recordBeaconChainETHBalanceUpdate`, which updates the Pod Owner's shares. If the Pod Owner is delegated to an Operator, this delta is also sent to the `DelegationManager` to update the Operator's delegated beacon chain ETH shares. - -Note that if a validator's effective balance has decreased, this method will result in shares being removed from the Pod Owner in `EigenPodManager.recordBeaconChainETHBalanceUpdate`. This may cause the Pod Owner's balance to go negative in some cases, representing a "deficit" that must be repaid before any withdrawals can be processed. One example flow where this might occur is: -* Pod Owner calls `DelegationManager.undelegate`, which queues a withdrawal in the `DelegationManager`. The Pod Owner's shares are set to 0 while the withdrawal is in the queue. -* Pod Owner's beacon chain ETH balance decreases (maybe due to slashing), and someone provides a proof of this to `EigenPod.verifyBalanceUpdates`. In this case, the Pod Owner will have negative shares in the `EigenPodManager`. -* After a delay, the Pod Owner calls `DelegationManager.completeQueuedWithdrawal`. The negative shares are then repaid out of the withdrawn assets. - -For the validator whose balance should be updated, the caller must supply: -* `validatorIndex`: the validator's `ValidatorIndex` (see [consensus specs](https://eth2book.info/capella/part3/config/types/#validatorindex)) -* `stateRootProof`: a proof that will verify `stateRootProof.beaconStateRoot` against an oracle-provided beacon block root -* `validatorFieldsProofs`: a proof that the `Validator` container belongs to the associated validator at the given `ValidatorIndex` within `stateRootProof.beaconStateRoot` -* `validatorFields`: the fields of the `Validator` container associated with the validator (see [consensus specs](https://eth2book.info/capella/part3/containers/dependencies/#validator)) -* `oracleTimestamp`: a timestamp used to fetch a beacon block root from `EigenPodManager.beaconChainOracle` - -*Beacon chain proofs used*: -* [`verifyStateRootAgainstLatestBlockRoot`](./proofs/BeaconChainProofs.md#beaconchainproofsverifystaterootagainstlatestblockroot) -* [`verifyValidatorFields`](./proofs/BeaconChainProofs.md#beaconchainproofsverifyvalidatorfields) - -*Effects*: -* Updates the validator's stored info: - * `restakedBalanceGwei` is updated to the newly-proven effective balance - * `mostRecentBalanceUpdateTimestamp` is set to the `oracleTimestamp` used to fetch the beacon block root -* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) - -*Requirements*: -* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_BALANCE_UPDATE` -* Balance updates should only be made before a validator has fully exited. If the validator has exited, any further proofs should follow the `verifyAndProcessWithdrawals` path. - * This is to prevent someone from providing a "balance update" on an exited validator that "proves" a balance of 0, when we want to process that update as a withdrawal instead. -* `oracleTimestamp`: - * MUST be no more than `VERIFY_BALANCE_UPDATE_WINDOW_SECONDS` (~4.5 hrs) old - * MUST be newer than the validator's `mostRecentBalanceUpdateTimestamp` - * MUST be queryable via `EigenPodManager.getBlockRootAtTimestamp` (fails if `stateRoot == 0`) -* `validatorFields[0]` MUST be a pubkey hash corresponding to a validator whose withdrawal credentials have been proven, and is not yet withdrawn (`VALIDATOR_STATUS.ACTIVE`) -* `BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot` MUST verify the provided `beaconStateRoot` against the oracle-provided `latestBlockRoot` -* `BeaconChainProofs.verifyValidatorFields` MUST verify the provided `validatorFields` against the `beaconStateRoot` -* See [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) +* See [`EigenPod.stake`](./EigenPod.md#stake) --- ### Withdrawal Processing -The `DelegationManager` is the entry point for all undelegation and withdrawals, which must be queued for a time before being completed. When a withdrawal is initiated, the following method is used: -* [`EigenPodManager.removeShares`](#eigenpodmanagerremoveshares) +The `DelegationManager` is the entry point for all undelegation and withdrawals, which must be queued for a time before being completed. When a withdrawal is initiated, the `DelegationManager` calls the following method: +* [`removeShares`](#removeshares) When completing a queued undelegation or withdrawal, the `DelegationManager` calls one of these two methods: -* [`EigenPodManager.addShares`](#eigenpodmanageraddshares) -* [`EigenPodManager.withdrawSharesAsTokens`](#eigenpodmanagerwithdrawsharesastokens) - * [`EigenPod.withdrawRestakedBeaconChainETH`](#eigenpodwithdrawrestakedbeaconchaineth) +* [`addShares`](#addshares) +* [`withdrawSharesAsTokens`](#withdrawsharesastokens) -If a Staker wishes to fully withdraw their beacon chain ETH (via `withdrawSharesAsTokens`), they need to exit their validator and prove the withdrawal *prior to* completing the queued withdrawal. They do so using this method: -* [`EigenPod.verifyAndProcessWithdrawals`](#eigenpodverifyandprocesswithdrawals) - -Some withdrawals are sent to their destination via the `DelayedWithdrawalRouter`: -* [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal) -* [`DelayedWithdrawalRouter.claimDelayedWithdrawals`](#delayedwithdrawalrouterclaimdelayedwithdrawals) - -#### `EigenPodManager.removeShares` +#### `removeShares` ```solidity function removeShares( @@ -317,7 +121,7 @@ This method is not allowed to cause the `Staker's` balance to go negative. This * `shares` MUST NOT be greater than `podOwner's` share balance * `shares` MUST be a whole Gwei amount -#### `EigenPodManager.addShares` +#### `addShares` ```solidity function addShares( @@ -347,7 +151,7 @@ If the Pod Owner has a share deficit (negative shares), the deficit is repaid ou * `shares` MUST NOT be negative when converted to an `int256` * `shares` MUST be a whole Gwei amount -#### `EigenPodManager.withdrawSharesAsTokens` +#### `withdrawSharesAsTokens` ```solidity function withdrawSharesAsTokens( @@ -361,9 +165,7 @@ function withdrawSharesAsTokens( The `DelegationManager` calls this method when a queued withdrawal is completed and the withdrawer specifies that they want to receive the withdrawal as tokens (rather than shares). This can be used to "fully exit" some amount of beacon chain ETH and send it to a recipient (via `EigenPod.withdrawRestakedBeaconChainETH`). -Note that because this method entails withdrawing and sending beacon chain ETH, two conditions must be met for this method to succeed: (i) the ETH being withdrawn should already be in the `EigenPod`, and (ii) the beacon chain withdrawals responsible for the ETH should already be proven. - -This means that before completing their queued withdrawal, a Pod Owner needs to prove their beacon chain withdrawals via `EigenPod.verifyAndProcessWithdrawals`. +Note that because this method entails withdrawing and sending beacon chain ETH, two conditions must be met for this method to succeed: (i) the ETH being withdrawn should already be in the `EigenPod`, and (ii) the amount being withdrawn should be accounted for in `EigenPod.withdrawableRestakedExecutionLayerGwei`. This latter condition can be achieved by completing an `EigenPod` checkpoint just prior to completing a queued `DelegationManager` withdrawal (see [EigenPod: Checkpointing Validators](./EigenPod.md#checkpointing-validators) for details). Also note that, like `addShares`, if the original Pod Owner has a share deficit (negative shares), the deficit is repaid out of the withdrawn `shares` before any native ETH is withdrawn. @@ -373,211 +175,20 @@ Also note that, like `addShares`, if the original Pod Owner has a share deficit *Effects*: * If `podOwner's` share balance is negative, `shares` are added until the balance hits 0 - * Any remaining shares are withdrawn and sent to `destination` (see [`EigenPod.withdrawRestakedBeaconChainETH`](#eigenpodwithdrawrestakedbeaconchaineth)) + * Any remaining shares are converted 1:1 to ETH and sent to `destination` (see [`EigenPod.withdrawRestakedBeaconChainETH`](./EigenPod.md#withdrawrestakedbeaconchaineth)) *Requirements*: * `podOwner` MUST NOT be zero * `destination` MUST NOT be zero * `shares` MUST NOT be negative when converted to an `int256` * `shares` MUST be a whole Gwei amount -* See [`EigenPod.withdrawRestakedBeaconChainETH`](#eigenpodwithdrawrestakedbeaconchaineth) - -##### `EigenPod.withdrawRestakedBeaconChainETH` - -```solidity -function withdrawRestakedBeaconChainETH( - address recipient, - uint256 amountWei -) - external - onlyEigenPodManager -``` - -The `EigenPodManager` calls this method when withdrawing a Pod Owner's shares as tokens (native ETH). The input `amountWei` is converted to Gwei and subtracted from `withdrawableRestakedExecutionLayerGwei`, which tracks Gwei that has been provably withdrawn (via `EigenPod.verifyAndProcessWithdrawals`). - -As such: -* If a withdrawal has not been proven that sufficiently raises `withdrawableRestakedExecutionLayerGwei`, this method will revert. -* If the `EigenPod` does not have `amountWei` available to transfer, this method will revert - -*Effects*: -* Decreases the pod's `withdrawableRestakedExecutionLayerGwei` by `amountWei / GWEI_TO_WEI` -* Sends `amountWei` ETH to `recipient` - -*Requirements*: -* `amountWei / GWEI_TO_WEI` MUST NOT be greater than the proven `withdrawableRestakedExecutionLayerGwei` -* Pod MUST have at least `amountWei` ETH balance -* `recipient` MUST NOT revert when transferred `amountWei` -* `amountWei` MUST be a whole Gwei amount - -#### `EigenPod.verifyAndProcessWithdrawals` - -```solidity -function verifyAndProcessWithdrawals( - uint64 oracleTimestamp, - BeaconChainProofs.StateRootProof calldata stateRootProof, - BeaconChainProofs.WithdrawalProof[] calldata withdrawalProofs, - bytes[] calldata validatorFieldsProofs, - bytes32[][] calldata validatorFields, - bytes32[][] calldata withdrawalFields -) - external - onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_WITHDRAWAL) - onlyNotFrozen -``` - -Anyone (not just the Pod Owner) can call this method to prove that one or more validators associated with an `EigenPod` have performed a full or partial withdrawal from the beacon chain. - -Whether each withdrawal is a full or partial withdrawal is determined by the validator's "withdrawable epoch" in the `Validator` container given by `validatorFields` (see [consensus specs](https://eth2book.info/capella/part3/containers/dependencies/#validator)). If the withdrawal proof timestamp is after this epoch, the withdrawal is a full withdrawal. -* Partial withdrawals are performed automatically by the beacon chain when a validator has an effective balance over 32 ETH. This method can be used to prove that these withdrawals occurred, allowing the Pod Owner to withdraw the excess ETH (via [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal)). -* Full withdrawals are performed when a Pod Owner decides to fully exit a validator from the beacon chain. To do this, the Pod Owner should follow these steps: - 1. Undelegate or queue a withdrawal (via the `DelegationManager`: ["Undelegating and Withdrawing"](./DelegationManager.md#undelegating-and-withdrawing)) - 2. Exit their validator from the beacon chain and provide a proof to this method - 3. Complete their withdrawal (via [`DelegationManager.completeQueuedWithdrawal`](./DelegationManager.md#completequeuedwithdrawal)). - -If the Pod Owner only exits their validator, the ETH of the pod owner is still staked through EigenLayer and can be used to service AVSs, even though their ETH has been withdrawn from the beacon chain. The protocol allows for this edge case. - -*Beacon chain proofs used*: -* [`verifyStateRootAgainstLatestBlockRoot`](./proofs/BeaconChainProofs.md#beaconchainproofsverifystaterootagainstlatestblockroot) -* [`verifyWithdrawal`](./proofs/BeaconChainProofs.md#beaconchainproofsverifywithdrawal) -* [`verifyValidatorFields`](./proofs/BeaconChainProofs.md#beaconchainproofsverifyvalidatorfields) - -*Effects*: -* For each proven withdrawal: - * The validator in question is recorded as having a proven withdrawal at the timestamp given by `withdrawalProof.timestampRoot` - * This is to prevent the same withdrawal from being proven twice - * If this is a full withdrawal: - * Any withdrawal amount in excess of `MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR` is immediately withdrawn (see [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal)) - * The remainder (`MAX_RESTAKED_BALANCE_GWEI_PER_VALIDATOR`) must be withdrawn through the `DelegationManager's` withdrawal flow, but in the meantime is added to `EigenPod.withdrawableRestakedExecutionLayerGwei` - * If the amount being withdrawn is not equal to the current accounted-for validator balance, a `shareDelta` is calculated to be sent to ([`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate)). - * The validator's info is updated to reflect its `WITHDRAWN` status, and `restakedBalanceGwei` is set to 0 - * If this is a partial withdrawal: - * The withdrawal amount is added to `sumOfPartialWithdrawalsClaimedGwei` - * The withdrawal amount is withdrawn (via [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal)) - -*Requirements*: -* Pause status MUST NOT be set: `PAUSED_EIGENPODS_VERIFY_WITHDRAWAL` -* All input array lengths MUST be equal -* `oracleTimestamp` MUST be queryable via `EigenPodManager.getBlockRootAtTimestamp` (fails if `stateRoot == 0`) -* `BeaconChainProofs.verifyStateRootAgainstLatestBlockRoot` MUST verify the provided `beaconStateRoot` against the oracle-provided `latestBlockRoot` -* For each withdrawal being proven: - * The time of the withdrawal (`withdrawalProof.timestampRoot`) must be AFTER the `EigenPod's` `mostRecentWithdrawalTimestamp` - * The validator MUST be in either status: `ACTIVE` or `WITHDRAWN` - * `WITHDRAWN` is permitted because technically, it's possible to deposit additional ETH into an exited validator and have the ETH be auto-withdrawn. - * If the withdrawal is a full withdrawal, only `ACTIVE` is permitted - * The validator MUST NOT have already proven a withdrawal at the `withdrawalProof.timestampRoot` - * `BeaconChainProofs.verifyWithdrawal` MUST verify the provided `withdrawalFields` against the provided `beaconStateRoot` - * `BeaconChainProofs.verifyValidatorFields` MUST verify the provided `validatorFields` against the `beaconStateRoot` - -#### `DelayedWithdrawalRouter.createDelayedWithdrawal` - -```solidity -function createDelayedWithdrawal( - address podOwner, - address recipient -) - external - payable - onlyEigenPod(podOwner) - onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) -``` - -Used by `EigenPods` to queue a withdrawal of beacon chain ETH that can be claimed by a `recipient` after `withdrawalDelayBlocks` have passed. - -*Effects*: -* Creates a `DelayedWithdrawal` for the `recipient` in the amount of `msg.value`, starting at the current block - -*Requirements*: -* Pause status MUST NOT be set: `PAUSED_DELAYED_WITHDRAWAL_CLAIMS` -* Caller MUST be the `EigenPod` associated with the `podOwner` -* `recipient` MUST NOT be zero - -#### `DelayedWithdrawalRouter.claimDelayedWithdrawals` - -```solidity -function claimDelayedWithdrawals( - address recipient, - uint256 maxNumberOfDelayedWithdrawalsToClaim -) - external - nonReentrant - onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) - -// (Uses `msg.sender` as `recipient`) -function claimDelayedWithdrawals( - uint256 maxNumberOfDelayedWithdrawalsToClaim -) - external - nonReentrant - onlyWhenNotPaused(PAUSED_DELAYED_WITHDRAWAL_CLAIMS) -``` - -After `withdrawalDelayBlocks`, withdrawals can be claimed using these methods. Claims may be processed on behalf of someone else by passing their address in as the `recipient`. Otherwise, claims are processed on behalf of `msg.sender`. - -This method loops over up to `maxNumberOfDelayedWithdrawalsToClaim` withdrawals, tallys each withdrawal amount, and sends the total to the `recipient`. - -*Effects*: -* Updates the `recipient's` `delayedWithdrawalsCompleted` -* Sends ETH from completed withdrawals to the `recipient` - -*Requirements*: -* Pause status MUST NOT be set: `PAUSED_DELAYED_WITHDRAWAL_CLAIMS` - ---- - -### System Configuration - -* [`EigenPodManager.updateBeaconChainOracle`](#eigenpodmanagerupdatebeaconchainoracle) -* [`DelayedWithdrawalRouter.setWithdrawalDelayBlocks`](#delayedwithdrawalroutersetwithdrawaldelayblocks) - -#### `EigenPodManager.updateBeaconChainOracle` - -```solidity -function updateBeaconChainOracle(IBeaconChainOracle newBeaconChainOracle) external onlyOwner -``` - -Allows the owner to update the address of the oracle used by `EigenPods` to retrieve beacon chain state roots (used when verifying beacon chain state proofs). - -*Effects*: -* Updates `EigenPodManager.beaconChainOracle` - -*Requirements*: -* Caller MUST be the owner - -#### `DelayedWithdrawalRouter.setWithdrawalDelayBlocks` - -```solidity -function setWithdrawalDelayBlocks(uint256 newValue) external onlyOwner -``` - -Allows the `DelayedWithdrawalRouter` to update the delay between withdrawal creation and claimability. - -The new delay can't exceed `MAX_WITHDRAWAL_DELAY_BLOCKS`. - -*Effects*: -* Updates `DelayedWithdrawalRouter.withdrawalDelayBlocks` - -*Requirements*: -* Caller MUST be the owner -* `newValue` MUST NOT be greater than `MAX_WITHDRAWAL_DELAY_BLOCKS` +* See [`EigenPod.withdrawRestakedBeaconChainETH`](./EigenPod.md#withdrawrestakedbeaconchaineth) --- ### Other Methods -This section details various methods that don't fit well into other sections. - -Stakers' balance updates are accounted for when the Staker's `EigenPod` calls this method: -* [`EigenPodManager.recordBeaconChainETHBalanceUpdate`](#eigenpodmanagerrecordbeaconchainethbalanceupdate) - -*For pods deployed prior to M2*, the following methods are callable: -* [`EigenPod.activateRestaking`](#eigenpodactivaterestaking) -* [`EigenPod.withdrawBeforeRestaking`](#eigenpodwithdrawbeforerestaking) - -The `EigenPod` also includes two token recovery mechanisms: -* [`EigenPod.withdrawNonBeaconChainETHBalanceWei`](#eigenpodwithdrawnonbeaconchainethbalancewei) -* [`EigenPod.recoverTokens`](#eigenpodrecovertokens) - -#### `EigenPodManager.recordBeaconChainETHBalanceUpdate` +#### `recordBeaconChainETHBalanceUpdate` ```solidity function recordBeaconChainETHBalanceUpdate( @@ -589,130 +200,25 @@ function recordBeaconChainETHBalanceUpdate( nonReentrant ``` -This method is called by an `EigenPod` during a balance update or withdrawal. It accepts a positive or negative `sharesDelta`, which is added/subtracted against the Pod Owner's shares. +This method is called by an `EigenPod` to report a change in its Pod Owner's shares. It accepts a positive or negative `sharesDelta`, which is added/subtracted against the Pod Owner's shares. The delta is also communicated to the `DelegationManager`, which updates the number of shares the Pod Owner has delegated to an Operator. + +Note that this method _may_ result in a Pod Owner's shares going negative. This can occur when: +* The Pod Owner has queued a withdrawal for all their Beacon Chain ETH shares via `DelegationManager.queueWithdrawals` + * This will set the `EigenPodManager.podOwnerShares[podOwner]` to 0 +* The Pod Owner's pod reports a negative delta, perhaps due to the Pod Owner getting slashed on the beacon chain. -If the Pod Owner is not in undelegation limbo and is delegated to an Operator, the `sharesDelta` is also sent to the `DelegationManager` to either increase or decrease the Operator's delegated shares. +In this case, the Pod Owner's `podOwnerShares` will go negative. *Entry Points*: * `EigenPod.verifyWithdrawalCredentials` -* `EigenPod.verifyBalanceUpdates` -* `EigenPod.verifyAndProcessWithdrawals` +* `EigenPod.startCheckpoint` +* `EigenPod.verifyCheckpointProofs` *Effects*: * Adds or removes `sharesDelta` from the Pod Owner's shares -* If the Pod Owner is NOT in undelegation limbo: - * If `sharesDelta` is negative: see [`DelegationManager.decreaseDelegatedShares`](./DelegationManager.md#decreasedelegatedshares) - * If `sharesDelta` is positive: see [`DelegationManager.increaseDelegatedShares`](./DelegationManager.md#increasedelegatedshares) +* If `sharesDelta` is negative: see [`DelegationManager.decreaseDelegatedShares`](./DelegationManager.md#decreasedelegatedshares) +* If `sharesDelta` is positive: see [`DelegationManager.increaseDelegatedShares`](./DelegationManager.md#increasedelegatedshares) *Requirements*: * Caller MUST be the `EigenPod` associated with the passed-in `podOwner` -* `sharesDelta`: - * MUST NOT be 0 - * If negative, `sharesDelta` MUST NOT remove more shares than the Pod Owner has - * MUST be a whole Gwei amount - -#### `EigenPod.activateRestaking` - -```solidity -function activateRestaking() - external - onlyWhenNotPaused(PAUSED_EIGENPODS_VERIFY_CREDENTIALS) - onlyEigenPodOwner - hasNeverRestaked -``` - -Note: This method is only callable on pods deployed before M2. After M2, restaking is enabled by default. - -`activateRestaking` allows a Pod Owner to designate their pod (and any future ETH sent to it) as being restaked. Calling this method first withdraws any ETH in the `EigenPod` via the `DelayedWithdrawalRouter`, and then prevents further calls to `withdrawBeforeRestaking`. - -Withdrawing any future ETH sent via beacon chain withdrawal to the `EigenPod` requires providing beacon chain state proofs. However, ETH sent to the pod's `receive` function should be withdrawable without proofs (see [`withdrawNonBeaconChainETHBalanceWei`](#eigenpodwithdrawnonbeaconchainethbalancewei)). - -*Effects*: -* Sets `hasRestaked = true` -* Sets the pod's `nonBeaconChainETHBalanceWei` to 0 (only incremented in the fallback function) -* Updates the pod's most recent withdrawal timestamp to the current time -* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) - -*Requirements*: -* Caller MUST be the Pod Owner -* Pause status MUST NOT be set: `PAUSED_NEW_EIGENPODS` -* Pod MUST NOT have already activated restaking -* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) - -*As of M2*: restaking is automatically activated for newly-deployed `EigenPods` (`hasRestaked = true`). However, for `EigenPods` deployed *before* M2, restaking may not be active (unless the Pod Owner has called this method). - -#### `EigenPod.withdrawBeforeRestaking` - -```solidity -function withdrawBeforeRestaking() - external - onlyEigenPodOwner - hasNeverRestaked -``` - -Note: This method is only callable on pods deployed before M2. After M2, restaking is enabled by default. - -Allows the Pod Owner to withdraw any ETH in the `EigenPod` via the `DelayedWithdrawalRouter`, assuming restaking has not yet been activated. See [`EigenPod.activateRestaking`](#eigenpodactivaterestaking) for more details. - -*Effects*: -* Sets the pod's `nonBeaconChainETHBalanceWei` to 0 (only incremented in the fallback function) -* Updates the pod's most recent withdrawal timestamp to the current time -* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) - -*Requirements*: -* Caller MUST be the Pod Owner -* Pod MUST NOT have already activated restaking -* See [DelayedWithdrawalRouter.createDelayedWithdrawal](#delayedwithdrawalroutercreatedelayedwithdrawal) - -*As of M2*: restaking is automatically activated for newly-deployed `EigenPods`, making this method uncallable for pods deployed after M2. However, for `EigenPods` deployed *before* M2, restaking may not be active, and this method may be callable. - -#### `EigenPod.withdrawNonBeaconChainETHBalanceWei` - -```solidity -function withdrawNonBeaconChainETHBalanceWei( - address recipient, - uint256 amountToWithdraw -) - external - onlyEigenPodOwner - onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS) -``` - -Allows the Pod Owner to withdraw ETH accidentally sent to the contract's `receive` function. - -The `receive` function updates `nonBeaconChainETHBalanceWei`, which this function uses to calculate how much can be withdrawn. - -Withdrawals from this function are sent via the `DelayedWithdrawalRouter`, and can be claimed by the passed-in `recipient`. - -*Effects:* -* Decrements `nonBeaconChainETHBalanceWei` -* Sends `amountToWithdraw` wei to [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal) - -*Requirements:* -* Pause status MUST NOT be set: `PAUSED_NON_PROOF_WITHDRAWALS` -* Caller MUST be the Pod Owner -* `amountToWithdraw` MUST NOT be greater than the amount sent to the contract's `receive` function -* See [`DelayedWithdrawalRouter.createDelayedWithdrawal`](#delayedwithdrawalroutercreatedelayedwithdrawal) - -#### `EigenPod.recoverTokens` - -```solidity -function recoverTokens( - IERC20[] memory tokenList, - uint256[] memory amountsToWithdraw, - address recipient -) - external - onlyEigenPodOwner - onlyWhenNotPaused(PAUSED_NON_PROOF_WITHDRAWALS) -``` - -Allows the Pod Owner to rescue ERC20 tokens accidentally sent to the `EigenPod`. - -*Effects:* -* Calls `transfer` on each of the ERC20's in `tokenList`, sending the corresponding `amountsToWithdraw` to the `recipient` - -*Requirements:* -* Pause status MUST NOT be set: `PAUSED_NON_PROOF_WITHDRAWALS` -* `tokenList` and `amountsToWithdraw` MUST have equal lengths -* Caller MUST be the Pod Owner +* `sharesDelta` MUST be a whole Gwei amount diff --git a/docs/images/EL_completing_queued_withdrawal.png b/docs/images/EL_completing_queued_withdrawal.png deleted file mode 100644 index 9dd09ddb51a1262dde53ffa273bfb81535ac8caf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64111 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 diff --git a/docs/images/EL_delegating.png b/docs/images/EL_delegating.png deleted file mode 100644 index f371009f447fc12fcb5d19bc701688cd8e8adbf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46920 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°jn4N60c|l-foF768(y;(ScI_*mvW2 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 diff --git a/docs/images/EL_depositing.png b/docs/images/EL_depositing.png deleted file mode 100644 index 9e732e15dd20d6e1a77ed16290bfad18086e445d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65455 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 z 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 diff --git a/docs/images/EL_depositing_BeaconChainETH_2.png b/docs/images/EL_depositing_BeaconChainETH_2.png deleted file mode 100644 index 7fdb154f41c3a993995823de694456781f549034..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69580 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 z 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 diff --git a/docs/images/EL_queuing_a_withdrawal.png b/docs/images/EL_queuing_a_withdrawal.png deleted file mode 100644 index 2ec65148e172ce26e630181e61a2a78a433f97c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52566 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�$IX3#AaEzSqB%Q~AW~LXE2ecuh|! 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 diff --git a/docs/images/EigenPods_Architecture.png b/docs/images/EigenPods_Architecture.png deleted file mode 100644 index 12703d6a69eb6bd0383c7880a1bded1216896c29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42555 zcmeFZWmuG3-!}|McSsB!0wO)Mbb}HC5+X><&>#X*QqmxUq)7Kh5JWl^lo-0CyAcrS z&S#C+wfDY1JjZ*y$NTC1aDUpz9yw>$xz4rz>sS9X@{yJ*5k4(G8X6jrx|)(M8X5)+ z4Gp~v7aM%C`o_`%{0H4lS5*P6w4Z(h4UHL1T}l42*R!p!IElC0Pp(bP+_2j*b1^s` zk+$RJCf~A_*I>48k05jFe}hh8X+Ze;u4PLE*{z^Ag?E!F?yVsy16Fp|IjOb&~T6jIE5`l=c=zW;uzgtSBi8b0%8N6-ke zA~RUFns2Tx&Q{-(kjR{xd#$C|w7iwvrWrH!oHZI4+tiGaIk&Alne%C7^w}b7@c2Eo zZvBJ$P`%)CC*X#lhp*Am$m*T`mULyG=+nG;eF7}slUdKjFuLcs6dW43{LPoHr)NL2 zTD!SF(;Jxi9lhuk>oy=Q=DXj;x!5Z-Kp4eaV>HBk_gHLi#%&<1X(&7u#;YwMl*pP9Q8u$WL8 zzw;12(}vrK0ewSLN)GKzdM(M{Rb?yj52;MF*cmUu*S4y2X53y&b>O4pY>z$Ym*n@o zxjHcz$q8qqO?vifqojR*TTe@ZeU}2g`D`uiGmZYKHpKbMo=V;MW^wENUnLaBQx2cw zzp!cLyf^drKD|5`Xw^|=piDBdj1-Sq&%CE72j@`w61*Y-osl<7$dbGarIWY+VA4H@^ZFgi0Y{$8TgBY zqcrLB^}JRvr4YXQ6>>KBh}z|XwCDCC7_(n}PIh-&Ny2OAUU64BjF%b-y#FgbMaU)$ zO#1YkehI}9vssq^dC@!XA!X`G6_zxqo6Cbr$IYhe^Iv7_xlu{^vyRL)lh$d2wa)Y3 z?myz%bB0cfmp;xooLgdLhEmx1k?PSx9m3yq%K8O-?_v-EU)g-lqQqhdg+28Iwy~()kNm-Mm};X#JEb9^p^1y~ z`bd$Uk!?oc$pHShI+ z#mqzR(neOvTr=a^15sxXf01oRUokpRZ3ni955pNLgdk@G?l`J%SnVv4HfZ?%*(CJYV1BpaR@Y8a6UAYWaK6RE}c!?snr2ws2&gY78G2gj-qGvFU8h8rtSaDe~ST z7YRU>pRH8C=vFRMmn`DX30_wcEs3EN@n5DMCbKXBQp1exFSq|9y@sJ;@is1`I z@9fN~n9znEv5cy@@PO1oh^FXdn{PBQCHVPQvtD`FMS(b;^AuPIWAW3sr@DwgYh(%ltbC z8;-`FPD|_D2uBcDxeS1dtevK<-kUmpQR+)f<{l7VMxcGibnxxoZo1gs9a3eQJdFw# za{IO%Bm2DRqt37pobrd}e7$Ij2N9!`xcRp97&dC9b?qN~8wIA&nQc0GmDu@15N-`=d zF|yZX=M^+;v2-#<)ZLNf(j2~2$r={lFTldt?4*$qkEJ|;1sTa%lV10+_OZTyxXA_s zB~AOAuX>jJD=n$LwgyXI^nQcVw2zn0Rl&zzjVy>NbPK^&rar7(+IALWnf!NnbbFB* z0l|1}V}j-^A;}8+%s5dz6`edM;$hc3O>A>FlT)n<{g@iNodo<}VkvqY19tarGq??1 z&?Jyzhu~$(z%F%Ft2BoMgNnK$VQXTGUhucv0o2PW4dY@|%&FprY_aBQ1VJjHugbV2 zu1}YpgvdULH3#D=v}L?d{uTat@p!6_)g~7k zIs)r5*TkqU;Bv3SNc_U28q{Y$rwydSRK$=DYn$caqVjsdln|G z#DL;yeuVe7t26RJO~)WcwzNEynvr#4SI1%~hrYmFi5jVQGF`N$F-JN^(^%a)K zbGLqp4`ieo>apq^wdWqzT1cZ8GfX6$mL6|;EP0-fq(ly}Re+kEHrU|q!1lPRC-@#S zrg>!D{B50w$qJ-diFdPnGBosvqjasC6&AixeDKD z>%)POM3Ya*T@S4(_l4JY(yR{hO(`+SQ+>I4^78b#E8a4hBUuC;EY{`Q35Ew^)#3Bk zv2(iKp?nrwv_T%F;0F~>*_%Roy2SH*srH*{kMP7#ea;%w*3TG>X{x$?g=~?&%Zcj9 zFY|)6m3A!mlg}{7e~|Vg*q9D_(PMq8WJ-^69g#d74plElqFlPfmD1CdgDJjI^s!%U z-eISMz@(rCMV!VSWx<4sA9Hv5M&D~8Cz5k`!!+{Z{<^~T>oZZ5P9``LTY~dsIn)1+ zb%=72UTiF&Uo%CPH;OBXJ+fUMoDuTCMJ!6npE5#f&lcYAh-IoHmn?t7QX2%X&z=bm z3GoYTldj>fdGnAv-aF%?sm1)P)*b%3(}=KSSw#=31FdIEp^(gvQm1pHp)eNyjX@!l z-_=FaxWJ*AY9x{JwrePc#)*h!?>Z+pFz`P~EUL_;~Qz?mKn zhYS^2)k_@<9Sgxd_37!@jYf*mptF|n1}2R>W4!KyrsO{6CoY{vex|Aro)#JP`}I~B zDrw}DYIiZaJa>{Mk|Sp5>At=%bH#n9{cY~E##|!Z=#u%{Ao|=m3-qu%HbNN{6qB6Mb*fs zd{8R(qi5PDSgmdGc2s?iQMHtP1b&^#GvI`1`HsWnSRgabDt@f<^SaPXw+T)dgoqqq zfAENzpsJ@UIDw{F?Biso3Nqd3{OW8$V-Pz8*|RISJjKwP>_|H)kR7;R-bVlJ3tHf^ z^HBNLJP$mI$U+plHjkYg{FPuzsflZ?!(`)Lo!A59;0t-*T(?x!frfxQ3M)?7neVcU znS8;}n?|K(=`{<{FobMbaH2}zntA8R227aga{me`)MaE+;-^u$z2LgIWI(va+ho=e zuSs>4SadaDb3OPqlm&$rYi)(u6a4rr3^(qux>VNkFIMB#h*R*`5Sa~nlFlXot! zAp7p}xV}LrBqDAYHWuL}f^h=n%wV-$$rI--C5W!^R(Ud32df}6GOqk%Y!yah3VJzz ztZR+!xVybh5H#aClT0P7vgO$?{!}v+;3{v`Iwb<*spH|`tBRWyP8IY2@m!6)Gmy#HqUW1kpC_B1ec{#(;91Gc*Eyh_WzvZ0 z1eOG&r#g=#tj_Pa%7##wKs#*dFLU8M{bHF9g~mw7WC~b5ZhL$e8c91>{UmrfXKI&= zE`8R^&`|pVg-gv139|$_IApdQjX5|JFDWitX+#|-c=~JWKSrF9yRI_XTOX3y`$VXT zLaC0j_V$bDrtWd*_C^&h=W!rxrG3%iIH8aqe(qi$DDaw@!o54+Xd7=a?{&Sg->ZAy zPNqi_6)IV2M-t!4QRKEHn2z%EfP%A>%ZqB)K!!|IUz22Ex0IRq_EEMRWo9*Fk4;uLPd6*QwORN&=9s$J^oCH5R!Jtt%RM` zqyeQmq5I$@(+rQAK#UD_8P)9ciCGQ_(o#1U4j837OC=!M+ow8Su3fIs`Ze9s#!_lj zMp}{vk(nj=Kj}%SN!u`G*i?b-aLGTr*3$00=6ZttDzrb5LT(O-r)`< z$>J{0R6-e|MWe=UeWGO&<`D8QE&bXxHpvYr*)O?sfRq~?DyNB=&$wa^I4!s zw`Z~)Bb*))Ppnt+o5Kt5vR2QuA$PnpF9g5KYkW)Zn(0d3K?>bMgZ|nka4x_LzZe|h zsqBRw<0h0`AmR4UPkl_FYefv}vQ=DL`;~Yc+!_tIwCFK+dy)=C=pb(KT|oqbHoXgN z(KihFti+I>wechph$6-JrCx>KQ&}3CVf-I$vssvYVJThD57=Ro@l7gS$*RpkytF@h ziLj^4HJZWBlMz4Q?y zP%mTZws26K5X=uQ{CXhis?Gs9P87i_e|8y=vwX@YDod8OAwIaOa_TU_Y&-+!Mx?hm|(m%#9O-UvGfhTp;eq522Hrk z`Dimfz$g5%tFt%x856j(>oiK-vo&}$4mO9detvzTT95cP~ z@ge2?$^1BwysPJ|Zq0W+F1F51bN!RA8+)CLC*TO@;h0jEZ&*x9)Dir~_aYuB!gYCia>=DNG3gjZY3Ed8auxN~KSZ5kWbkI?UhJ;2!fffzn(%NVu#@BnQywxmr(8ct zSr$z|)SEF(dGp{TGO-V)puodShu2!Ie1HInTt0+pTPVq?HC7$D{~d)nA0TPOT*|2+ zQRUw_SE#@|Gw2XP*CctU2zq51KT#8fdO*Y6cp7!6E;STLc{zpnAIrcI>J;&-HY6%} znNkdas_9lAEAk{t1lr4J8qH{k_p7?xLY3L-(-HLt0R?(O6w(yl)~9~f)T63M=Au|> zZM02EvmM3F?mODD%%|>)5m9y>SL-u^VnPEt!n2_Xg08CGN*`2nbf4d5+ibJkQdi5n zgT_mvglO-++5yw-Mr7gZAobz)HSBbzE?YB*(5C_Y^0xGS9zIBviu9`x#?|HbSYhUm z`JhPDY{SV-w+}P9M#DS&Tc?^WG!AroDw5qPTKjmx5l~ z`GbIg@-Pql;f9AVd!cg@&d^k<;EUX;VG}sd1CLq6`i?oF+<7jSY(?~>1{5j%Hfx?l zegDg|Ka-rUDR}f81@H|F|xyKhh{J5NXGz*r#cOp0Tm>VEtlde z|580;D`7iEvXiCf4Qsb~ZD;P5#FxALn;HPCSTmZFY!HR@O`p7LD zmu@RV8u!z;Nh2ZlBNd^JM$)nnG#kd- zJ9Zp(oKNS99p_6D&^1O+r39bvv%qv%Ly?iu*!7ia%ZooqAwASK-RwW6L^g-i8t&S4 zkI1PG_`-=>w>mh2(AcO&Z!3B1N84m-ZWtRh@pp1Ar%ANwO~Z%FR6CxFLRFX}a5SyX zWv%1OeVbg6oTWIvw@CTdtg9xjqkWzueL*QZm7gk?x@}*8h^p>1LSV_T)J7oM*Kx-u z+UiF4`O7I@YLabGGV9?M;0?f*qbS#SsWdd+rZn25=ce4w(^}yXjtwnLVjExTdd{e) zE{fwXqsys3$48Y`C?wMy9%IGh5i{0Y!TzoQ>$GL& zC#h{VvBa$A6kaQp8fVe--<2-kYln7<2W)sYY5H6G#Yo$kf&y#axNM!g^6(DOu5vnC z*c$MbwdRmLPUKFpv-Rp{`eN=Ip!XH#&3iv5eCcfK|*hKADNUq?TM`l$MLp$`m6=}x5=<*nElQZPG?A;m$ z4|C^XgcMyzozYL);!GcYp{c3q;=G%R=)oV?TJVyp(>0!qm)Ki~7k7>XmL0F*r(E8z zu&8Wg9>kdN`~0tmN{JNdj_%4m zVG?-IU=>^(?@N{kykEwJt`*f>*(uv!MkPft2%ns-#H_u6PRyzdzm==;3Y*ule(XT) zMBx=IDe3)oP#*S6F#W8;Wo$KP(a>5zj@8lR4;Q@rR@MMZAn)g#?>lwx7%A6L4 zTLC}9c<|3GhX$`)nq9iTQ^(gwyL5a0qHPYFi~F?`{hdF{lLPCQ?`DaQ8yhop?Av;w zwqnB0w|xfq%SEerj?0YMln-fl*Cg}Y;pK>ULD>M_d5?Af|Cl$0ewY(&qn`9nezQGl zqI!dPhxeqA1&dpa; zKqddQJ8Eban#B7wY&GdAU$5A_Z)Mf*&&}8PLN@(`zz_6H_B)<*$epzh`S0QjL~WlW zoHsz~*H|C>^mL5#zWe6w2G1QvEs51cfpHVJRUP}Ix%1WcW?{gPm7M|R*o|GAGPUV# zV%f{x`#jhrjP&P6zo@srp3DI)SyH%RX#AOvllXdeaLevuYby||XV&*0|FgLs0F@yL zXJ1?T=EY;gx)@FrHS0MqO~`Ox_>XDY&H<~P^>`}2mJDkFb`2BC z>)XWCsiwlfQ+Vy{krPT~U#8+H4(_=Zd#8AW2&F!sZdDGn0Jo8e>Is~zScP5G`SX|k z2SyH`s$2eRGU;=PAI{yA2YV^zt?M7pj217V8vzkgNE3BJg!t~YQ(JVgzwgak*=(T1 zXaGKDcq9d9Sml6>WcrI1JPY8_6+5(zn*}%(JSeNX*ltveVU&KOh5Se$IBI}Z1$xdji9BH*K)L&LdRQ%zI1P(-1aX? ziuj!$zWABp8K%nUeJ9)97+4Fxr<`hMTb82upBavUMMJ9v9@4N(PMpJRLv;$iAbJBo zm5fPjz90-4Ql$4GjMBj9yS1sZ=HFQW4R2Kj_s1ENu|Gf8uhBN{0HRXW6{KGB@IBum zLZ~0tX}YE_lF(^mwAj$deN;a>*6ILVk|!0z0W? zzlY!Kq)FUJ3MlaCCM1$u0>ix`1=8Mx=(G1Q?Wxc?Vceg;xOxFYt+*y*veSs2mJMov zH&T3(!3y&}H1&gTwNslBW=ML9Rv-58H=7vVGp+)z?a*~I*eVc-mMRZPAQKm461^Ov1q5*dLHH+4o{-k!7Wh7-VJq8-f?KN^=-$Q~o>3`gvJWdx3? z=z9T@D%+u!g|pM;m_Eaoz`3h-u24_lIKB|4`w=FZ3Nis^b->bXiR8?*J;)~DkXthn zjhpv7F*SEP0Ve;{mx})Tzl^R5G*X~FYkfb5b)Op_u)v6%t@Tb+)h2K^2ZSdku7y}F1RP~t` z@h5UP!c*5w<}nBPO_>l&?zIMjMEda2gnjWROBNb-*juu-UZ60I&V>hHB_rEe0bae@D|2Er26QiUVuGMxbZC%fz7?x}hX^KsOV=aBj zV=`#%RQ4S^M>|VqaqOwH$S2Y@%_{VECdk$tv)a7VEJ#JJ@O28`BxT|hh_(RY~kJ)(W~ zbwwD0UgC!u=WnGK;}edReU7CCW=r?b(h)k?v?3;^Wi@K|P~HLK#80SRMWwuAs5OCm z1qBAjN8oFZ%OrWPrF_`d-0Eh2f=XJX5Rv^*G68#J5h!n!6#~i)a;0~B{3<7i1c$8f zb(HG2&p>r_!dbm$mXTPTuI^y;8KG?NCzBPqerxtrRAS-vt&-AETjcZlRjTQ@`dxpH z-SrFF77WYOC3|Fvob_W+gV}P zOi1$$cjq@4d#gFX zcUw#)Sv-LvpF1r<5;KZnYTCKk=?{&TBjpXw8W3!;~AWMr!(#%E<5n zSdA~J&(`%=L5d+CF0xl2h%CYpk6x%5in=&a(bnh1$lU)WZF`PuyBi}tegW+=qUQl} zWlH0k`0p+l?z#cXqe@&bl`6u~Wmay{UYo?ZXD-f>!D9GmoUkLO1_zI9&MFH~ zVP9$}!h17L1;yf-lgg}R)T&ICbQ-eNgL%kQh`Xi$BI#}ZbvUdo_D+z3F$lQ{LQjQ4 zdiU#FCx>MpY%jO6p5t}A>P?S@%4i8&@SSQb3@lzV0PW;lM%OS@kuZ|JFKK0LIz)(9 zE7t{B7d)ut@9^_=*{#yEJwBL7Mlkztv^Zzgo|!DNb}+l4K_m=eQSi-$X&x(G8ISfwxb8w*0OpTy zuU&Z)C>1q9T)7l>DOh%bq<2FQ_5Ak^NZcs*7sHvx&YF<3vB*hVavrq3p2P3%dW9Fd zB1*`JrsI=$uK(R#LA>hK zFAWu?57{hF9n0HWK&b0EAPWjLQ})GArU-=1HJ+UskdkYyur)mxnA9-3-mN z{khMjFIs5iJIvuZ1B!Le9=+Fqu6=(nbk>o_CB0dhm^M}i=h?ktEJ)H);v zgtA0bJvq2IXthP;Sq(WL^P#$PajJ}VA$@)lgBtSoxhHZ<$-Tza_Ex;d%krH=6n!)P+)9lvd%wVkLathcp8m0VFnpn?RUDoD88NFbBh zfJw{Qmla`nza>SRN$bfqSdtUgWSUJEZ`)^M~O)xoNeoj>Z`Xofz9^Rd-7rKkj{vu7sSVJ3UYOi+)P=Tk=DbFUrXH zlQY1jbF^nv2|Ii|M8tnKni(A)odyY(XUnsp-`fW`a9YBFo__@%HA}{!$-yA(;vb@3 z#p9uM%9!>bS$Ba^Q_KC6O!TZ7BR(HD|S>J$G>bC>;=lN>A&Wx&LB5qbuRbt;-I*O}s87aTNM@Z6v5?*KO~+4sw){X^32X#@XL zYISeryz9`+Z3^z299*2A`r>_%K9S@$JoN~t1Dq>GoOoV-HqVgljXC!>c2+?ou*BEs zm*(HxoHi7V!_qhQpzC0wka}~m0x%o{s^p`8goRMH7a&UaWkGQ z385(3f7kVu)_)ndTng#JH@6?S)z0%W=>gYg)&=iIhyew!9)52h`7d`5MKOGf4@KR7 z|9pttZ`3bJ`V}Spt32pOfU|(oBlRQCKTQ39zwCeK3`L9ozb%bHFH8_^{0yK6QwWIh zi2-)N+ABKk7|s8f9XAkzloY~^CM?bRpVf9l5~y$Rg#8PEC+^Kg0Hn2o{1TPc{f&H7 zY%huEBdAYO0AeyO0<=iT3Z%f^e1~K6RT;IV z0UDA+qC|@qoh;!a)q5bdM+6Qin9rFy}+KYha z6X7s=W!o**?SP16H55g}eLMl>N4%`R1kBbV5R0nJ2F&12!@M4`lKtne$I#zn>qB|1 zc%12^GG{9ZWqU}vaKLb(RgRNT6AkF18Tx6QXjss0=$Igpg5c zqLX-4u7ueGhvDTTBmc8ifMgj^43vh^dnN7#SVC!Q`0WpHGPz)o)0|HT*-GHswirb{s zd!lK_%4jlqT-wxnSd6qs(!STT|J&W~E!|x01T1FyYzyA-R_QYZT$W!E|E5VT1`waKn|pp z`raf<4MeTQjy;1*!M2WND(z8v%*9EuT^J>Ini&r-N#LB;CQUnfTV;1T-bJf z35NNE!OVM=Qpilt2lQ{zVCKi z`Q{bJ{-^p*qo#gkLTKn2@y%TgpJYfDNKpE056IpSCKHT<(DREnGS!J2 zAV|Hspp#|cWm7>2RD_7)HGc#&O-$JCN1L!M>0hX{JYR1@IOD6rGsDHSwV}j%;Xkob z+o`IeI0@fDlNW~_j**iTEg>Xn7pd~Jdu*+TZ?tLs&7aNJ!M8fuVuW)e*GMYwq)Kb# z*dFhy-?}C24~V@tjf87HnO0o+p|33~Y-7Wr`thG)LXOD{vn>HEe?Y)(t#=pj9J-V` z(D%@L(vxv^CXGqhd{@{qmUdgw2Xm2y2>VW`Fh%k$m))PwB8I^NwDx}j`Vc-zNAXX9 zY`7h!6L|Q-l}rUnoG?_A$OMR!ZPKsj5q)@e>Q2NYGoulbOnz~=0kiJW$x{ghvZ8Uy zX=6@wYaA01gK_z=mLxAHq&0=_14^o} z8%I#3v@vgdnL@+hD~mCW6`)|O_J@);)UBhJglin#K<<&HEeq8q{9zhb2@Fn1{wd&1<@ zSW0l$o~kih8wtNqN>x}Q?YyUiSa@ygJ-Ppv{!d$-PnAGCE^uM_&!J`|zwqmGvnXq* z#EVStwQ^4dB(ugH^VOXmpeymXv%Deu5n4mo%=;cxtX5q^(v*mKebK;|IaaPrpL%`N zYyw-Q+G1RxSPD3JcOtnt+Qfs_h@BV;Mm2K!6DL3Fa}&U`zk*D0#Oy;;e^9sv0S0}- zSp4~m_|cH`XdpP>+z%7%xlltXRL4w5rnJGX$}1V0S6 z|MOJTZiB%`ZobVmRDqYQ$BKTGiz`?8{vrI&IIAPUsGW|BYahUQo?LN5lS-~1IsF-M zBuc*~n|)OA0G!u^Q$hGt5N=#i={u;~DRctbnSEmbU^}DDtgx<4l2MgE!^H)klMfNG z7l(8jb!GDwn#Yv~nGY-eS{N80PIL7Bm1JiK7RP|u?PS& zN)$I)GJW&|AB^hu+!q3BNDo~FDQF66c<~J#r+0q^05B$$0b=mXdllmW&ovv$zYqs% zbt{ACj78|@x}`T3S$@ZOx3CGzZb0(*s|9FnAp(s;CSUnue9ZQqW|M=NDZB$F?VVEd z;SRWMY2?`#c{mSK)%DICkO)HpZ{dUiJkkZF8Aujn+X5C#f#0jcAytCA<)<-nQ~_XV z3IMG^0M)C3>goa~3@7SHwLrBaF-Uq4a%TCuP5^}X%g=k};>|q9ySv~yvZKt)JLi7| z)OH$e2=@OZVuhV$Q?kH-(C3ZP(|={kEJd)j05nLC!aWzWePZ+Ud|wZL>;g&|KKIop z9M!}H;1a#XQd{IAsDeZTG8c|0yF^1T)PSfSocDh^!GM^1QHDCG!D&1gG4eOO8T4@a zvWHv*iE%>Sr!|Bq$LNm%gTv%&e&TC6al311-KETtMlXEbi^{J3%kI; zpkc`~{exwCW>#pwI$xgdNlgDg-;Y`k=whJ(8V|S6Ie3J^(bQAiRnI`=-V}wETY)9! z9MBBFWh)l7iTNE|4D9cViglm|toLO^f^^6xfGQ+lIU%GEfY}fZ+Bw8E(nNU?43afk z%c54@x7oZ%ztKIf`+mJPknXhV^R zO$2J7$0_K&YC*O50Y^)Z4QAVcY94&DUHsV;>sz5J*y?Jy7>@U@avxm!fEK(;;m|=8A7TYIF1_Kl_9k{?Z?b)F;u?9C>GKn)|GQx6C7+SEgcXqm?k;wSTDIZ( zP#g2DfYl?igcGR57T)}HgqrYxb8Tq)c_Z&5?UnVsm}`)1EPh}7XSnva(KTjm_3LQa zK&6a{L+`y9w8oUP%-TW$CaYoAX-y;-^5nDX5G0payaQa4n= zA}Is(A>Ewb|h(`0W^$b0~qktuW2zJpJJbdRp8Ox z!+_VFhM}0)MVAVprm$>%$7evpCQfjMK8lh-ifb5qJ~x5tyQsejGQs$A;!iWn0Zkvs z4y%pEGIvYU8hHQt8u$;9~<^67O%!n#s5*)9)!E>2~mG837WH=@Vre zv94cb5gz$ZWgF+hQMU3mdwJiqdm*a54R?V=XzL!4T2*yg9o<8FP#L;G%DL$ZI;wP&4w-@7<_itPc z`H4jHAVr~LP%OehW8Vyh;o#;H$LpOtcE%HBWh@Jlu+}oL71Ipf^bt;phzj~TIKJ5Z zuH+W|6ulH3vwK%lhqx(eCaNG+lcXsj<)nbiyQ0(RlYh=lK%>%sPI~rDl9&p(4(p=* z$nDoLRFbwDx3{TVv}nH{21yZAE zr(bMfVAv}-64$J}11b!AkZ!vH1S3|^mzL!m;Vw#Li-;8ESP1z>E=uSq2l!rn!&nXr z(l^|$0?5Qk?KhB4T3S9)N>Xuh<^x{2 z!HL`Q{Sjf-C5oK_dJ30n)CZtddXfWg|GhVVDY_k5T=~?t9l%IOpF52z&K0Z4F!W>4 z;DlL`k)Q2&alJ4v$N!AZ=D-KH*2nEE(eRh+X}c zP!)WdD!W*2Od^^aBrn=LPnB*gFZKR*P8a(SbR`B?QDgU1TA_u}YXM!zlodeSIJ<_H zN3+X+X93g(_S-15jpE_LZX;y8Peh^E7QJ7n6a0*o050<}{-3x^Zj=oT(rOdMOi^Wc zhcC>Fj5NqPveV)k$wflSg<+<45M*7f97ScZIZ~9=Z`HxzDcs@N8xzZY**{q3B71g* z``~*=9K5@O-c19=)xO>`Q@tE9avXGYVWJh5oy7P}w_#Jq6r}n>BN4G^gKU=++Q|^G zP#8VYp1}suOy!UFcPPM&G)E%Xi)A0vu{=5gI+2=|hCP*Tkrxym&j_OpDU{E}HCVhW zaLLS~9Lrl}ldd2?h^KX}bQh2g^HU%1l+%~Lfhb8@&9d3`k3YBc-s<44xBXtR*n>I zB|TIdSMcY(Y=ef{szp$|y~c$TI#JRJ$8#jWda%NMh23VDM4aPK2tZq-bxm6pW+ij7 z6kS8D^?mM#iU2>?ds1qqRLy}$ZyZx712A%%%C|0>R6cbVfCRbuGS#^?Q^69A_;N=1TQ+NquZ-uh)DoJ^!8uSlAi7$Si z+CX;JS^r^$DdE3NM6t-81!`~)PQYylE|?KEBA|Obx}SJ1CL!HUrULK!sqt7HiXy)% zvWXw5Qg0rFI$Es0K|~@bMP2O|xHMI|Hrl{3KD!^|;{Vqj2w+I;c}x%V3Hk#5Qm83& zRYocy@#!Q)b`v@B;4fJ>xWr#Y+-iBp&jayO;02XynEJ26$hBtOY-6t!Rv0TRG$!+2 zfNp}$s$}e~#y!eqffvNrNq2C-y{#N7bJ^#fef|%+N$xaS%=^%tH3EM;Ni4ORsMiw9 zqR8`^COqh2d??^e73X;q)kBwtj!JZfnVsOTmsK87%6{r9gl2@B(bTtzcV3_}HlK{E zKWZo+j=e$w{NL!gXZ$Fp#R0ZG*%RcHE%YAK1PY4Pfp}O8k=P7rgZnQkfUZfSG86Bh zdVp7sH3jVp&OX!JrTR=5Cm2`06kTwSTRlO?PI3#JD+C~(6F?(k{}_ek6aWHgK?%wC zJ+_RdsEZGCQT+Bc4aL)lwPv_`G-{L;DsYHHURPnAxi%2Gq%O89lavFtCdyIoOt1hz zfdut-fQgsGno$?fcLt~cjCQHlyWRkxZ?MOA*A7eg<_~w%7J<+KIaeIy z09wG?4U#FviN?Nk=;=#8GP}73G+_~NIT8?sg6mfoCBM4@E^G^cS}iE$j5?LS6bN}j zRnKPu%pd%&@zx~czB@i3E<9_$^bJB$Q~d%b@$|@e{sG~O%=Qndh(5qZ0xR)i?r#>p zSc>Gl4o|czTa!rrxOMD!MSv#>n&xjQ0b$mL1l36YuKM0HcYu$6qR@T_;8DG$+Ok)| zz5q44kB2k))2soxdl0;*q71w>ArvI>=Ey5tBg71c3pAI%s(I@3g8igF?OuMb^azB> zts1#T;afmpCIO=U7cwX|NB&j_g;pV(6>W(XT{xw;PE|lgh$(;*i$GfyVf6r6qENQC z;<>EuQ5U+K=KzB1?4Oka{li(u@eDKLlsc+QpC6!jGIkcF~vyCI}KxLqVnx!qqD5 z{zIJ;!UZc&7~#M;JOV7kHdTPr0^}5{kWfBmfyod-^uV9zfYRQ$T>-|jh|&YE0V33? zF#~v7bpbU{oBF{vmn-n(Jg&eEyHii`sIkcwiQN?Np)`8iANi4X#Xz{XxTx=BjT$kn zvI4#z5$a7Sv+Y9UERUGL#8pen{J|SVEHGOV@Tv|9WHcQ$>dhtstz{DxWme>Ty+SDF zggRQlaz;AnIJCm6fa3P#9II3J@hROBEcm8U{7n1$H??uqx(GOiFq>%}`pX~ZjRRWD zPzSW~%qM)kKW$4df1>h*m&WFSSQylFSj}(n-{4bV+@LZrP9#_;gy7tlAV|#A1Y%b_ zi!0zfalqp=eCi}}5d57mSRGqWtH7F&30j5o1Hta_jjB>qLq)tO4+29Bj)N8y8GWtp z(+#DPWcNo;6qt)pb*tLujUGSP!V5+vy7s9EmyvGpa2z>0f{E|1%W8F;A{N=giXsCi zn*##eRy--*Vmp+FJ%RQ_9)C{b&PXgLH3j1KB6v56w)Lt$H_IbS)b1pF5gIjqZm>w) z>E+iKU;g!Ys;4&=@b^y=95xiaa-@Qw+4C@O$Xs*GoY%vt;^=ci1&S#Yk)p6q8bFrytZPg6*DK)|)0`lptahWtw(=POYnwDTs_$ z!p$cG{`CJlAI%J$-Mx&J=y0vc;t^eSI!AG@IA0PXjK&_mqn?`+WAf z4ejR>U(L93u;N7y*N51?01d;tCHBgLXe{?z@`S=jbL4MYeI9hw6lYUBFv98!V8^U| zo$K%h5hs{IxO``qC(O2t>Q?(oQqHyJ^Z7#S|GM0dx@m2%x!D`e-ka*d9l-`80a&wI zDYHHH0kOfruGapbLVo!G^?tv-PeJ_EQzxUMrVW(2U2|b_U{-NnThK{^LzAHC2SQdn z_}%a5OHh%)y8UkMR=}YQA3eqQ&Rq8Cq>=?3U6Qb2>@V;gza~EVjiPc$M<*73yn~nT z!K8CRRWi#qhCfW}KvBOurqKDgsxMS(2fp>YcAgj%P+shiNWQ%It2A5l#}X{0K@2CM zVWzrixVF~-CUL|gT(p>JQ+-2LK1u2IcICwfQ$pQAd@~gFo*V?N$i0$=&5stl3*U3V z-FcuLq24G2_&lv7T7y}${~};)8Ca#~nLkx7e}xe<*jqV$JsMlgjpD0Ve*JB*YXS(x z)Sd0eKn4i`wMGi%yeG-MS84z{+7rNjNLoPd$=-dXj*B?gA7olfWb&zUOr}trm`?qV zXr-quO$kmU+sWVH0Ur4_)UBTwR0KrL(NNySe1iZ}5r?j6^W^4>ag^a=8uK^?MIdQ$xBIvyJ-G|XlZ*f2y6cvswUhGhajK6lWPj8HyHu1Sp{ zh=dOA2+sILQ2EMFnuFcx}P^1E4tbG-TTLPMRYqC{ZAJSdl z*jXCopLzc5&**#EzC?JoF;!j6JHfNbGj>WZPa|%723|n~jmDdzr}C$A={1g(@o)Z_ z>62<5%7(a0;rcyD8oYF4I3M*+C93~J)mukJ)wTb_Qabd|-Q5h`(%k~mHFQXdpmYu} zbO?wb4GKsqASyX@2}+34dW)cxgdqI(@xH&$yWX`}{-HQ?&e{9yeO;g0T*-w3^RhW} z35^{&fK4-RSDKZ>{p zut*ib#)6@6C-;4(n~~jFJQ8kD<<+tM^qCI=(tbl^w$D`(C4?}dHc4o-BJ`_CCkON0Drx| z26W_7-1%ls?cg?rLv>6HiQZ(v3 zB0N!UV%05Rttdk17kUf=Ts^M|Xw?=&J2ukgq4XGJ@h711O=1eMTmUqCTDO{`5*RyC zkUy0=?jpD*{blnf`1Y228}1f-Bb*9xJBK=fiU#^RBwsYOqbR|}x1 zBi#hM1wBB07wou}Fi@84+uBxR`qyz5JQ z1ME%ThV~Bx@G%U5IySK>*9fhW10=s#Mb&^iQi8I{_6Ge3zdk^bq$(Ny0cdWcr%wk< zH>(F&gJ2bBeLV14i9ZBugFD~cblVC&Rv?VwI|oX7tD-PY)SUyFDG$SoNaUvQW#Gh% zB^v2TA~N^}F_kXi5WtNsz?C-_e*Y1hi;pqwl`W^xm*1e`+GSXG77Q%YP*WSZj(0#@ zIJl$du)c94?Ejw6FSg8C{gJ*fP)0ubM()7H_?t~m*rU%M-6_#5Hvfeesuv*Im0w~3^+|#i+siRq0EtWNC83!w7co!i4n%F`3^fD-B^{QrU zryfR29kIk}f?a}Car!DyDa$Rta-+Y0F{ODb&HRegvZ9m!2v!{_JQP4E)lkKauzu$N2>@@mCOlRYyB zt>Pu>(5yCOmiz_JK^R3{T??V75@L7UoRcy%3494I-A>aRKn3Ll6euqV4T!7T^~J7B z2r?E3Cez3FJO<0iizdhPep$w$;5KE!Rd}Lp-?};hjJg3s@H64mJOv&02l1$RwH$v$ z|D?AMtwTuuNH0*4^i1PptQ(#w_P0J4>R(RfyMhPHaf@WOVKmn7e&gO^I&u5`qinE3 z$b)hJ;nOxV20Cw;h(tknjgNoF!h*lbXNbyJxz6n_tbMQfU|-TqU)d`s=aRRL3-pdo&q*UAVO+WKrG* ztkm#sKt#RMh8Iz{Iqe+J9Pb%kOm0(L6i<6den2o9Fb|ZybJ54?2!_qk(~TuizVR)1 z)QLiARE$<%Pm>nLD!AHj-IV{od38oMEbvXBh*E+xv$`Xen@EW0jk=8Th8k|?809@5 z3@JCijA8{=UoIU_SCY0t_zG)ef|mnpipO=W3}zuQ>X#MI_TIE*Hrv{%;R?nu`m~@d zH4js$=~-0URy>eg&;SCt(0$wkc4XCa!+_7xt@8AWV#8kr)MK*6uvvK9g5ROHQXPLS zmxhStFWxGU8WBozqi>M>;#uyv&o^+}-~d_-!CuUaMUoyu%1S*<7i(a;kg?Ov`F{m?Ii!Y^*G@%MO;WngFe$( zEEsOjJUSZtUcA=EFHp!A$mZlSo;H->b7=R>3VAdeuA+pT^XA^}_j1CcSs5>60_1zB z95WP;n}W1b*@}-<;_pNxqf_^p^Zuo3*|8-JFxQG0Q zh{#)|hGbKJ=OkHNf3Ne$hBki_n^PtU8d%M&O#Mn@AzA z{ip>j#E(49W*(oh*PTOjs0FSmh#d;ar~cldZT>Z4du9C>LyX9&d-m_dLl=Y-hOE3c zfN3=>n~0;hvUlHulb*Y%NJ3VwU!0_zuBe6-k?oLM!#PwNdLq$R_vK;+ z3riv;J>PNqO9CU9aQdV5QB8g4+g&MlHaSU1Qh7A4yT8xYmf~lmHi{Roaa-lV&^-b^ zuI3<%vok=MBu+?u950J?SBFgiQ+?N{n zsnVKbkk}kN*8F z=#7V~18mRqoX#u-J&4D+3sg%HE;RJ)!vfs|<^gx;qm$Z6pqL|h z=QY7=(p~l?f$cOSs|c~M1D7#UZJQA?m~29~s%q~OpqKozO8RZx59ln@ACp`|^dA*c z-|{buDEkT#p40$=_z&SScsF9HX8c5@NX%82RbGh(_qteYT~Pabi`FAJ=PkRS2}!k9 zw+VXwMxUsAs+y54iMX>|>E}@3DA&UTAE1CKJf@`=V;A(4=iUHOl_QgLo6LV@%1?^^ zKGJ8^`_^+^7V>msc-Ku*o`YH&q{%pk0xcaj-60~tnO!|+uHAb+g~x0VQF=e~l0AL( zVG_p`2zqtJBEMicxclqD#ND*jsBc();sCk=_J2oj zK)GI>%PSA<+D{&M3{}o9940C1iGjIfWa*E5T9VIf@^0H29Q$ zL4iNQrksltI|S4V((mx`xeDt`OOr<^4td|W|NB~I|NHsxLIu6;-l=26VxZv2{v0DE zPd7yvG4})rlp1B+8aXj1iQ!!ZAtPur%$=m<>#Ixh0A>1+>gS7gd?IxCwe*_gln_GZSerZM_(+@Fnn*;Trlg)Q3 z9cVg(@o8yCsL&HiIGs*qy+qgQwjr71f}7^p)N9h|B}Y*VS`up)Q|Gp!=_vDmha>y% zf?ytaVSe<99l5y1Gc`Y)#WA5$V(ZSRgPX;t0l&71FNUkbA5WP@lg>L^_0WEad_Q|E z4fmDIMa8#%3B7ALOG+dhQwrh~hfvGTEcGdPHYHu-wJliuf&uUe;NB$>um-L*Ce0~Z z0EG5M6F_LJ)H%{m26HRYC*>A)x899{!zuI5sJvUNXhT8+)H z0$ww8PnaD1ogc4|CgQ0Nfg2!ZI6`+&@8j&PqdN0qe{*q$jwvETGXbF(G2( z(mMI^X<}}HmhD`rdJJUq4otRG+Dbe)&2*~fbY$h9VZ9a^1t#5+iN5-ia?gKv^ihCt zgNNRUv0ncSES#1Pi2xIeBJ6xU?X{-7Vrd1raC>5Kb}cKMVU<}p!!z3f5>Q`tROu$6W8a)1Y;S~l@lR9Qp@&ow^b5=9vF8<`D%;$}l2{);i8dSG{ zwBcnB)^sK-LGXEC*y8m8g z9mZmPjEYXckmeK6)#Ou^wviQ_DLlWeRJ8(dm=Ic-%{s;d04XN{Z|6eW{nMN@CixF- z5i(an(Pw}v_1PqMkVVnno+?osGm(5)8FQd%MruZdUF^rp zM}iHcfG@UwcY$!ze&AIpyj{lVsm@Ovn4YHwIkc4{WM^}1y}^nbOiB00eX`i|iz$#d zKgywxlb{o5>?oK0ony$67JEj$>ncSD`ZXuDHh%nwRG}jiw*dhj5z$H5+^`n4wFjGC zxNT$j{j)iPlWK?vxc~c&DWN2pLqX&__B)6WyQjBbR+1ijDu)3c$=ST!J-Y<}p3v8GFtF%rsjKI!E$k=@D_{v;`V|PV z#mOA1b+A$cbc+}$NxL5F?*Tz^(Fb>c2un^Z{uROq39Y-Jk=1+sW0d8_-|p#89&ubT z%LUg~k*-Bbq?~RUlqxAg@x^O(H6>!EH`0r*sdSjg<8J9#1qoQepe5jD?0IsRyK&rnwcmt0(WU}8*DJGC)n zKK_k+NXA_Qo^R961kY0tH)pMYaw%1c5L_Z3iY(`6Be{8X(JJ(#z)0_@B!KIM#p-dr|nCvDLEpUEQ)r&%#!~LOZC7Yjz1ONr!PuJbz$!gXm zW`8Zs1GZp%Mn+E#9x$D-lWcXK9RcEmcBGdF?Q_~0KltbnVWl9z=d$Lv@+P8ZBns3J zB!KfU>)}kq;1N$jb-j98F0D)^^1fc2giAGuK1nZBwMhu0>2=Z0yq?sq)+Ck?ph9^^ z;+i8s-Q2DxHp$XGlDqrV({M(6ed8;37SF+5u#3HP=mqKs!l*( z3T}G@)!w9+XcIeCaOxVT{-^)v^qw-gmj(z!@*qVpINwnR`O>2DAq4s}jsP;DH`b;f zAh1Pv$4O_Wp*12fmL#hg z_tdnSy4}R zzN7IVDgQ=qC!@hFuo0Qu;uj5XFMsEY9s^`m>XuCdhuG^2^#C=$A8 z1(K$;9#7&-(P45IMs~v^{*l;yu7QhGd|BIg$Xq>#m~J_P*GpCn^$&+$58 z2C#W_31As|NcQ4b{o(sPYqy=N7EMhpE3vNQlT} z8Wo844ky;wD5q+^v(zu?B(LJGix_MqBukY!+qfYGXhs_sj>u5B1#T>1$>~Ox;0xNm z)3R}ZD~^%e&(PeO1aQ;4d`GuN^|m{Rr5Z6W2C(wu9{c@oM34E)Bx5>OaapMJbzBBd zG+ymcrS7Ya-#KMk+lc>wmzH&dyMu-9jZT5E&VKXn4@fJ&b$(3c6uRIvYDCk$3IpK0f5Ybi^x7w+0k*RE~?B(^POj_-$_&dX?OQq!~j zA(lsRH_wJp)I0C0Qf2Ema?=y9JIIc=cuc=z_aNV|iYqQZE8kVG&;^zBFqDLYt)=xNPtc)gV42)h zzsTx!_}jTdv6~?=$!+z?JwUVmVpZrd*E3veK2*l!4XAD}J4Cp4@1L^mc%fli9Ei2#ArE zzvBT&>t`NJgb}i24-1@SUy(J?@epMyy*d18sJJJ<8syEvW{u+|zm{Zo#rxIgnm!Fj0i)-?N?&0WBb+o(=^<$^f#L@4-u@*mE}H|WKv)6$vbi>irk3GQ-G;SNx;wCOVD z+ovr&ootW0W-{cFt+SBIU3iT}|2O2@95SEJZp+GPYk#?Y-Gz>S`Gv2|qfj>9LNO4h zBEOXQSfoz$srkaU4Hih{ddLM1V|dJ!#^o5Z*_4ThOzNaQHxZm|K*vN( z15U#q;QH3Woq$svZhKX%(2Gy#5&j5J2e%`J-vcC?9*AHKXDKP#`hUW_dUK7GluY~l z>&-z*i%=8`J<{+tt7>8C=1&fKx>8dK52)DVx_!Jkqj>+Q=^A}x()FSvF`mc4*=O$A zUI|x+kF$d5(|$!`;fzzorZL~Gu?@rl58%Ug&TeO|8~S&U0zHr6lPnyZWeNf^PYi)d z!@yMK-|B*kS;^c=!IOoRzjHiTrVG^QAAhjTc(sp0w7%AnzZt2!Wce>-Kp!BQb2O55 zm>7lMoUS(k+T2pP2S~6@=3S`EyndzDeTcmE`icd+SQSfW-GdKBjHIAoCmVpbf}=rb zN7jf;rKp5~Yo=3!hN8Pqnn;Hpl$@S@tj4%I{*AmzT|k=J9&+a!q>lfo8b_oOdlc}4 zH~Ha=*a_IWN25bki1=ts@n&N612p+J)2|gl$0DRla(w*+R0qgM@`0;lc*HTPHfbN| zAEJOg4G%l8MezhwM@1O|y;|X=nMO;KL2wQIX9+-j#8#VkTKMm95A@gYr@E87icKCd zq)J`iC41#LnY1aW&OPpx2Ojx{Nne+k9?Dd{#L8xm%Yr#JZ$V8#dqMr3ZP{}&wi!V! zLCH0|dik(#i4o^YzHYZ0ftGfdIdQ;pI zn`b6>dZRVqXwy8Lp57}(NZ6Q&b6K|lRllVPr_GmhCyF@F90NjZETp(vCtPTm1^y!p zFh>oI9*eU7FyFowsihby@&n7`;*{ExWu!*dm190AGEw-ax`1Y`gnLE#nurRokJD^WHb`2F;HHt!OkYO5 zeVB%uoPCyvFfZ3|F0SC>{-p;(vG1;GQAoRu)6VtZ)#OEmR5{i9sNnSZLY(o~n zXCec1ue%WSN>c>!SDP;5oxWfVgLm3asZ4i=FNuL2mZRddv)PkhBI*fP#oxB7DrMtJ zafIZ7<#(Z{@*mA%yjS{>7_xM|zV4nsa60YEotj7>7N6(|*xj}?YeI4wTkN_?6P7=#)*5m=rllP`@72R$aNv z2yvPm&Ch}7L}D+1sJXzCf_NFYMBTXcrJD~Tw(d`k(2~ux<;71H$nT4&A?^No$tRYN z{^^`=O?i;T*+kd;EceAR<~p~A^g1E-2&ASu@RH0CFzh~cf&}0Boo|b_Ks}EC=l3sh zani87f`!GpR&O2_x+2_zf@WIsh!oF()(e_f06`ekl(5>OlKTl2M{7WtB7PA6WCA0B zPZtN@7m@}rB8n1=@3cTAdqLY#Y+x!Sz+jI6`FLZR_GD&`8Xd*>9U(2ov--q{pB5MB zms1P~8E9e5^ulc}r+MX{QoJzJDf`SQmg>mQN!%od+;_-)!b5K;`F7vP;Tvk+x}ScH zL4>7&k=s!JQJe4PaF)e$RUq+%&*@(1m$B$1KQnJxpZ)MT8_Q}CPdsZ)J#|Wltxx5X zex`nh%#6kNvgOk~M?sJ?kRd}uPfY0jw?{bX5e5)rl~x~of4yKeUeWi6c)oUl+!v)34u+ zi_e5rzXk|%lc&HYAbpFrK|8+u-3;n}PB7I`G?7xLV~*s#^{VPLB$pSB3qV-wqn=}K zj~upi(*s7ZPuY}-pcrxL$lIyIc)@fnn#rk(UmWMdFh#r}Kt$b!>Pt*lOrEur&{cOK zlTAR1gk^{tm_5pzg#{6_U7cbwpAiYsUIrHMd2+ZFl_)--e(m|+y;J9)*M<$J@sZ}H zkZ&wu&7!5o61^~TC{7HOjqOJJ=d8iSAR6=~KO6c%Io=})Pt&&f93zxV%O-o@ZQMg< zZv9xir#k*$h7@$-=_C0WDe$nqPnX3psoN8f(Fx!^9pP&&a1oSkc>1{rs9WlPE;y|| zK^1cS{rG01{W6c0H?Py=4^H588WNN0?M*ibl?tJmX>V4BAO=(ie#p;<1#nFU! zyM#0pzY9>*c(mjqQwDDnv2?0dyrh5nYS>Z@W`42)*}0+s^tqh@1V%R(vWV3yE1`kl zJm!0&E%;Am@~Z!x>}2vzE#W7D%p-9xl8S9)upe3v$CK`>aiDZ4c$^Lxo!ok@-pt8% z)6Xhh=p;9(D`dAJwzlqDK#mda8huD&i6==0sht-P#PK)&drA#Py)3ORpqUeL&tz%E z(P48!%8t-#J(pvDc^ zIgP30;^*?+HCXU(tyRzufpUXnCxZmZ3flzOT;{lKmGIq-)_INY;|nw9=n&{cW36!0 z$fgaK4eav_9t8;S{J^H0;X>pg%redhGeS%wyaWntuIv0fS+WVXtes30RaEf6t7s&lv@C;4|uY zX$NXidmPwjB|NHM8q5dS&I%?Hz||>s!6TzcqBwkOMd57YSOyv$(SVku+<>g&>{Lg5 zVM7wg;w4DOPgVK3#3e9*b{FND(843&TN{juZsy${x{!#g@=$h@~Cx^ z5Qubqr?>+9*x9SvH$M$r>M#D7{A5^k3fevgM`lr2w7xUr@!b_7P8k&X1+4Ng2$uGR zS?zaHmE9pWh28nC zk@qga#Nw)dZn-zDu=jV_uuv;?ZgeIa3LkME4;?UJYIT8P0^g#v)ygA3p}*}OC`YS) z968)!4k#MB(lw>WwS;$wX1UFxXNEksfFdw1id;7VRTnk(k;0NKFv1T^+n=i`oBfV0nv_t<8SY5!Ha?jtdQ;g-30c*zgwHjmZ}r)J`1ti2$!huq^lcf} zS2SH1WJ_UHMsWa1d;hMcCUlROT!$O0v}KjS!0o|dtWCz^w8yTvd;x(vnLiaV4v99txtR-{omBRD*D0olPt)98=r#iS+%`jcOzKGk++9)h@mH!@Wi^$-9GZnRsMl+U1xsE zrz6m;ES%;&Q_#;VV1{@o@!RAYh2Jh-0qw`5W1?9u*?t*o7~5DBIBaA+DTK&9GMz6w zmj%lcGnx@5yTU7GVc5nH3ErcA+Pq&RZTP3-dlYA&8VqzB7WN+0J!%1;uP&P3V2Prx zo=0Q+wT4Re0NCr{q235JDps%K$qhLoQSU8 zrS?ZxfRuT*I|H1Rf4wEjQBD43_^*IaP8C98hDe>ZXl(ss3KKvm1etv6a|?hHHsnP< zd(KqAt;4QIeFe6-L=ctHlWx`bmZ((R)G6~Nx>Z;auk!@hE!9BXMgiG$8?H8Yr6s{)d94_dh{k(m6w5?qlORav>yaSw0 zi0!VIO&bET8#KGM8B>E~l-!E%>0EY0m`yI{;#W3nV*E&?k2*QQR9>P|IoR z;14^42$-1y#u5YO)@J08^<@i?mJdnTZ@y%g6My(E`+PCCNw(MB!1O-u(?WCrE|q(% zv+HU>ZAYxmW1LmQ%lR&_)jvxDeg7Pbi*zYSyL=C8ptX(%8b+?##K8vLr6n8Nqij2R zcdPXsqseZ_`#Gt>DVng6n@G&yw)q`c`3SEZ9=KzNyzlu`Wl_gS6^F8+~1xY$$j08n36p& zURnHl{-EU0_Qdz+%H{6VQvbc@?UCQ59eb{kx*t>&-Sif7^V&3I9{@DXeoYI#(=6}A zOkM>ogM>#WB%uPfq?mUS*2J1Z2n!rbyahAo`fHib9-yFfN=3X-`0(@I2f3RTcfLMy zv9VB+?sfpuNC~g+O_q{l_P&6mwuk3)saUspIQ1uyo*Yos-yOM|!Q<=d`>s;whl`YebFHx`)U%UjFlKZj>lle3N9FH`+MVD^&p*4$rI^)^`}Vc|Nl@ z+Oh)VXA$f8zxJgT9C7rhkmDDFw-O&dY!L=E{$Zd{?uL_t!W$qvY6UQNsE}eHgB4D$ zqzxUzd>B~0c0gf&h^&@p`H|)?0Yjy|Bycl-U}2PwDmWEni+p-mT-K%`+ZHIl64>Oq z6=d7ulKcR+M=h#Xa3BQZcQbq8v-r-kH7&e3i$m-881dBJD1E9e$ZXliv>3oTY(Mnb zE;f(;T1n-@@J7WACEKde+neeBVU35Ig0P*U2jv|kz|SfE3g|&Ccu5$O5!|_~KPu!x zVZ!QjAogU_z6IFMKz5AX7nU3P$~sg?m?$n~Ii3-HUkand3pKO}P9W&?_ZIs>R`1dG z{A9k+Z|qqKw;KWa1+r`As}xxjf(E_Fk%R0aQL#>-1 zdxnba6`8c6rz!7_?iubKY-tSXk^EHOzF!bJ4-X8zd0MxXp^O-$4bf_T^k+1q%lvprX6nu%38(TVXbSiDH%B2`DWC}aNd@k`Mv}~ z-&q6cUxmF{v>a`39DA{EGA2Be5B_JhFSDv@IICXayY%dt+1GxKC~CWAp5*3^VYm6` z3dqHPS$lR?Y%4fxP2xJHTVda4FBXZ|!i^Z+e|Cfr8i z*!2Jwu|@@Al#AMZKYmb4t1MK;i0dA@U0YFxR35i-XN{sJ*MDk72#74 zbs3<~{Gzv9C0{x!V6}OtefxwJVG&`Guwd$356`_zLuJQxaXKpAy1^dwF@SplH#}>+u6u;4Z zxhTHISHQK|d4mL@(W1n5ukoY4Gg_2)Ergq=S*Xe$9=NFq-sixvl=qyN6b+?60bH2A zmLyFMY*(#oMjB>OKHyZvAMLAtx&1vz4EshrYgi#UvvakZ`Jh6@Z`aN1h>h$`pY|dO z-fCKomvB;wXLqNE@x#GcmI@}!S?xf#dnQ){YflyK8rGmueFmyU;nk%!&y9~+(MFN9 z#ATWW^0-PRRtJL~7io*Rp~J8!Q+J~Mfv3E--fci`Jd4NVWEgMBjlgJKUl*olC@1mr ztv>Aawy5VuSO^}FBb~D5J=B$Pi?5Y&AKVR9$(Gi%%q|wAzhZfg+vyt5zF)GB%{@~} z<58W6;;2l%k&wwl0sF_H;WusyAEx|!tf(aRV{%?p67L17qt|AsBLI0)VE!J)WBNAT z<-9gvqS@XHoL2k#h#+E(>De;P`2j-tGhJ)MnF%-2H7!64D@N&7hSgcP#RsF}D`5mR z&!?gjp()FW!m3YkNjHUk-|PkXj$f?Z9;cV+EQvd&iSdCofkRh4{AJT ztA*z}vIrKnyD*83 zgN87BLu139W3B6{=4p1k&nOc_JS!3AM81DV0W(1(&a;X|`ljmac@~?#;BsQTCIu%I zIWd8idVL7JHvLkiPwwBFTnI(d_-<8)8mcM{(teiSUZbq2HhnWdi~myakQ0%=k#PI^ ztDKK&mZ*Vn0#DNqPr!bEDg8s*%_)02176W3S7xY$f{~iP|1w^sL8lO1b_C$S4UBwGZCRS?w`o|J+EvmO~DHc71U!_fRbmnoIrzdD5!${noti9nG z;LrknDCz;C0|Ts$X}UAlAqzXyHAJlRYOf*7X|4L zB?UPb$%#0H!hdrGYrHY8-Uu}8EOx&e=J9GBzWTZL_VbblZE)Mrax&vwuGJNwi6VMS z3f~Q#vYc(|VvC4ZnCFyes5 zV5-HV>tzTEAi?j;ovkM$En?&FKJVz4_*fJMzckVN*=2Vq?76GmXB`Z(3&fKVxV++- zp`J6fJ_f_6V#e;6(0y7K3rFF%$wC4 z(H|ef6tcj!&m|7ts{8MAKOBRlZc)!!Q0oDlxl(%zAhq^06!y&OWXz@7=qw-oew%pK zGG10^bYFD*r&D?!N}YE~?EI23rA1QXtjHBJ1cngR7jK3b(xVm{>b)J2dmDqU@UWu0 zoD9%Tce9`?uj>-Zp{?MT6nQhJAk_^U59A7vvRp&uOSsW)h!Gf)tB4DCPJ?^m1rb(??9pu`Slqnl9aO^#f&7piJ59k8?v z$)+8fVUC|X4dk9mO`>OJj>k(72opVISN0)WXH`%7N;m~~qEgTZciK?dz%oQ7WHLK^ zUQ9u#vx&eIt{-K5B_`_^lz5s=5vT&ofB3EP|Fi()lN$-9pAu=+hRK-G^q=_&_}FV} zpIibJTUQN9)-a;BPObcMXR%fBO6UMhR?Qhd`eKi@Mu>^!V9PP325v-KzhBLU*=wtk z7amjr1H64O9pVIERZ@YmEp^`Gjfoj{|G@eF6u&TNB2#VTb!Uqyt)#4gk{~QOdp41E zQ;9=C_cOgySoiyjQ)6e_WgNCVWKYG!_|89z##XsH==Ymmysv$sjks{YGW}SY_UQZk z6rLKWM=qRgd;V<8mNjWfiVi%^BYW_f_xH%z-rL+$ zR{gvm9cJGq|D6X38qvlwC-ACUr?k%bTrASdL6tYuS#-YXI{8nr>GF&GDBh(Lv&ngo z?wuFF2J6&1<7JbKe)@e=()4w?oF&Xl{Z%gS_JuK72l|ZiPSEB@L+4~HGObn+OjA{ z*&)1>eH~aV3%Mi?}T7}lGO5Giyh3iytbnGOg zjLcoNRq}U=zZM#~Z411`)n5G?>C8vp_d9-aAG3}%YDN%eRkSQJKA>+PIs9|@a-M-A z0`@$R#fBog$t-V}wN+!V2SzH_EE>^|7Is-rQMG@WG}6eIIJhgw8j(cjlT~)!WKsS^*Bvj*2I* zk~`g(jtuu%{iddUVAB;`7qy(_O)s<lz2aJo{^gz z$!14&#*{i>85#Cv>Cu2?BQDPJ6)-*?tT%1e!ZG77Y3eg;#>e7{cn z_`#6t`43=WAGW-s<}A1{CL@BALpw%@>AuU3u)x#(V7kfH0EVo^Pi(iVrIo$#v2`eD z^xH%XH0>$duPndCUR5h37KJs|1!A%vaA~6xTy2t@`FF}vCF@fqS1Ph14h`ClepfW@ z0n`5-Al^F&M|kC!a2Odl3x1oAE{SrovUJvW7OWR&iLRLGuZ?cPQKH;()*k$1{rZH>c#W$$sF=8d~=}o#w(l?bvN%m2lW1!z?c5o?U zRwk`57ODtHP*!#p#1$BjzOHz+j(lV=MUFH#{ytZiBO+S=-#tBT9VG=7=Y>B}I}K?0 z1vwD;z088rEg-J$Y@DC}?lZ2`Yu;Gd9f}}@!C}S709V~n1I*u%H|)?LKOeB9I(~B0 z3*rlX{+TXwvNEU`DZKV8&$8zN81yDPMeed<>u|Cn^3|VR{w)6A|8TT>1?Iq~7oYEY zL!gSJ&w{AncTWjP?jE^t!80)=hUfv1WHbN{Uh;>UJW5#>o=L0sA`e1A4{EA>r-CL25HvmrsJg zLfE!r8p;TBka=8Wx`9b+h4MH+&YlnGtc4P0r)f2w@PeW@CHA%B4N#KMZhJ9lJJ(wm zj8h9*I#O`!H-W0RM9MeP7a zX=nQb_-UbNt(055zYZJBpXH}cYNpYjg#jP$($Y&mKf6~U<|K~8G*23rQ*mzjhJ#vJ>h87~1f{Ggsu@E-6f;J^)yVOUOdSgu9E%K< zbIln=>Y7|G!}m~gg&bMsRI{LU29#iDJAFbgm*2hCj^EGappg$@QpQz(g2vZI=QZyO zJnkAOXiOl$j^`?HtzE3>;svjaI%_003Q_VB6bPmlH)hFVxmgj^ZD9n`9RLEE2^s<9 z{&%XtAp&V^CLLVp_my!+b3nl!wxqag^&CXfy$IcRCL_awt_u9{vVuv5-AD4rxM-WP zD?vgDw9lMmton-;TBHv^hDCO;wcJBNm^RuKOQ`OZHk#{wi<}7f9XP%*AwV6|k3sHQ zqKraXT{IXP0+{@f8aU@?iZ}2XH#UF}*x@&^CaTe;0d*6QuC@ z0ALnG3@34IcL$3}@_;5j$ZbjOze@&JeV_^65kKDdS&@Bh0xWil{mRAg^RKrRQkapO0*uv^R^F!C5!z4JtHA9qq@(#|G;fBE~P z!P?_93MsbSCW_4CE52v4fh!{%p{Gy%_X-x_(>|juh+n!!X3joUsJ58@`2ZHY7yN0VtNj1_txBGz_ZBvbAisnEG61q$L+bxVkfi$zL@lQ^MF8WW6p(Gm zf2+(9`!V!3XYUHgw&rU6d>Nq!*tABm}l_Y*92JVi$oBPYeBX@viuMu##%M#z2Gmu*3^mA_maL_q12qmz&-7(4XU{y0xsfb z(%TKJ2S8){Cv4@VpMy<@f7z$V^IhRS@Q1YbLQ~mez(rhkU;d1``uS;U+n zudjm(quZ;ShoMbI#FPEFvjoD9dzByAyC{2atsGZ~un*L5Kf*0>t`d`yeqC zlJgN{e(d-~oj+PRf-=1|oOeJvPM!bbLwG27vb$h}n*m|Z-(XXGV+hzY+#%pV-QsxB zF^*U_vn>%EqR5JEPEpHP4T+*I!tMc5%^E!0T@*)p6QG-(mgfLl{vzOVyur?~uYLi- zmVdXNLs16cSUrpIQy_~=Wo}deG9V}nKLq#(!cgMmNY1kjr*mK`u?v^u6wPQ@ z{j#_wyHYD(g{IOxIP2@n%nf!jDA7~M;mz_@A*r>39Ymz?;yURM%tIL=6Gf7Tl@AoW zVS)qH%+G<3?R^CuO5E*^W|ffJWbrrW9q`^A`x*i#{**LF{K$};vvGq2*x&LJA6wA6 zc8R*SVL3xX1Ltx^*Ud{XlcTr?-h-sTZ&4gplr%D=33{ zRts4fUM0VFo?FO)y+n7&f{LR-7rl0-`<0r9?B-)yHNk*cF|{NSLDf7!Tr7e9d{Zv! zV1!4YFSl@ceN%Stm*zhdPFkpJTPaEKwJzkWY_GxDa0JO*v)yvfut8}iaBVZ3rJNsu zX@1u^7-n3Zf;b@FOWE&l{{!M!I(a$jQS+&y+>Q4F8KL9&27`Vnm#fi+_o7Z}T=rlL~#rw`dQOL$pA;^+37HUggOjD@@{VpRK> zqU-_gMzvMD1d}r&R8n_-cKG!ph;!f4sT@D(%_}K7E!>uSzN{tpQiiH>#BQ~$UQRkp z>}eNSOf;+;gxb6SvB9Cb*!KPh<~njb4)|o6*|IEtrIEiq(=;FNMoP+|q^M(hz<}Yo z!HKn?Jy191+UFp*A6Y{KXyql)0&LocxE-vy@)&JDi6d#b{B!=Q<~4AmDiQ91&~=0< zv*p_?&fo)!{o1UXd0i~_A@NLGObh8cx}i&Tbs7dDrmX*DRGt7i-V6@`qAq!3y}hDY zfvlCXurk;BxQvq48x4-0ajp;dX%MG^hP#{W6o}ZmZE@a$N~H51x^FggPDhz%FviwA z|4;A7$+xXSRO@`fx~9K@s(S}Jjq#SQx_TYiOyoE}=j+&Dm>aLyIsCc2B-#FxfMp;H z`3Q`Oh_K|PM3mGE)%Q7t9C0G6%d~E@r<1d_9vNQ=Gnh)mQyNV#Z)6Rbs^u=>H)LJ*1_qf-+Ieiuh7y4C zqu#&%E+9 ztXNWVEvS+DuqWFJ_7e0IIhJqIE<_IoET0M;gt9H~b+BQed~1)-;vG!@B-KDs^KeOjrhT&jQZrwFmzy6%Eo$!_-QhM1x zE>(v7jLaB#+FlaMzd+v2@VKc?b>?7JpcUP`!;pM-G}3Y>bQp+?HX@pE$}A;vX9AWPs>bP(Oy{z4M^?(}Y%}nGbYVD6|_e||WZ6@`6e0D!{6Yp5-{=I{t(@#Jf z`9=uIAm)OCQr$|_s=2Y*KqX4JC`bPYT3&Gt9YJaECR0-Hw>p<_Ion1V`@PhG%h5DA z)0xYT){jL{j;wx0d0dZC6_a1rb6pMA<@A*%WrWb*WzXQl2q`CKJ-Hu^=XXS z3n{e);=H$=EgHI^-sk0?yT^ZPu54Vm7!*p)bFz_z9BG>?*yR?Q7c1Ad@2Q^ptWP z{=m1h02+@m8!c!HgnoFUX;a(guh`ymUYZekg1oqP=nTV$qU9k4*6(o(;(L|~!RfAL#(A=!@DzJ{E%^7}o4N%W zIQ0RLldBdDcr*96XQIA6*ZENcUz7pR<9D3%2jzk}!l(B8ipFaf^$ za5@fMi`B4-QKgUTVHLJ`u7b5($KaKIbvt<%O0KFm3InUv`TuM0+~c9n*ElX|QK3{vzKj**m$N6vjcV4gjF5lnx`+45a^L(EB>s^ftj+@KH=(bW$(l0IB=)k90 zcnog)ulLW!HFfYD`LwH)O|T75QDtU-2tYz)H~r*Y7-w~&2Ye{&e4QQZ*pPn)SvTbGJPFgh@du=r!$~rt#2)%~fUd%pY#cc`hoXN$+`dUMLqA+e*nm zZTiINy-++{G`>zox8i{ZdK~%9)o<=^y6ExiPDqHZ(_;kQ-scy0Yre0x$a*fFs#Wu z{J2r8_DK=QLIu^q-x|T%_lcJgG2B05e$L8d;<3FFo3EfiUCV7wH_9)y5ls>KFEF~k zGXheespWSIHd$be@wR#mQ!p=Tk#q1b&^BW>y6|Z{S>3Y^PCC{zUV48Rc@)-JGlAes z_V*I!z5?`2e2|d}{?$FQ5OruacE@EtIw)8_H7xCyu7EL=7hh4Jw_09dn_jgjEr`>^ z<*jNEB{B9gkwRY{w!7eYS}bQ|<;-&$KhH=> z@yLJ^=GXQYUa{LK78v02&(P85T?cP>Cg0xU@>RR#s(g2sv@d>j2ePX5cAnD;h1#~C z2Seo-!7jWvVs_F^Vgm1|rh^Y)80O~Vfz-D(O)FVZk}#MPK0PY%Twevl)W=qO8$K;h z9Qj}=Y(tQ;;IY}<|J{1+%f^0eeNi3@|DrjK(Nc@V;HUdid?mu#*zhW~JNm9gLXFx> zv2I(+SlI#fANigv`a1RYe?x{xGJY)rE+Ecit1oJTDnA#FTRm!q?i?0@jW$iLvq+P7v zP*d=8ox6E)s|yJY}u0-2Vw}q6wKX zouAPdDl5BlEz+pXi!X&Kk)M2V6u1^2!(|aL>OR#xxH^%^y@f@Py{Tu}VtxD?>rE01r1a^&9LyPEvuLdc14kK5n3 z@qc+611fB!DeiXN+0%n{c}jZXzGODPJTo)X@B_U0Q%lXG!htT1>M8o2#*pl>|Bl0H@ z&gf^VgL@{-6AT+k;S%dD8vTk1DwX}2I4l}gZMGVBRNaL$@J^n01woS|aNZA{_mE1E zJ*g%~55P{tSLQE5URtAQlY`cM0R8frAj+w4FRmG9w>o2-AD=70l&^Jt1N8~Bfn}!g z1zwAOKNN|4%f$9TvY(xnm7bxn$(bA;FH#$yc;M;iK7s5;vE^uKZG9)~guFKq@k%0* zX&%jJYQqtnMQ?>mT*w!iYQ z^fa2=Jy90fp6~PGg0{M1K0Me@N+jT#6{{7P;plk?kMPVxBFimmrq_o>zi-t(C-(KC zY;EeOnhg6RsVn<#!EmB8x&eQV8CMKnSh3&DGB4m<&s4GQ#Aw-|=8I%X-?=Zgd8ua? zmmM4|7nP%+nG2fyKCIOc133pYE%v-45-!pKg=1vT?8$KY<4@NIs`Wz(gjjd3(7V)+HH61#LMKYn|+_c1*ROGJXPmjKCbf-JoYoyTQ`^3 zpsezvvZdo&GS%^&$tp(LH#L=E$W*yy3~wSQ!&y6REf%Nx_`E4Fi17#)Z= z^V1*`Wdd6>57aCgy@z7|v~WR(Pvo&_zVP*}fXLw6BCj3#4Y0zXD}*O$T6ae)O2@V` zS1|}Po8Cw(^^enw9FJGHOTn4vjrbvsriLW*(W-WUYwIXFD z=-1kHs&#ah@iV**gI_+58Zpv*1jEQV+R7-A*C9`dlXG00Soa>-y4Bh)PC2;p#y2tA zG^U`7Cz~0od9)E>&JR#a_(GZn{4mpDiuA%iNYa>fuCa`wY*AejbDK_hNT)7r6uuam3ZQ(f9d!h&QYkCn2S?$0*9yk`8n!* z-DVwPEaZ@~%q08y{O|QqkPi9s!1R&;^5x34V{`W1PDvvT75P5f)M^-=jt>+s{ePS+Fv&vf&I>dlMh`Zw*gt@J1cX6B}PeAYTv zdU|HohUPa%R^>_KMSSE%$E@_UZ{9FBW50C6RF857{~;*Ou3%%rE-WZ~fL-vwA;E)( z1clkppJ6|7{F0{1V;2gAog#l+_L6`~F_H zR_^~wRkYGRM>KmsJIBfmuMfz^crGMbZI`{R=*6*aCC7^R%>#VjkFak!`fGS;Y2D%7 zyF*v6^!h#Tz{+ZC&|4W1CNfx%9c5j-jghhc$nk%F3aLVUGFNi^=O@kkvmo8SKbA}z z3jXV5di$ui{^t)N&je5Z=MNh9|KA(_-zxoI7aAFSQzLEBTxXtavpIPD_{-1>j9mX5 zfwUM;&vmSh{m-7q-}m&~Ci3?Lyj1n^_3f5fo}*1RsCjkyo$`sRJ2Tu_okwN$Yoh!@ zLh5WDi-lJ`+IQjkL*uEL%UQOj^!yrfemf3&XYS9~FXzNCV@(&(c}6?b6F=M3Wo2cv zM?Y_T#C`F;T8hzFZ@BsR@8p{6qJz;%@$ACFf%xTxIJK0){pO!;_TTb2$WhdYh>m94wQJYCd-t|wwX^f`Qq$7XikdbS zZWPG=6wIe?-+p_o{nQT?a|L$#&6|(BQHrtRHE+p0XfybeZ?daQYab`s9&`MS9o~KmMt3=)6ay9#+;2j6miIAgO--opP7+!CMLYDuCA+BuTHcd zyWU$Fw(3Zc_x2U`%ZoE!etvpQsixFB4?SX)a=a!S#wg<|X`8ip|JT-S+i-)c0|Ejr zy-}j_D9C3v&(42x(Ad{B%6VKK*Xr;)sl=>bRb_ti+qp1lmqX!V=KS9mTWMCVTIJVa zh3~6Nq4g;`YGq}mt^BUG<-HS+*yH_|S3cD(3lv*arMg@@&0pQe!BG_bH;c+t|Mb|st z#6~?gsEJC?$k_fTvF!WzOVV@QTb-Sq(=9qyu3Ae|`0ZPeL9|P7eZ6X6V4$45yin@Q z)YKk6KEKJyNt5}ogU0k&i^={kcN>xo`c&Qcu)H6Q>-^WUIoC4k+l+V1=PpjG=PoZf z@n6k+WGvxRbSEq8@Jx#xo3ykv_WfFtswZ}Oth1=j;UGIV_dxLKT~r93H|lBpSUF!- zsV5;?u5-a2G}TcuNBk{>^TPBX(*?i(5Eb6uR` zn;K0-yPnM$UAS=J5uZAJcvWyh*OMxJMCGxD4|Wj(S;{cbaW8GV z?}g))o_@&Ym!N)Ss7VFAfM(_QHy6zv&Dq)5*lb5yBXu%7Jl1a7ao|&39RpU_!{d}c ztMogS1pTRBKd25x;g1wKf<_PD#2R)4U_ zHmA9{*^1Y=_UQ_|w<|W|E^e1I-*UL zm)@UECQ7FzXQs7cqDIEtnN8AO&~0IC?J0kj4%}(o_HFe;w)ZzN7Y`=nowcwK)G7Ae zb?DF&?E8ls-(HzaY&&u4RM)^j8P4`x*8`dUFE7^S=jWe(a=;5WnkVU>kRT9w$maP` z_YJ%E?zQeLT#s;`m+X@r9~;}n!Epx}?ZS(bn<&{iIo7L{;?&dhKiyh!>Fp)2i?L^u zEIN(`^ItW3pKvjj28$!o_^qiaeE;RQo9XECvmGW>6R+jlROKV!nGP6k#>;_H1?6{wfio=-PV$6!?|ytCvM{da(9>GaAV3~rbncvqN*yRU7L$oR8&-i zj9V1ygk^v2Gh;KYhts(~kY3_t|5h`f!){BGIgV4$apfdMK76=&IK7MJiKwXpK4Bzp z+4UJsot0H?k+7(!Xh~*&zah=eL&sB$eo#nB^0lGyxGQ2%ooF+tOwX(O&^XkVZ+?16 z2P;aF*%^q_~yp&#*A!@aidRr;VS z&qA|yY-}t&E9)XscyCpB$l$}X=H})n{dSzNw-+BC9)1}cn|v*QWw3x&HQwSo#7n>N z#i<9Rsvpt!yb`0ZUDI)3&)2VCRa1<%Q%FiID7cF#ocMBzEg&?MRQ3LrEU^bt(~N!9 zkri}N-Nh!Nz(4s9WR~QNjP?&Tro7O~b3M{4Y0T!fAe6WCXK+)VR|_}&Hj;9h)-8Rw3xBANkT`b!{AMiX=bD-a>$h@IR6Zv*-(_vea)FZzgN8%Pzmm}?3 z%Me9=6LxEotIsFVz0Jn36{P)tMX%0;*QXdWAR+ETW+;EmV?B~H(`h08!JT1FJGsHr+nZzmes4qzt9|>5 zL$<$56SWHrTeBt1bLaH^DMbxguTh@ssNF~~ah;7QjZq9?ly(+JZRg_TygSxa@-5HJ zjbAgn6y+l9MFdjbP*Yk7aaoFwz1 zv^HFx=zF!44LE2dRGpnAzr8vmQms=HC50N)xQ=DKprph@Mbm)_v6H*>$N2e+7ZSF= z837!ge`*+8vkH+L_T8 zRgoHLy{sdZ3?ZZM`(DIW;_7ZyrZKfzmh7ZV4%R)uj$4g&o_L}0^UvPBdqogQ zCWDbX4jLUV@!y%$U_!oq_1d);Q;aVEnH*U4DM_c~R^=`|tQmn@jht`U3lt-*KVAlA zETulp=JZ?0ac1~Tf@Y3A;3CQST5gL6edzhhg;)e-GVMnE3p(0yVIsqEk%#TZ0VTUe zMre;r^j6K`i*8r$dVTCZ^@?jKp0o4w)_sw7Ry9&H?L9q@hn6b&s4L7J?Ck7L`m=b2 zhcmOGFG$_|%|vvfCqzpLpk36Y{s;nVJq?Y1XQ3BzSY`ci_2H4#!pBljratJD_-iD{ zYR=Gi=Pfp+7<=GUi|AKg>-g+`ME~47fOo69t9C1DQ5TNR4c#1Sd^|d8p`4&ug^0F} zNW-gXWflY{`f9{}Zhx6$-jm_!Ihe6@dyzmQtES`z6JL}|06oXa{tK_?ZKtW{Q8g1X z{6w-*D0Jg(csy%s&vVviG-g=$kvQ^t@F3Q*t9bU$AAR-cfPfVmVd>0IarCpt%Xv_I zfBlS89QYbD*Bx}um!10QxoGL)TxS=TftD=0)J3j6dsc+qKH{}yPydg1D)CdyD9yH6 zkyC?p-x9QBxK4+DnjPzUqm?HOAa-!&T7#z+oD+5uF|S?)MnsrYYV~SNm+g(NjZ+uH zSy4o@@Id;{KC(|WGRxVP3kz>iRoBw8R?=U0cXuCaze~G?fuRI-En|K-%dhn)HomB? zE@Tt4XldxF!(@wO!tLaI__0_nz@t!vPf zRXsWQ;<(oq z0O@uMagsx&rCCc^_}6RH75w?}>Rhxx!Y|ronh7`6jg>~#M|A^ieuaEM;`Z0~H!MM~ zqb01@u&dXTqD4TI2b-&5rQ4-=4GH#S6{Tot7yIsjQ{oQeyHPfE_=3kwULK0YF?y$y-l$No$YDW;jV ztfQqhK!J=vXQwr9C(dH;=-4?hAg`dXVdtTn*Xk3sU&h3Yjkqm`qsZXgFp^>-*5-Wd zopPL(iWgEUoZi}dgX$y3-+#yQz}bi58P^F6dBN;um0pTl2fwN zu2~j6uK)Z}0&oDpGDydEEFx(hNPYYC=?G~{ViX>G`ugh5j&_g_{Qmv>%9NR@2p>;5 zSMGnvIm-*ke!vNLaCJZ9uT}tJlag2RfNd`-5uqS*q$@iLJglWo8Jv6m-rOmh&Y(Kt86f;g!7tB_ttF5S ziL|(c&8-rRYeSOG+QYWLN%A5eC5dE~J=YsP*SH*iHOsIml@AQS&h_ippM3C+d}x2| zE`L_3aulfak=*%N@HM03wsMwQ;cum8+;f9fE#i3C$3-Tz@BmBEiWC$>VPB&lD)g;!n31P zX#N6*;sP96)X|;1Wl<-+aZOz_^W<4qTzf^O+%vQttOL3V>2_c`1_~FbGOIeA;Ek!Y4|!D zg^VbWxA2)9v>Yd~!*;`!qF(msQ#La2ALwPsq61*n1xmQ*;lZpOfpmoiAU$2&_IG_g zgO+o^U}DwPEZYtXae}e2qy-ffpx&sF+RVOBJXX={C}PlhiDHDrF@fGq*lo#~^O2Xo zKh{c!6e!8*dL06hQ17~`?%>qQ&Be*5Mp$cv5<(ME#&klpZU07RUAbQR3nXJom4ETa{EqnUH) z^4m+#kna|dyq!n$*A_D$H5Fwx&zYjfx=>vk{26!icYOfhUoX>Vuv(A4#h&~2K~E8+ zk8M`Yk)Ewvw%DT+*r%S#ixWr=*X*o4n8Q-M!`FBL#S06Oj@l-#sHlU?33yf_?g0u? z*rZ+%#q52Sb| z0N#bg#j){m4lb@ro_TWM zncMObmC?wZD8z?sD44Z`mc5#Ucr-Ic&OtT37^imd=+UFT8G-1F<F%%9oukrDQ5*RFh7i^O@vNx4Xd>h^G+3}%UGEZd%fBS^3xKQA z$h^s2vn#FIp#kKWYMR+j;DIhQIv~z2BvAqXoL=sK@c;>gLrSV8^ucenCkJkPK0K0L zfW*ouW~OnwI+h*P(btJ-ysh;}F8HmN?0+dC&+dz5fqUdnpU#eV_-b|u-7I=GLC1V? z78)J0AJwlpytr3F7{#(op(jhIq9-fY%Ya;(Qd9fd)Yb0#hz;i5-7qNto892L zG-m)PDU0U!jYw6@yLR11ypJ`R=h1E5da+&1WNGJ439EZci}T-7P1T=>nV&^l z3qq=}xR~T}lmY}uE_YAlgxyX_`^4HBo&={s{f~JQLvMi*a)%v#JQsGpG5Ciq_mtyD z60IrnVenf&812x@lzDUDsIG3eR_^Vok?WuDtv_Je_z1bp0+izOcz@8+FQWco135TU zZqz64Lfgdo-#znrQ1j@_Y}Hq5Ka_CDE7Mil%*DZf>MxbyS$g?wl%zaLHrQ5@he4hx z<+-{j$EjWZewpV$wOFCIXZjB73o3urvzO^!K0aMZC9FCX!F;N5%7}>-ssNF6bx_C5 z9u-wo7~j00a`c~5Vy^t|F~JR3ryFv?3#J;`_5nc1K@T4u0j8QoyW!>Sz5kbymuKmw zudDx%^|ty(MMafl_=Q7ywtZFZ!gvL_JrIL}n}W6>dIKcqW@kqUTn283R3IEi8J(Wy zuQXbW^J5aZ@3uVOcH-(LyfEa&-&TJ7JF*^v>?9&R;azq^#9YnUcb7-ZS0WalgZ)6N zN_zbcU)*W+H{Rr;_N&BG-}3M%v3YEFUmF|ft{nThcVy%o0kfJWVi$YL9}9(@#*t_V z?8^9{-Vh(pd*Hw$NEO?Osxp3J+4wBE`*EbmJrrQO_;=Yw*H?JkG1{V|5xUub{%nMJ zKCr#>#RomvQCvamArtUxq+48k&{uAzm$memaBXPtjK05?{qgp){JC>|sNlNzS{7;N z^wM9KRfj<^0pK^}x*SG8^8EVc>AA4yFC82h+unYS!s0*ZG!uwALn$jO`{(+pe@FB= zibxa)f}wZ4=s)&p747D2+X}&RnwKvv^W%GaQJF=oy5$d4qm3)4LxE8CE@5FS(@Hf0wzN+B|+{*UU(*Nad9h@B`37NUcV4 ztv3-R%=mR3osC1P)z`SBq#^+W=o?*=$45t>f}7n?V5Xhb+dB{&EqW)hyIU9PNc{-6@REHD{EiMZ$&D)ZeoX~8(Vn!^|LZR&6)){ z+&`Ksz}M#QUE9P?G{mdCyOPX>!op4=bTZo1-_03YOR0~lyjLZx?i|uvKQb&@ydI>4 zoEuZzr*WVN8IFt_g*tp8&Fm_L)pfSRqzM$LH_n0e!tB`d*RMR~;{S8S5nKDr8$R@8 zmWS-Su=18-2>*7qNV7{w!c3wjs{TD7EWqn~hlVmDo0I?@Zd|MvbCk--&L$*MM@Pr^ z_g8{&&7_`_CQv6Fn3#eN!0FrPM96-%Xh)5HzApn9M3<(Gyt*(}!d91(hsN#;7$dC6 zNjbT7*tFA;haRJY>UCnntzQW{%@yS|EODA^D{6Tk2=Eby13#mwe{dga^DDRKj6 z>VLed%~LtOL+}~}L|tW)B#;|=;AE#6v+0qxnrOErhn6XnE?#g5EGfoygwjI)oNQ|% zl4J58FTju*DByUfXbz62eI(NCMR#Am3U+v1{LNZ zIMc4azLF>@r%(|C8f1ZGU(*Qf`V`0eDP}ECR;*fc9)}U)hf@TSK;kb*d=>7c$)*etv(fI|bOk2J{ppA?2vL zw>aXGfBIhl*6E0bqX*tdSP=jAH|WU;XN^lF#TmSvUz8ORP{oA!6{^*%M{C@cfQkW`J7&0IQ`12gFthkdakODlQ+GwfZ%Y<^aJ6 zEAKGTn*>%@$3G)G{xX201NL+M#*HGae+-iw(r*rIfx1MMezdMF9t#G_;9HK9-JQF4 z(cfJkY0Uu@=nY`;&jMo1^@MEaMc;6Q=8O0CSwB9>D@h)xi`72Sb z5MJd2DMQa`)}-+xH+0w4?SNYntkQSy+zCBovmgC}uCDGw6c?0t2ar{a2MiwytsYX- z4lTN_4fXD$(T@$KEJ~OESGN111lt#MwB;ZcO;*dxER3##bW&!?dNuPV!QF)>qCo)x zvcO7+RRb_tfIC0y`9(#8T^Ii_wV~fuKriSg@oGr{UmGT*9DE-rvK!@BsLL`(`e z#hP!Hh6rI2Gh+eEB3N$o>$?}Aar?l)`cD816Ozixh{flqla%A9P9;N6NrezFsA2Nv z&6`h;H4VvudWm#^?+%u*?q#f~(iaiPncRXzvQqf&M*wJ)1JWuIo+xP=3@nq1K$kU?GHiX)4YDi8=fki1oWQ0munx zfvSwsPnvd}@$NF9UDA_4I&VlbXCut&-g8keO&UIs&j*_mitiw$W-*Vo0_z}8NHZJ7Y>Nj9$Ie|0+SGd4e|X^2-VHv-hOp#5mOG0l2wnhv!2-CCNl z5DL)n-1=dp_w}Xxd)1_sL1l&TPrL?|h#L00DeVC=TP>J!x20K1Oe9|bjySF-~%QMyOO9z{7j?uoK;J-J~PC55z15He0CM1f{n5w_LJ!`>{wxxop`Vnt<~ZRlzQhD1X_<$YtU zxyr!4V_{w`3Vi~0nGg`57YGA|Ycr~gKjY|l2*?5O?i)Df&dyHzUvFZekF7;j)g#C0 zS1m+ZNj0u4h)IO8Mg=C_Icb#g?@&Q7<39Bu0=10YTD%z=0)+bZv^Li+s4!IRUVEb` z1jL~PCPRdRXk|EgD08Cv@a;d{Xb&v(7k6nBA?9r;*&|V>srwcU& zASwuIfUs%f0j_gVCf_?wcE?_=iI$=L^!$WRsHo`<(eO>TkW>T>s#&l$C%~cHK%LEf zFqpj@nctUU@8m>|Q6#Y!8(ODifW`UAe>cma?R2?J?^14sef&V8DlPfXp=BM}ax*sia(`2FoF z==s>a_gZ;TC?0xFo~>DS0?;tl3OfEqBHPpCtN}^{w2w4p0o-mE+w$yM6mBeblYKk9 zR+2CyoD2gt{sw(XV{d#-X({CcEzfF3Vcm6KzI-9f10=q$>6SXA8e^U2X7ZLzO$?G7 z2oI3~vkQuBA?}TI?+uOx#0>`9Rgzu>J?OI=5Y4gFm2vX%1Lz9~H%Le&1n+q5G1{^5 z3V{g_KofYg2V4aRXx|A&U_G4E1$>Pjx>EGyjlkuGhWk(hKLU6`vuvSV1~HPmEhr32tA|&Jh0_ z5GpzbMuF_nmE<23%1Y%D6n^crrm=|$kzfZWr*G)%B&DQ)aYaCttszR$E`S=md-Ikp zN5T9tiG` z?nc632JMGKPSd;(T|#x?-GEHf4mzn9dLo^gA_F;EEg&X@hu^Ene&(t zFJ~SJaJZlSOUb}l#ZN(2JPBY4x>=0%E13DK6xcdSLWOi@OJtU`Cm*h-re00BR+E;@ zsVDPx(v?3UKLKbk_C(V5LAB@|?I_3yZb{T$MRWx~(+Zo=MjQiTdBfX?*@WmR22l?8 zZ{4C`@!<%AX3C1B2#y@(qZ5Fbu#5|EJQTbBwmnR`&)vIM%gD%}c#{kQ7Nj_QUu1#Q zs#U8bZuW1+CmcUgI84&-U`&S%~G7H;Zc4scz>x!#kJ7}>FVa-Pd~TCL9GMktr0-z9Z*oQzo28f(0&k0 zNu6_0S4#F+F*DJefq8_`69YIyj@Sa4>+?V2W;s#3aDg8l^IXk5Fh4U=0=Elv7w{yX zzq~l*H}8g+r24a|CpIU(PrCHbwm%3Q$^pY#3PcMSR~ZpAH*VYj`rLU7Ooum=hH>Da zWXrCT#6g2Rm@yciMa~u$nNXk&nzkT#F13p?(3Sc8Pgc(RCpvMjA4V}KLC^>TA3pp9 z^jwOJ@7KBqZn9nM?6<(Se?Slt0R#wW7D~c+#BND$ZZBN%^%OO*cAY4Xkb(p;w(oaX?B1DJpEE!oD zU=c7h%{Fycal^NOz?pMmC|Jl7criK2NF#gDlz`zE!JF8VLoTDP5+#CA>hywFhp<-2 zyM^nv=g##qqdpo?3n?lnbmE?%{~B!U8Ar7;gk_It1gNfPf85c230kxtd8?8@qnkT0 z0?FJoV?dUEQL3oFY@}e}*pWqtUIcWKyeY0SA-nOQkWfII z+j1n%A(74yt8Xs7*@82yk9q>Yn(;|C)H<&sM4&`JxdTKbcxCi09;M7ai0K-Lj#4iUzH2#O(*Y?x#|^W^WbZ=n*M!-@FWO#yJpL^OG`@&(@o|ib32a}F%+LK#}z|=E`i}@JlpR0 z@eSo<%A(Xsgv?A>Qh}I*bwWu=X}sAMSa0%oL(si@t91fLaN@Rrd_@0$2B~QMrcFH% z(uqob0ALxym(Dt1WIoa@!$v`*UGVJ|@DhP3xB<_mY2!z7?2&86U{C82UqY%Q)B-y8 zva#UuY_h-+5fNRxvVaPZvLhh^Be55eei*RI_}&eGDuDhSQqB6+5yTN$R$BTLHRhw? zmpef47jm5)2+xB+;i}bs1e-&!n{{Azps--l}KQ^1Ulpi zB6j;e&yDNW337$cjE;WN6}~#5$=#oliIht;GejQo2!IPj9mZ$qf>Cx}n(IRW-!`hC zSN`s*^}DQsj#BzZtqOqDdyoSm>2ED%aSVm!qDxw!)Vv=`#azYoe$V%Su^{}A6L&yf zMQNDB&Mbc@dEH==tIrHQ9cz`qv#<#)@3|FIlT>&ZR+~*jdy<-6@B|Q@nnTEOfHO4jt9{5R;5%^ z(D`UHVe9*#)v5iMCooR=t zi5%?mC@J~6!j=FKL|R2RYwcqFl;>N@{!jqlQS|CUR^6q}rfxZTyXfdtV*YXj-cm3a z;{!@@QW6_XW@l#;O&Wy%TYrd>d-ez5lWZ8+j1yP4(*-mIX1wNMCwfI-2rO8*QG2Z9 zc1WDSXcWhah~{9B{IbZMQ04f3z4i2L4*r+pO-eIwlco%3^syrORYCNl{RDc?`-2*X zSP^Qzg`M4AbSXrVuu@n0JD*Y1ij^V#J&NG>*B9=Btsve$(272pMjY<&pxOYse*XL! zgBKheX?v=e{u%3VW5!LBCTlenm5}44Ar3keoh=#MB*~y(wY0SSdo%ujBjle$%d~@w zo7@-q;Xn4TL_`D_>c9E|`F*GGzgU>`$rb1S9U}Svy}|fj$;g{FsO-_ug9el8>7AuX zylKMKL-DN!KSwfLs%xfcJPKxAZ8CV8Vs(Uia+iM96bqY#p0Vuuo$jTeQ27KY%7|zX=_+r zvwj-W;BOipTMvm6p`A3Rf@`KLOmFtsi?gWw8nL)mqt-gdRPy+nmAG8W6~C@SEdIPx zf_iW4dfP-j3hJxHODg7VTX|^KzHExC_uH?R_1vL6G3%M@YOF5p-*uQHkQ;asV(}WB z?fjOOmUXW0m3eT;2n7QY86Ere)vHz3u7$!g-?P`sAaPY#e!xWj;;+#Xru|oV=_~cE z{bf`HU>j_>^S*g`O>#p<X{@%n~!>OO`GHE?D9-Qj+Zc~nZea0?%hni{Euiu4!7kwTu zq3!%*r~M!S!IQiG8Q2Sc=3$?MkK7Vb&Noiyogk{1#u3md#65q|==)P-)Y-YY?KY3i z!c20U)4vv!Fm+0>btg!EZxRZcJO7({8AWQGI8jZh2=aaJZ@ewUvH=zbh6w9;l^TAnh>P26TwJFJl7( zqP$yz?}yl}&(2vCcW`Fo+N#P&pDx*4>70?KtWUXi&{6LS@6U?C%1}OKUVR>VpY8k! z6&fSWngt)nIgJyx&G)bh*k;C8_}e({%8EX%VE(XclTe^-|~2mWW^zkpC-K4?VqgXmTbH0 zqp#fd*I@7%YpN<0rWO?m%@ghxok(sm%W6I>plE1rcfU8aqRC*+&w%NuNm`R{wB^qu ztyk8T^mK)?R4)rz^tf#i=cip&O}!W?)$(EHUb2>SR7*#@70v0GavO05H*c`p+QL~n zqFG%aW)mQBKq#=cx9?8p0tZe;g&lgJaz*C)Ggc5 z`4RPoEaO#cXBNE6)|dsGL^_xq@?qjNyOyN8WNE$1XZw5Qjmqy1)4w~c{Ek`QXZyP! zoD<0nfpaaL_sgyq8(HSD#D@u~Hz%q!3##*m91}~c++1)y-^jAyx@Cc`s6l)d%h#~V zu-o^Gm}R^RF#-+V4;z{=22R7Xf% z*oj8A*D+{9Rpq|Jp#pj;J~x4eRj0DPd>bi$D0MOQh)7zyuyuwAby8QN*1-CHi+cW$ z6y|60`sXbjX2TY(EW-AjFQb-?zqhmc*&W@6G~`5TWq}YeiFjV@(^s=cIZEaR8SkGN z^$Leu^7&eSXrgST$&yl}RdniYz7aAwB5BS-^Lv`QD^sGTAlOE$;g{Z859{<7d=t(5 z=Fusw(-ngevVqB)e%mtpo0wYlI47_i?y}1HE$-oFC1G98qBbDu#$VS{ZrA7N5m`|n zoNV*!CX?vlm%2xc*6faP(6*!{VtO-F7cdkL5b*ju&bw zdaFlsYI=yppQj?3-`Zl&_fG*XZdWRhkYbwHg${}^Dprj?M=L(AC?kZ!!Z? zbL^+Oc|c&G(!G@J|CvjwcnhEp#c8*=IAd0e*=f)0o;oenoZp<&i>#3e=izqfR+dl8 zci%QEvS)MFsx{P%pEw^#-udxl&NUkigCMFeLib|f!R_3+|1N_O*fxA(<#cM|P?KxN z{4!W4sd?{2ebiA0#j0CAZytvJQnYxih6y;~rt{0B8wRGLx8ytFz1IiRm;KM<@1g#d z#@$?AoSA^z3$_Mo54*0UcB#}pJoxKDw| zK;1f2{T&2+}-G`RoS&auN{n{#Zo zQXp-BucF5Vd$0XxMXZ{fKW7@?=N@sy`;m>)7S2Dn9BJm92a?GrQIw;|;~yZF z5l84bIOZs>-hX@*u zNs#UdFU;wZH}D%Z%oiI>(QN%Y=9`w`G@P;a79X?9!%)@2$GAW4m3d~Ky_EwmC@_t^ zGUVY@qW)*zJ)kKVbG6`gDZFZ(C?uiyj++<$F25Hz;vhfuxx-n zRvDJg5$_Atgsw5!IC3llmHmY3)_~{#u9!Od1*-PRGR_kkh@^n$DNcR1UDnY3yc4-N zPMrG(W;Uk+PEk^(8yo)P1*m6EPVzKH&?tS}BJimpy?{b=@e}Gy0UUqjJu^kLnCS3V zCF&J~oX}tW^XIKIW>?kcCV+f4NkL*BQo4IZp$9~$yQ ze?wPy@@4#h+tAr(&XBZBMlY9=PRyLwxL!Wpg3RZHY? z0K2ch1rcS{DUNk_*w?uiGz8^;t=s>&{8qraJKA2lq3q<>Cj#BwsVDCqK2vNi zjOqCqCGsgZg+)@_7!-qfZ?wy;&bK%&e470B9!FVaCH1YzkGubKO{a>xyl=FaoRQt< z|6i|p1AUaj$P~sXz6D<_yHB#)ii$FlJ>jptif;9)EoFk_x0}6ptE;P1Dl6ltS-k%F ze%1}{bQE;)2Q7BrxhBrR#6|AzXaGE1D~?pQ4F2cJ9~7Rlq!8aZK3$OIzwWNQvU2qi zZCzblF1g#$hcZi9p-=WJtJ8Z6{MU=V?kVu~d-R`AqRlwEyI{2}`G;I);LS3@u%nmm zuP4jle>8qED>N|h`u}?S@$d+UatkNEGcP>WmhsZ{RYPdvp{_iDxQ z@R$GN1xgsCpcEHh*Z*hl`uq16U?OT07J$)T?(Y|$-#yT{yXW5*$lWYUeEIU9#lFw^ z&pw%x0hu?K-vvJ_s73iHh7nv)l%7v_t_t2G&=Smte6OE-@r81(b#f!Q4~lS@=q7gk z`|FFs)Z<}*;~-EYu{Yld(7im2_~BXLEDFi&HB%K zv!Kz1G+@v#=$-TaJ?|0fS_Tpav1Pi#N3c{y;iccZZ~OUeLMe{{9YVx%hz-Ag|33fb zl7v}waPUdk1mPTly&({zSV;QmwnIBq5;S|@?*^rp+u^h;djs61WQYM00sw9gxS9Jj zZ&Zo)44R%8C^T{$f7Et#Z_Lo}4-31JJN)hQ=R1(S#?hW9!4{&?ra5zRUtZUij}Ow6 z-W=x-QC!c|QRSq>#3eodPw-QMVv7x5#l|x8Zu5V};!;m7@(y*}a-rb!tQqpviE9e5eOG^-s#R9jz$3}zT)gfj; z39Hof0A^e+ed3lv7raC*7_E=%MW!xq@bK>QtUeg#!_oIhT$@9L8T<*4#*x}ck zvPHY7$0mk-Kr>eF-*Bc}<3$itJay}>F>dCL2)Kwjvp%yIUkp9{y*c)9dwqPlJ8jDe~2WrR1$5X(=J;IX($Qy|!)tn(B z9OjF5L6Jc%H8mCU>eLJj4A2%d+Q)V%fU+8$nd!rm37YfV@;>>)e8o+99~ZarH>3HJ zqt8lbcEw~)=<4Y`j%^wY)V^+Sv?L-d>^QVr$I{`d!&W3eVJ6ApC)>!mxn6O6u6xz< zg{7y;n_IcC)1inTn7f~ozIJx@nweRYX?WpU+H{+q4I$?u*n4}=TsLoXy^$4h?2S@k zYvvvobNw4$VKIApfBt;U%O{kaT3lXD!*lA?`<*+JEN>Qm{;6z^abJ4ynVo}!J||yv zfMIXWaSA~hSz4Mm$AsNOnZ3^*lDR$ zcoWfBhTHOLK!o1j%O{@MUD#xT5u4EPa1n>`Zj)mNZQ@)(#Mzq(n*bw%TYM548Y;O{ z>)HAC&d!zRUp8Lw^YtB<8tCrrT_YLh^GH2&S}uUP!fkHMo*|}g`!R=1DJAXIVV$ci zNY)M&xqM}1g{H+Q)+D_I{=W zZrvhxR*rqTIG*^(?{uN;CtD%@=Ox#(_IRo4M z9G)W5+Ajno7_%WPHb^@-I2gmu20Uy_U_>qL>|#M@zt_kJ1h0I9{t`L5@JjOY^W&~L zgUZA)Dg=4d+1jrEAPxci6NzbQ28|zYz-o7PdawAhO9wsP+&O<~TZL|@(wmn^yUz8Q2S+lq4CY;e)v9FH(r&?Ao|wQ@ z$F4EGmoaoM6I@@!%#GYOvrrqheYXo24}fbwNVM1+LOzI6?CbsYmg>ivDtdzVxswUhq6 z*nfb7BG;?Nu^rF%pWZj@eOb8j=g;7Cj?-jm_F0EE+06X0S(3QvxzU3rKy#e{P4b5i zvp0HA8_msMOfyxlG&M;~P1T2rK}>Yu{#UY@Xx6TwW%WJ!>>9kb2h5t&KRu|6J;xRi z83|8kQGWhy_>GZ3kxPode%<1J^tRHQO64yTkby+-xD)7KZ)Yapp#_^P3oS||UZVq4 z`|BUSBunbB1jOVIZ7$t)@eo=9G7kf(x5r3kgL~)WPD9K>f{@U~UZ7tV$Wo4yRB(;c`m_ci{Lj%2L*+|{vP6aOdMi#yii;wp=jqqbEYz|{#O!WG_y4a9cP{%Hj_ z6a9`IZ|j!CY<^wJd3+V3v^=us4U8mV=&JW;SFo<4qM}-=3Fam?Vw?b##{=SLqh|zCo{$hP`r`cbfL32Ue?|J*c*?tVQHhz$jJBt zI|hm#MuZh+#wlA*^q#?O72=p^9d_UfsUTc0(g9#hlHG_VX6P#6 zGMh>j5fR}e&&F_(97%GR9o4>_7r#x+QKaDCzT-TjUbG+Ix}pmK=kDX|`^hfOUtD_g z^XRR~N8750TPnhGoV;pud;*?bmA3J&h&_9u{96$1+D)H}8<^IvT}!5-h|e8*duwBU zeWtFeY>~N{SvA^RISiHIfkSX-v(<97K{_vhMV(9$+|p!@Ir(B2JnPt25lq%jEwZ)gW&{fC?5MAmNIht#5mHF58_47}ydD_u2t`IvY)Ub2W0jG~ zV`!~G?%{q$)u<4K7ZY43Va+ARmbUy8Di8!r1uu@PD|t9LRvr<^?-&^HLa-vhNM67M zMrBnMV*CX}M~pra3!)NaO)&9DCnsNg+04M;;pMgd?Af!hVA3`OO2gutkNH8PJ4ufxjgtB|RfKaK}Lfg&j=|4MI5U zH&*yRdbAC4m^;Rn;Xs3P(F<0TEz`4iY4I=xZi#x3Dy^{6ka-leYL?hgLBWUk%p{nt zxcz~yh(Uf}9+Oq09Ug4LC;>SNCq+b(S+<%BIGMoo^d`;4H8+0SDaW|se|zim`%_j; zYQ-iW-RymbBb+)pG4a|cp5tQl?c_)w?Qm;P<#0;`9z0Z8d3x1}kUTSYkL2s!a;@e~ z!E0JFR}eHr9xZVGe62N){RWXAT^n*2%y?Frx|hMy0D+E3@=7P@*e?f6{`%nq`Iea3 zaQo{vZ7KqxfbI+^z6ui%w@$v$MiT#OdQnM9Q;kl~$fz7J#Sgpzd|ch&$@ju!fYkaG z?Xj>&7^+A$YuVo-y?ggP7>Sr8nu8U2C4k&0-EI zq}P&r8?JC%k(ZB;1TLvF<}kbJ zVFJCrzFrVX^3wk8q%*{Br)Os3VFstrH&7NEv@?SnU}%t4=!a3l6Cx+_8iMr|7$?m5 zLea0pnvl_M)Pu?>sc`tl0z*SfF?ai%;oUIHuWCQEuE>3kUg_A$i*We^Ab-krnGeMf zeQs_p41s~NE!~vJAHE~?PE%xI4K0`PK;m_j01B`HU#7Y9)nDNlfeMGuv7Nfa^N7rDq$Pz5T zy__7WXy@_u)FaJ}ti9ch;<}8p(JQ2)TdOW|&tXvp=Z)1@KJ0l(>}H(NfcTs@;7?gp+d> zAQSjZ@-P^qlqbX^fMXBlV>?F25C=uY#rMHsC21F|p~P!s9EH30HKxFx#<_ltG(er9 zRAc?Rgo1*C!r(Ep%7}m$z-p-R;E}8yTKHHBY0NN{;wXQ-#rGXxUuS#!r*krk_mFte zg7=}Tfc|$6ZM!vmI>fpJ!>11(58yQYdzYZ#`Nnf7trSz?IE2&!Dy-vJ&p{?-%vvIJ zi_rp+shJ&q_hEt}73$vltrXJ}4?R3Q9vvsDN!6x|j`SwhKND{bgOv5O6B*C$)x|-&QxfzRLlUZa$1OU=!__4rd*2z|_wWG0!8ow>T#6c*a-9QsQ%$-~1?=06r$ZtCU%(?1 z@eskiLj_=ZFtJ=vXZW32mloPJzWdB8`K~FnD-XA3l-G&K zh}{&w!!GF&kQ55`@%-u_?Hs4crz&}_UuVX?d|_$&;BIX`Kpoed>C&@-XVpr>?{UmF zjj2>mQ4StqIuORifvRi!D{q$FU2qME2X4leor+W5`tM*hN(>Sxg`gxvnlSw7Z;H5M z-}**$mY0^6rkcX`WqI?aF75|euNGMsBll!vAMJo+lUY;hnJ26Cjo)1zpLKY5rT6}6 zt}d8l(QVhFJ2?{mksA-(!;sK3@L?<%p=Wcg%^f?ds0jDuo|5gmY|5yvey09-*%{XL z4vfcifh*kiSOFCuRrGkAGHD!0;z7v<1TAiAVn#t7kRB8l7Z=2Yr?7~~94Z1q2PoBW z@X4)b$l2Hwi_Wg2zrS>OX-0;dZp|nJ5&6d#(N2@GA7r;*k<7P1o*|8Kwg`Yp1TRP) zTLF}SX~FF&YG;s?$g@ZAh={M!C?k{fO#QIpBKQ1Mq!|c|%lyHt^*G+e8oJ=uSi24G zcMyHR2=(y5gT07>1OYQM6+W1B_{bTSwzgdC>_-|y)Z+9phv4XSY3tUlIibiM50D`N z;*>Z}0l329E#E|BE5wrgv3VQIfk3^drgYz>@10Hy{2wK_<9Ud6?BAnb=r z^wkq83>DS}G+;i4-bI z8Ii1#h{(vuEHjZkij0ORvxtnOvUkZ=b_pReva?tA%KqK2*XRAc-F|=c8pQK4uIpUq zoclOXC=zleIKIcg*nFUqIE;)dDs?B5@MUG?Jy4RT%dpDaKlJ9N12-Q=+NdYpd9C=pyg~4u${V^XyG}cAqOf5<(>EM_zkYK1UFTC3 z3hx8gLw*M@i=`ae!^SQ%dY>O%am439YR&w6+;oYm8`D+RdypHH&j_YFy2)kXN!&=& zZ85zK-wp7VcY%C|Z~-eF9@~4T4E6LLNk*327yTU`mQhw#enT|^`ROADUZcxfVvsVd zYvE_rt^_mdezb&#d1m0JPt%;EVkl7%D2I|on^6eM%F13Za1lZ8OFUYMxZXOrX31yPC$+BJ}t3OTQ&0CF{VLZEJ5Q z5_>S!o83PrHkf<~ek1A!QRrDgL2hj9I9@;atAOIozC<30e zZQHgltk7-;`DdR`VLlMP?4*6%_sv!JXXZ5T4zUV*_Vsoi;O71G-l@-hW{_SYXKTT9 z!IK;LQ=(kj-o15SFEcV82Ts!VbotZ^i~Qm8$D0&4`ft7;bnDWM6rII`HJ-EER&PF1 za0?E8T5xeWvF*bEb;_ms!Qjd)DHHB)6$cscov`vQUGwzvpd{(#k?Fa=E(LsXWitD9$fT(4Si#c9SIE?t>#zMTe z1(bLnKYa?QF8fvfBo^^!7iun4`h-l2_7x}$(n6fmX^@fgo3|Zf z6NXYu4j%+sy&edN!66~ocSv~>_~fbopd&!Q7dT(Nc>Vgs_Td|#fTQM+c&BjF)bt7z zs@L%aRKACKc$7>o%}h;oBP+PqSH=Yc#|Kb7k_!3GojVE~frLn~aob*s7C{r#;IXK_ zl`chxhaYT8y>SamxLLy~BFNwWQFJsLy8dnX&S6L*ra`RYK}~@a*gZKpIbDyCzN359 zQJNEDqF`9}9=-bd4{!m(Ee3O5#$v4|#Y7Xitl8*K=|~`*flCn~0ZU8k;#q0sJET#USvmT@-1~*j znRwub8~@ZkzMpg>X9Ir1(dys2GBlV-=c$z`?q!7e&3 z^p*A6k!G2fZhqbA;DKg|%ogtUzv0D_?-YtGyZe5cIRVftE<>-8sAa#e;4LdjYF4QQuPyhQw1Z-#PFW>rqTmZzzOoQvT zwtUb>MS?+%VoolXW(_U==oL^c5dO=MM5c}2MHt4`vP6RwEf2}|TszdLUC2K1qQ%D# zuZCIVzXRtdPMHHNV}Y2f;h{Y;K5w0qpf;~Tx=xzdu#C`0H-==~N{5GWbdeknVFPQD znKXT1BLY1qPW$dkX#49H6l z3FW>62W%E+ZWHgEw-+Ao!*jo)mMU!3y@6;D02xEe^aO%g!uWqcx!%&&wii)KA7(HR z38^HcX~13x2QNwIK%Ykeu@gt`1zA~YazKiR9OUHWG~fy8kcoPm{I}kiuO|7C;~S_B zcp;Mjqv<@-JL9^jEoc-`rYAZeb`_Au5{gY;IPeg&EwtRE(aBLvY|tuj35PO{mXYzq z_6$ESuOsl`L|$!$;|Se$;xh*8Vhd8g#@`oORA8gnPmM47d#jc*Vcw+COt5ml><%a0jn21=LBjTD{v~w2kd%s?e z^2{8GwHaI-VjNm(rrmEfnwF{Y`I=vc)6dm%?+>j4;vtI;S$96FCCqV!JIa=QO!;0%xLvfkUnZOpdn+C&$tvv4@^AjU@84f*_jfzGFpuWS z6?ITDUin;E)ZS@$#l32+bH`ssnHO(@ijxn}H?IunU0q#aRi95NyWgBscl&1&3)0J* zhNI{24JyuUIAvJ>^5lu|CZA77#iK{}F9<|CjJ*3Tn7hkW%+tA5?ZZ;dQT-z^n^qo~ zhIl^69Q|ZBz+Iox^en1$({jG~)-u1(j)obBdP_^Mw^}JG?+u`J`|RJ`-25fOVyDN> z1CnJ|!zmPQ8GPVA_B64E;jB(uNN{MKOX=p0WYz6IRfixYm$XpHE+#rK95ZN-ZZ{54 zfhv#q&^t|62{_X2J4Fkf7EU%8rjFU%8X%_9MDGDq364uIVuR_nZbX+c2H7TQ`V+?x zB$x4YJ8z6@UY0q)c*NtA>C*{9<>IN!BIAL^`UmGwX=Y7V}& zh9X!|c$OTV@mR6N}g_o?s)WBwxlh7j56+V!T$0E@q6vi5Nb z+?1b4J6e8P%D7o~4^Id+=YgXfY8H|*CWo&{^8Hc#JU8Fqtf6N*F7CyD>+F|2x*7_b8HVCti)E~D;-NdPl6%;7 zRn)IaEOq@G*4VMOT#5Q*%M^DHg;d3zTJ4{M`E$9l%vq&*OY%b-Jum1tPRMEJx~ke@m@U~{Cn`g zYr%ZFth*eM3i}kR6Z3U={;nVg75b|=){!rZt=KUe_fWGrAxUe7fyKjb{huDqZStv$ ze8wFf+M4t|iuqjh)qjgq9hiUoNMdM+-LdgQ{!0b#nf?6Co$jm4cymPN=)OaWhPppF znK}$cBWTAz;NO*L-@^C)&9yU!&pVoM6jX;vB|cmqU-y<0!~tS$ffnK3drF5+*(M4P z!!s2AQ$K}AM<6LD9FkLas&WB&!Sd80*#C}6cW)+ySI#D~J?%R$cpBSHyE^H)XV?ccPo>HZWdEd-FQ@;Hu__(q3TeR&^3IQZ& z-mRKL2hUsRWORm+Oj{52a|vCTZhZW2Vd<|*ea*EzmxHfma#4pw zSa-)|9$v8hzSrHS^L$_^o#6e$FCBd}-|?MkYK>7(+4|az9>bVMnGh z@$(4Z>RYj;OxJ)O?g-H=qy8H_w}vi+W-wKJwOQoU&i{Mwl#m)lmB!9X$<>D}WlX!% zH`-8d2@X6Nlc{~wdgR-sm`%1);aj!}$_9T5-Pz*9+G}~2!k1Z4+PZuFe!lU?YJF5c zLVrK@wpB>v9h#Wrdo2@8yKq+V=w=5N*UyE1#sPag^Rjpt_%YjnwDO$S?khaM?Dplo zS*O$EoQyMLaQYY?t^fuEos$2%5)Oq_$4R`I+9uH;$w-H>jfrFP;AHBd_k#%Rj$>Tk z$Vd{Y2YNK!s7Wm@gKb?ynju5ATqWX47`jQ+{$F>KxxJpZZ<%yXT!Jhh+nzCExu_(HT+A zJZzow=vo>7{F8M*P9Ex>5~-{6x3Zu7zH-oI<9N2(z=gJhc&n7p zLnx1~c6|2;|JJ2k_vriDn-kvF3!MegspDlPV%O8s%JYM313wf@%-z0tZ*bR-lh!(K zCE3?s;k+#KXe}kYsF`g^ra9H|GktiXk|BrH$>r>qo7azO@mfUi*UfYAT3R}KBp)!+ zU#*YuuY4zUyTwGochW=q>}AQ^xsj6ltA8SR^Pc8&?$#|HQT(3adSE*3PzZWN7TP>_ zz<_Xk_5m;KqMNbLk3g|kT+stFL%;K~6$)IOMVJ2aq8Vs7_`x%fIG&%qc70PSv){Z>tdQ|jz zza?c9>#fvP%TojAvpOEWoQ-=1248aZc`gBe)sRYyM*iy3&L)d8dB;8T|L$Ium||rJ zdJ**HktTbqTr`Xh#(YTQ9lDwh4~mz<7F_%pt&zv|BJR9$03B{32CtczoId#pDmpWArTJY+hdzGgaM zfP4s%E#rtgsf@*lTV7pQ{|LcOWf8OMLl3ziG8aay36_>Jq4G?o5P$}U3?I;T4qjyTPR0&e5B_=6Z?|m3xl<0d1;&Rt+?1XJZ!JET-^E5H` zLx#;eCpG~JZ|`?T?Q>Dl?7OZ}n7K01bqv&hl>7Vp^OIjJYnJ`J>dHo^uB!I+s?;=u ze|J5u_KqniNZzG?P+8R?Ols0{e$G(%%kZv)c1K$Ek8QT_{o5C|S)6-9RoPt-efq!g zT|=*YnQyHv&Qf{D8E5a>U(pzSt9a=?!P&p;JNMA{KWi)QO1N# z^SbkmZ2z(jl(!k?Wm_82mrL*bm}X_r)W}xn`Gg`q-ttH{W8mj7UX!|YOd_5|9Uu7~ zUdtG-s&;$brSZ>7BmLloCmh>z80Y9s?5Hy5qW{@<@$v0H`*}b><1S<6gPJDGzdz-_ z_inAok6jD36YFOQVYr<>CcNW7-WgEK6;iF_#cReRwZ1OSFzqf3wOFT^n6V{y;%ABS zoOyMxLt>6y&taKs+g3%h-)y^;LhGL{u25vOsGe+zVuNG-51u!cn>PU@AtX_Fiv3*d?dTWtu zukgiD^;E}{IWx_NYJrln!Czk39L>@<>?zG-%19fvDDk6Z;O`PJI&rS3nbvjc(AW;_ z0j;ef#gj*lD#jOPshi5=I<8arsB!Jb$517_#|!s0wtD`Veq|@Q+sHx zaBkYaG#@M3K8M))C+keWb)Es6FR^VFrUm*{0wtH7_LMAb7b`AkzYOXU&3zB0=D93u z#T$pYBHlXnQQccgFZ%x7t?ZzjL4t14tB8;K*JyChd{g66NW_sJ@AN98llEgOe%~CP z!+b#caliBN8|8i?MOP?CZ@T`hexvd6?a`sz$J2*+9?lsnq+b{0}K| z&(e-_r}3tlyDPRkT;%Rk{<&7bt1TA(IPcczvapCacdUc3#B?)V^2T@BFHi>44c~oA zSTVt;FD$zJYPw+~{llbO4Yk?3${<}MGdVyK#9?t?+_62J0J)$~KTf^x^dYtN9bnR4 z|KfNC(CHzN`#>yEjJ=sza`}>deb1XpP|6V+$&d?lV5tvQoBm=enQCFbZDO+Z z0qA&W=>Evcc3Y0T?+um_I=U}Z-S>F%YxBqku&Mso?YZd+r*WtA9t!IxkJ83EUOL9| zG!^^NGC8&u*3xN@2j1;pp<<@InUGc(S-kXH@TK0;w~bNsg|d7X?uk6f<(8%C2o?{c zo`%yfz|Fe(`>Lt@TBpC3#(ec+P>kPg6cqF$+6rv-d<7KI~$~N>Vz%*56ED1aib4U z=W6dB`DZwLZ*DoKs_?}Yar@kzPbCb4724=p46f&8nnkCswWL4$K4H0D@|x3z)aw^s zK?s(eO%54kri1RxNpk&!JO>UnC9%VVX`A=MBfC5H+&*g=blGL=*OHP=KM{^EdMN&7 z6tnj1kt%hd@7R$`xd>g+p1V(`Zanz(iTC943gzhV3)huNkB3J%L{q{=t}K7KPeFZ< zr?jwkb4>z-`Y2aR)+P)5Vux1W266;C+i`@W7Y$e3f+o)kYIIbWZb=(y-#0K1(4~Nf zsS;ZU+E-_xLvV4QlT23sL?tC9bo?wCc%G4ilhnner;y{b#7c;UQGen7`HQbEfp(GoW%q zVp8){ce8kYEn7+buJp}HJi3M64RM&mj-g_gC1 z9bbN9cJ7?lHVP)1xYaNAf#8ddUQ{cH z_5p!`U*Vw$v;Gn=r~$l!=PCti6*mi^_OOTDZ>X=p#u{^1cy0GRdTwDG;pnxq z;XkDor-)qMFpS-9UO1MrRhuUX?5tx5S+#!L z;Zy*oI8tl?;4yiKY26`q~cXe6Q+M%bACSg{^;%ep&3k=`fjS zGVF~=F}k`)T}t|M$BrGVS+cdX#H05E_6n7iuS~Qamc-wdj4LhdCr`?SCachR`}i&TX==jbtQtH5km1%dFyvV12UPZfyKoSuS{$lLPl2*Pmx(5L!tbN}8=dveNE0#J zPo-PNug*5u1#T9%QW;#`IHx7Y3`9UoaHWKJdSdWK2h%rwB#;Qx5Y0kA#N#kvU&4P9pmy2R~PNTS{;b2R5W z3lYO>+}Iy%ut;nm!aYWK_yjgC87YNTO=;E*2kRY#oFEs9@}Sf-A`BE8G_Nnhg(e4InQY*?OGmeYfweR`&7-p@&$Pe)}3lyxuU-)l`)}K4hG?Yaau`B1X2L z%Sx!Ks%DyD??o9LHNN!}Cf7H0b&K$eavY|O-i(LE#vVocfaoBA72zm8Eg(P)(1447 zfY<+jz3PYn08HZS0hp%n7_>zocO~drBQYZMVITpN=fQITaxVfr_YlO%H3QPeT6n%v zIFl_xap=g&Eku5IOqn@iCxi+QUY1IjySeW_yT7aZ#gV!ufNT6WSueffDhhy%5x)t& zW+(%cIRevtu$w`X0{Hj>jipHH{hBWeU3 z^aNN$ft+U6%1;J70ABys?RAPAq41Y?oEJzPk*^oS6$83^zmaK_)gCP0|V<@Le;QslvH#ec|tq2ntK;j%YX-0 zvwDuT;VS40fB?4x#%6#b!n9qW-Sj&Ksue;~p^(@>)&l4d7#4FLgRv-xa~kfP9X(k@ zT%s(+3%iU=gb4K0pNVVJg=A!$0cP{#T3ED#lX2;f|3twQhgPh3WPcE1l6WBXbiDR~ z2NSf&@19Xuj(^+k&!nc2?xIz7r1w<&#$~AW2%e7RO#pc$02D0}zp#8hrlobm2a*+5 zSU}MUSkh8r+iShB?Ui)n!J4+V*GQ}oZ@0nQ=qpB&QJ5JroCgG1Ys?4R1b;&NBEJ40 z<>Spn?XARLS=XYjj0&2}3cIcy7#ivc*H(~&v93LUY~P;9=UOnru0UT>XQ>UpWH&h0 zm=r?-Hm=aI44Cf@C=#mn>O*ThwYw5L2}1M4uKU{D90JBsn*FE-x)~t@^5YmwLJ#>7 z@sy6&$lw5qWrP>2#3*0+{rmZNWkNK~UmWJd0ih1UBt|B^2gU>Rx_2Res6`kyxDooV zcQT8XqS1(ipR%Q_9fVXYJYrl25;fEw5A5lFVH1JhAqGry@K@|kjNaq~nC9=F{%C^l zV`vnKU&d@~w^PSUP5i~J)QtUg3FJI`@9FGn8GZkwt|t+~Th2?XsX-(|%_vtJc}1(e zz?B(yjbdb@@vYq-=EQQjxu3xt0-mzz3iii-k?_M3#0;m|> z5X1p@Cu7pc69#DpHug9^$Seq)Y>wNG!m;-kJUEdhsySl=>mUS~Xv%VFvLKsiKz-k_nluFTS7ATcpBMlP@!(G|9j z3$WsdBB79!cTfru7Bm3d3F%0-(*n;8=h?t|@w=dpK^O!^Cv+e; z0ls|wh2V~NOpK!8%?K$mB@PChpX^n^X&D*LV=F)y!7sf{j7njX`3PABY39S64Ll04 z-Hv??Znc5#SK-(m2(8iWe5Az{i=7Ed4AH8>=o}6y8|X0G5B7DnUh>JR1*ccr9K)|e z^^DAI069N#86|}+Mj*X_BPB>hTefbkunP=MOymUj14kAiG$F|X?YW{C6SI5 z2F$605D4SWY{yv+3M{^h$*SP~2MTuzv`_b5lIB2ag||Yu(%|X#6Q&O}dXOpFLPRP8wV;jN8@KmTCR?iO_VLq@1Lqj)Zsyym zY{U?tjm|UPVe1p|gmbx;gU=sE?s~J=YE?Ki>4br`U{%-|eZ*fV;4gz)MP~Bg@L&JI zbDxhX3sI-IBh(z7OpA z>v4e0%zcE79P#HwivTrLG@?0K2f)H{wPd~n5!!==fdrT^(nXgiE&`n1@m#+(rW%~i zICz_*8o~uJn3@7|+fJxmkiDaUbjQq$#5nQ=kmdoPA5|M55EN>VT1-`gg3DWrODbB4 zye33GLYD$LkyzLxO@O;NVay^I!8q8B;5ebI&OsWI!d!Oi%heM&MZSTjg1!3&xkEr` zXa&gc%^(01lV98__>ka?ELTiIe!l?)A~;EyOgXsLoHzb2E+PG4PeF(@n+VH8*5~JU zuX}fNW`7Z;`W-vwdHC)7N7<&@_Ud0B^Tde(`c1>3r+>CS-STwLmb$|ymBcxQ zd}Mk0R`hvZg&2r?9QZ!H;v_!yLuCGk&A6<1f5^b=i??qd$2K|xIz6Eq6E9byMsaW^ zV=^SdI=@1viM-wmSKKo;=Au4ev@$d4luCD))PC3}m*IM2D~lV=c11o2MU>Ex&yh(NGRw}D3L zgb^axZP1}y#Ue<0$0Rd$Y?q@b zR&~$AO-whjb_Zu24I3_D{{uCAxr(Zt2>%g*;v32!PrU#s_sg7OuGuztcUBVuPBO!?M8G%TU*<)cl_i@wxdTq@MGjy(Mc`nHDxnrf+IdWF#T8V^YaX3#5U}Z+RWk>N8f+4 zb7vvQ(k>13FLrlJDxUJ!U0WGYF7{c5QP*c{R{r~t5`!f1 zfnIS1h3Bj#5|5)D|LcWR*jJYaa7Z2=R?<-tmv#}=SzUGGx4^{PRuzUFN8MZ#BtC(+i>z->hqR`ntbvTmZpWwX+`L&qa5qbRq@&^W%a@;~g}(}MXlKe&x8)OY z-x+K5$><-Sxp)5O*KISlJMOestd^E0iauM5#Dwf`2^{?^E8}Vzog-|gM8bnG3_Qpn zI5Lp>37+9%>7sz7@$|mH|2}ni=e%SG1z~R?lEpFl&o~LO zw@F~NWM6Jvpv7#E^UVX@{of9P;MtyhpxtA;{?gq}%C`+BlUt}utKfuNrgnqw zxAG_gVf?;lc-U4}klsU^{^yRvvzB+b1e)1uhz;M_Zx)Y}Y^eAEIiR8D4ILM4Cf+1% zAso1^s>x|+i7Trre;E5E4|o0a@y@l}Qkye5Iwh=u9Y(YKsZ_7`Ah;4jb@&(O{mwwA88v<(4F-Aub$jn_0{$8W+U0wc1pC$?J&|OG-Qu8yy|b z_>5*)@eD&FVv^yKql&v>RLr{5e^!^c8GIOm%NgSh0~2&O!dmPWjF& zc5J)$wr6lgu1?W=Q>~9LSo5vDdFZ{q)R@!o@l388)j@`pe-|fBTV7Jmcgi} z+o+_xI6~J@<0lze^hGh!bnYx}q_jaVnfjBq3h2f2d-71vj+!=f% z4VV7fB~UN*G~Kw}j>$$C8C4n}ucVHhFSGUN4#qz>S6Ri8GlW8IpT z_WMX#VCk-x(g&pnu9lH#6P=(vQu|13<=CL)q^_Z#(Mn;pHB{pjJPUg_x6v5Ov4C7&Js zHm46I=){I51?pmepS-mD7VHvA#H#bK4Z|x@vHWzpa7w3baV?5w`-_C~51@68tOny8 zpd0@pRk`Ef)1d~h3H#Bf-d;y|xO_Dq7QbekgS@udZscVbon3RT-p0UNH7#t#abxQX zt4bnOc}|?>dwG9#awklY*Bn;t@>aONICgc7RAS96+G)+jcf51w0}BP3uF;m-TvN5f=k6L6uFTWczu#yox;XgRdHJKW5QRBr zqtfhtB!BY|#+eRTx0>x}6_}dq?{HnE-DzQQI?T%6E~AzCcTz}nxZlpvrMZmOf#EL7 z^ZH?zHc_Od_E=}DIEqx8o8P-^7>vkrpinw&r{DXQbp4v@#~hMJuqxtGwPPtM&|6F- ztJ}n~{B&|-+JhLg1~uKQJDvy%{%!vpQizFu^TpfJM}B!|LpK2@dAqqj+I`sMudNc*s4%;EfEq2q9=dAvQFn_~TVK|ys{ zQpkDEM8!b+lMD$7mi9K0Gv~J7ro)>}DFt;saC9)Z!=IW~d~@xeCvF*=Zi0-@A$8a- z7mHT?Xy!)CoE^AK)yip@8q7VTJ>k@~(Zj4dD*EGmY{VeO;`oG}N#ted$BMgXk-w!7 zmtlFQhRHM0LwIgKcd;&y>wk}O{yirv?WA-G&%qz@elk}BW{-1Rp`)_`nTN8au;1#Zb z!ew#M6q`Itbb^A*Jm{J8G!GAj@qPyNk>BiHU2Thn>)kSL+dTaAng6x6*3aP+S0?t# z@W^6oZ-1MVK;onNwe9`lDdu&sfFg>2ia16zk)CuFrJ4oszOz0>j9cm0W;56KsK z4wlzc=#{l(-21m!cX!5^V)b{XPsOKOIip3J0$BoXN=x|Mo087mc_2pFPun7ef7*>M zZqH+Kz{Ibn$4~eU?TgeS=YU&o?p*G+2gu~MaqT@?T6MKS*B{02wM@I}YNUeRl09df ze{>3%9X`wB?>jju%y*yPVQ6TN!L3M~VcT}FA7XV&@Z1`Nu@)7lHb)jcXuiXaXt?Oh zRMizOBsg2f{E}{O-9Sp-W?ygCrP3|Sj~_o9YYFt$FPoT{d{?7=_oHDmPhJDFnVDvW z=iJI-t@EJ59867a)%|LosS;>g{eDE4=RQ9o-rJ}T&*Q4YC%13at4uTOH8j%sHFAx< zHR{Gga8eM1E)dIi6vGs!Z%!Dvbk2HL?8296hK)5v99EG&E91nNjn`mMRa7iO0rIky zatB973O^>H&9AKrR6@8?FLIxpW6D~LMT&~bL9eDOD*~OSnhLDhPs$0#B&7MDyz)vZ zzUh}f+;rBhJFBTt;o5QUvDp0R5x#SwzcnqsHdpyv`egKRCOPY}knPinxzXD#X@=n+ zm4{~UU?uTsoZLctblt>~yx7OV1~q9hYd53XTHC>29(Bdys?{MSjeV7=vwiUapXB;< zUi|N-h^a<}{nGE&r`|i1x%cCS#1DRKZ{e7JQWYU~qtDn)A>vzSXJ?WT1=d?H3}-j~ z$@3HIhgi$R{m3v)Lk{m<`G_5b=t`<*nTP-PNV1!Aa&xC(^ofF^Ios+8Nc7oB(SM-y zD}uU-^52YmG;PS***ehHQ_I&Yl z`q^NcdUK|Bf)3VGwkimhl(3QL%4{{)2ZT!u2ha#v_Fw#%ykmsUmDwjutLoT)sa*2y zr<`3UTh~n>9Zx{=Hv2fi#{J>SXI-B#0X6R3R-%%RDJiyFqA=W+IX^ksRV_4*AsU=F z;DjDf-aC5l$rLBH9^+=4GcmX#ga*T-9NO!-J&M4#y% zNW%_)9&Y*ve>3gLCCl;4WO!sDClPE?|=M5NA%s7hR=adBY zu?#U&*{y_Shm@ye|*jy{w! zWQ+u`mr8U?(8;cGSki!643<8^6ze^ND<&fgK8_CDNR|6TB8o`u;ks8HD<|k0{uk(m zcQyp*qL4L+ilyDX-!nFXnMqXiW%-8DSzlMn(-ceBl(-UBK(|001D*+`kEG4Xi;46| zA@}=GC9BT9DC-tZqH}6AcspuewM3D(;k6laW_eAhnOT-;rcHWh%iXF{y{ew!gzL7- za`8!S_aDkgNv+h&rkootY5At0%{_dK@^))S=<{@Qp@a=~Gg@aIbxh1#b>_E;#J*~| ztDWk#ZI&hQy_(->&6|LLm539KG9L#AjnUO4LRM1R4{P-rqR~mPMZi|;PIpc26m&@v z2#MuPZQp{WMZ>`pqTAAW((6Ou%a^CYAPzjT`~9kd2m{pz!x2>=RNKyf8Z_Q9-V$vs zQ5@uvC6MB?pE8JT_>`og;w~)n^RTO7V2Ee+GI61#w~L5$9x%Pj?W~!Vp^;oNH;`v0 z=h)EDXz!|RrP2AlIdhj<#H@y9mRW(@y;^WF$Psh&As_nWR1OK}VPUIkbt zruJq=Zs_~^W_+PLV=nR6(BFL142?drXWBA%bfuZyYK`gV&df6N`}D=Pu`DG- zD?{$XxpUR_c}A_dE#cz}wli(@vQy_|78_^J+1HQB)DKAPJ1Z*H%HsN-zjZ_GY{@!J z0CO3>@#;Q_wZ>#(DeSJ`aX<$TlTve6^l8YS%3=s1mBFYU? zXC)l;rRiqZ3)_$sVr-kP&3jv2?QmUY!8Ds#YQI`lnVq$DTC2qYkJ-#KAw9jl$^$t< z!zGG(b55;iXp_(Msd_JW{y=zH&vJx}I7UtvJ}it@d$NV4^hrHq=Fxhq z{HUl%&+;qMC*GV=R8!OY)l!W+!H}eV51>^HK$Yipj`>rwtf66aiNwA_`0U6zI0(8f zRNjE&$GrKYP>G51JlgWgoO4aeB(ipRv)}udYVmVCNQk0xxlLYV_GN|Q7Dcg!FoWL^ z6YfKTMUk9qA82r0KrCCwkiUnDrEB2h`d-M=4jeId_Z zZWfjz^9ZDWklv#wL&g+xaBy&qaHExX4{b^ZxXS~+JOQ<2y5~@pw}3!^qruKK?SG7A zJ1T#ZT4C19W2f-He@mryUoM3_uD^MD0`rl`cwM{4wB1w+ss6fTSk*;$>Y_XRw2XAo z_Gh;v#?h`86$L+xt_+IDA{Bp16$4oKLA3aZLx(6HBqVTvcUdOI>?~nu*r(#ah(v_w z@X;SFS-(@b5Chr>nTO|Gkn87<&!*B2r`7pc4xZoLnstI@MY&zYWc#zL+xBk{J`*&q zand+3D?UH@*CU2X=fq%tu znCPbx`?6}$cw6mDer!Cw0x$A|$-6_`U z$y{++I+Mq@->2?ImA zl-80`ZXgj^dQ-VOOEkaSpj7#w=WO|hH}9M8gviUR4^EQzVURVdG#gnls=R%yHFVg; zd*G^cT$FmSkhWu|v~BCE8=r+&)_jgi5GMx*!Doppwdby_R{HS*iP9R*SRokc#q{7( z>gVEka58-3y7pVHt;{frGJesifq=H2bQUGn^I{w=P+IEi{p&O#RR`YJXXo%2UJq6f zs&vwAhY?$ancT-spZY!-3l-kba3riD}Y zBNy{#=bu_L21WJe*f$hJB#etSd8kV-tB56}nPm!gXob6N;N8#H;Afa}b*7nhe{#7@ zSX4CCcFBOEsk5)I1Zyxg`SWG4AE;py8>LMh*!|8Z%)r)1|HrWbq?g>P^ZHBwSai*f zb9|RfJyr6xd3$&@LwNO;Sxj9|i+y!@m<^O!5=B0^Pe&lVWQ!$uf>wrJ|tqzI@w?$Ooof{@bIAPj@TN(kbiw2GYHTF7J8(3c?$XI&T`BfTOZIECG$#YfdAutOl9=2L5|~yE(vpU6 zQ$7Be;CP*+v|20eJf#)Jd^dR*itfZeIIZGm$P+3XEXPhQ`8ay9&>)4$#ORwbPov4L zXO&v*uMF7~M=VdE=qj=`-y8(ne&e(qWjwlk`%RT)ZrUuh*(K!pG+#JyMX1v9b8ai8 z%$ct_!+WI6J~A{KF_;+Tb%s`RH#1`AJuZs+YFzhw)}np<*qhw^CcC7_d`9O~hX@|o zx(mC%*K&8)HM8d)Wcy;;F%ajh-Fd3-tW=rKVE#4{mn#0uEYq>n=9qq~#)bHF4YTCb z(0R>P&4Llzb9pXFOLq!Pm`q#0)pGlqHwot(E!!P5y`S$}UAFjXaB$Kr^{)1cMvLZf zSJK6#jQ!hB9)Y{P;6V7>&<7c#^ZIbuy-us2P2U45cpNs?-cR=K{P z2-SHE1yx^L7~qhqpP0$+*+DTk)_mj{IdzJ^0cyc^e%zvq?gfuD$5s}J62()dZcRz* z`U@Lq2Zh-JX=DE%7r^q+yV_d(k`L630y_kD{?~2#Hz4+ZpaCiZ{KD>p_*dm00FJ?D zGr4Vy-{7fdEuZkmtahqG-_h3NoSfItZ6FN@@(-vxbl6J@c`SleWK(t0N82^O8t?bj z^%HSN#(-{^tLiC(L;w5Bu-zt1D=>Hx4tmmvYwZfp%Uh~6+0+Hb+7?(;;H0E{@I3C= z95O1&#~1p(o9h(q+C}X+$b#fu%&hHue}t>55G(oEdK&=wBwFF*o0^^`mv6Nls2VLZ za}D~|IT*QzxyNi!^Y-@k#vKgBrv*8NQLo1*>Gpnq0b+G`OWdv$CZ?#0sgF%=s)>em zVHVxp{gTqUEPis~3HF!C?PXKK4BH#F456U9fNpo3i%YfNg-*PU5nPY20CR7*W}c)V zWH?AlAkI-xR*tf^MMX9=Y{&EC=4l0Wb#VSgC`eOa`ZxF1v`;F&fBS9LyiV0+tMgK< zPQ5C49`-8MT7rC7+&I8slG}h?vtiRFGH-V4)~)bc&Te_Pg(c zj=kti2!aa;36P4QI4+iN*1r05BK+4T;S7H~t7rTR{VjTWx+A#@GY5Fx`?UT`Y+qz=2w%Wv zpz)%lcW`BQ%Py*4GT2v$3NCPz{iMcej0{)t?(g4?rm?e>AJw7Je^&iYGcN!rB^siz zg#~_#GfKYuCLU~DMX0c)pgo6$pIWpS@IeB%lhx*wcApJQ5;8gt(N3+c3E~|54}AOv zJeQPO5jwAr+!_b^rz~`WB_$W`S|Fm9S5`)*rTHV%*iB2@43qNzuK(ft_lF6(3$I2` z=*Mw`a0w%=%wwmPfXEfSpIpDL(5;NYt&&+^`3 zh=(1?4CMgJ}9k^z2=fu45ny@h+ zh0{#Yrq^e!#M|GNs?36?Gl4%8mLthoJbfCzQ}sh+(P`FRXFEPYQVcobcYr z_;J!w6Z$byk*jwNBIs~4eBNkF3+QkAV1dhe;>6zsWt%N!1oMPQhvFUxDP)i$`ZZRw zU%!5>g*6sim!`6^1Re#Zw{l2foi*-YJX?s&eR6It2JA*Md&M2TFkuK#_|98vH@r<< z0a+gE6D4eq*R5wbZFz{o8Q<@Iv~JG4Bgxu8Ac$YY(Q@FL{PC={rM_3ocNeVbPOQw*x=>gCGn$5l65 zJt2%foTjxV86dF|=LDFD{Qh!3>%X-Z0A2(gMh$>F>IRB3Y7jDXOG`@@aSrA~%0dz> zZf8>ua4=9!OmU|EWIg>n^WZs()0msgJvhtQmMMqOM}2T{RzJHctcyA5)IiU|w2JrO zx7u7gQ*tI72CM7pvVcO@2YVKlGiMr7k|ECMDf2rDIt7?no?c#rg#F8wLO7`q(%0`Co7lQL}17nHymLoC7-h-xO3dQtUsbn>2VL3n6!h7|CRN@Wc=8@!FL`Y;*io1^wudjTQ)kHCj}^J za+W~DAA)<_xN#%6<`w1<8Ohj#sMwPlnm~j=gi6n|AVxY13&*oSbk|C(`X6DzWR@P@ zaX9seV<~7M@F$!En0-w{!=xz%j4$EIQZnxP-LIkFAf2FgOli0QFHZO_C1`)fQt5?T z9~gRV0W+CVo zVtBI`3OrDG_R!N$ZFz0P#Gazu^)hFS_{j?Vptm?O?nNO0YwJ$gP)K z9%pErB;(8BnX|Fbn6G<$yasN$Lv_*H@Frv8;=ZS>VUbN>A<%*y0^KYYJ^W0bVMR{C zwurd1c}qstb>I=e1dhJX_O4ebpq!MCuElHvKQWHJn>8bbSn({&`c!xh-L5hUD19x zQ$ffYJ3WR24Zf`tQ&WebsGFLCXTY?)2X{Tp-T2Pk1(QIB33UO6*l&i%R9;sOGA<{C zD7cO4@q{2xpvKcC0=tjc=KLU>}rv<-=h}9 z`4qqcTE-ybBd{sPGI$;qcICna5MZefq1g`_nv%MDynV3v=B}UHL#QjOs`{Q_eC!z; zcDaPI_%gqPUVunPM3-dy28Uydc8VCh+I*!WH;}&5>Dt$)=8SkMm}0$lKK9o~yAf5A z$fTvE8NG1LEDR<* z4mcE5KQOkd>~5#?f7D<>YgRI~YhmFM=UMOf>-Bsd(}q+uosU; zspA2|N`lT4{BKcx@y|C8%W)m+Ckw^7!xMu}ATKYXhZs}&?hIm~6Rwp@0YG(NfPEJ} zLESY!Y5icUX%=i}9mIZcblIIoIR@(KEUum(t&)P(_(OGnEa? zsY>hm#&;QJcT;IyzTAiPuXgr%a>?P0V}`mf6w-+epX&6_w&mLQ9zEK0n)~I1gr~h{ zZ=W**89u@IJo%7JMi)dmzJJ=c?Mtq6$RuEMqew1O{HLs90-9)>*7Yp%tI{3DGavb+ zOz|G%oZha*vwO22qG>NcqDz{+jn3*4t?&y?^sS(Q~28pUCt-KI+yiB6pRu3E0gK;Qj`T6#A4M6=o7^6D`j ziCT6sp*8wOAf)Bx9%?C}Uel)^{*k{rsq*)?@0~TXc?nb-R?lf#;LDxJ9ZmE2Fz0Qd z0mrH;Drh!lIyih?#0mC4*lU-s(xI)1i|TCrz599+dJBGay(pmctVJru z>k5aa_ccXYhU3!1i_1-muD*J;;JeEey@YlkU65pwZh#Nc?MtQ?@42kMI3^*-E;c7& zD@xWnGtM3=kDLF^_RQO38@%aVZhT5wW;7%2kzHJ~t|RvmeHiRp*kMY>%^;_d!6<)6 zjyz0fwC})yNvl>xrlb#w?3E#6)u~e(F(uVbQL$g+VJlaDZhB&pIf+FYEfzL2wIci0 z@XfhLDZjApg1IXt=~I>Tc6cT#?`2Q^J@B?^4+ZG~G)`UJySF7(KmN!Zo0-$5?JWE0 z3uw_{#2SreCm$_b@b=ltZ~AM8r>M-Vd%e$~eRvChL1VBqt&Qry)qeuJ_!@@vw*I|7 zQGfRM7IXFoWRB>*>E@#V*BgCzM$UM|Z#(%(^=x8ZuI}2W_bVQ=QCn@gNU6@M-b>F5 zAZBVFzaJj`W`VI*TGJLS!iOzQG%z<9*&(H}fgM3J9gM6pUL_f!xzfd$f{5Hwb+z`T z36wksPi61?p12?(|El^AO%qG?9P9cQyBhq%@M_<0uG@F)V1=Fb+O;UQdrXgh=VG*@ zQ?ngSuNLrgAX>+N4A{e5imuAMuv7alF7s$S8elcOHF_Eze z>Q*O}luwDJ1L>R2-Roj}pgez|)Y2jWWv=BkF=2XnAyS-L+hORN@C$A|!nfffE}pK# zhZ|O0ImpYPU0L{OV~=eMkTFw!3}LZ+aB%RQw6s%nM+XlbqONs(`gk^CmAF+YeNwLP zZ&iiu<9^r5q3dQH9&hDTKEZFoR?qiO58UiM<5%_h0DbSWO8KvKUf+J%w&R8Tb^S;A zCw#t=x}u`xyJ+J+Z!Q`hF`Me_oS;{|=Z?Do|XAB`7o(znvEZ;OZq;$TAnWh(--YN4N zom45^ckAxQss#~ehMlqvJDIo-t;2&P=hgUEPQ=}SZ}pNVv~9-@)k(hLu^Jy11U#N$ zZCX_P^5tCnM(?(pU8siP+sVEkrbMMjXM-0h8$VAGlE>wl25hAv75#HB$x{c5vrRU= zFD(t}@A8FVk{FxR7Sm_Uz>mNNDL9^&SMFaL_|`Vl#g)m9q8DgKSU-9ihe=ti!D$g* zT1HtWJ=|tT#pOF9)+%V$A#zizVLXE<#u%B$z7OCcSC{EpQ8v@Xh-?3RYrRHuSLU}% z8>DdN={>jM%NOL{KR)JH;nwe$t5zt0e6Oy0lNS5_;Z|PCozN(ayo?(o`g+#+Suo?M z#gz}AW}93+mVk}(;&QWbuO7`W9#?`JIR)VK=raSEaOyL3=t0JLT>n(q!u=f6p<^`C zS8Q--)D9+-KkWDwxAbv?>(-~!G?N~uq@1}wj{VAM85w8cFBqcOMtN?o-#1xHx?Uh{EHel*uu!3?X+P>kTUI*Dcz^_g3ZlZa7mjCV-hsyI2&P!~m zU%W6{MLo>G%+Nb{-@tOsb3`=)A|=>7HRrb%H0~dH=e2Vu8gUTKW*wUX3B50|h2>Hty+soMxS2RAWAYh*S*n;9Dg@DnS)q0xrDau$XSwFiUbi9-#r z+F}AFqwmZ3oLcKwmesHc;{ZKIzfJg*^XAtTTng3N(BbHZq5iu6ZO@5ep7d>Iz-$(r zkk`;3&(WcOd;j8^*29Mnr#l*{WOSIA)muv|07mg8(`p0a^C!-l)q+-7qAN!X+-}p; zruRkaxh7@S$K-xA~VG()SHuYC*-IW!nN?QP_{1mlpgz)0L;4f83fyv$^*ZZ@lcX zGHC)h+=n*pcq}c{wuh$Opaq~}SlL^Jn(?x>tYE@(;S_l4n4kHp(|Z*eUfdY~sB(Zx zG(LU=z4vAF%jm!vJ>8PFF#4$5y(9l5)%>aA%A~L)QtH#MP%)}s89bnq?}lDqHpkhS zdmNe8*S?K}H2kXjI)EwbCLFrB^Y)AcZyD-Ppni?rh1qzw*cH!@90^sNsie6^VUB7F z`&@jz64aDb{29AMaK-`?9MSt`o-qu$@-EQ3XU^(PLgxo`p%V~j^;X)T(m@NKjmnWy zo)%&Xa1*CyZMJ`oeY>`8CoNvAqHjmWu||1 ztn0lWrlNJtC${9#c7iTa)6@BWPQOR)tf^MN_Ax*0>Xy2y104$bzBC4HbFL`z^R2me zH$DBrg$vhHQtHu|N*kg&0PvdhJQE1C&J3O1<(EEuSk}$?P3yB7%Ru|be7iS8p8 zpf+*RB!BEI(V@sV3g^;vsTLEif{$F+7@DzcI3wG)89McKP6qnBA&aJF^nL~fzi`Au z7hrsfd_adG7Eb~2BzCR}Ak3Pw-<7AfhHfIF;F58k$_KJ^=iE&`V zOIq4a8Em7KMZ*derX9g+K(Wl|XSYg0P-ZXY0{VLX8M&o7SvNjj$y^qIzrWLk)W!aT#% zvE$-3k9*5>J(k_ztE1@hHgDbx7^1=Mv!Y>(h96~#%whBLC1h&jr1eqJ%Apn!sl)}4 zQh1)<^&@*_U4xG(iX&Jr8j)&36l$xYdr2iFWc$bfG!n8vkwjYOZo~QW~$`(vn0wm7jaCR zr`+7S9UHdma?Ots%F7G-7BtHH@hRi=>bHa5CKMmkHl9DXHJHY3bp+=*Dk{-KMi{lR zHku18ym#!6j&zyI>gp|lj_TH}%Mj8l9>v;hYkD2v@h{m%mi-KRkN`qWe@IpGLLf){Yf-mX$!8}sxY&+sl^v0wlG`fY5P;*1U{(CFA~3?5uk znlQnp0CYy$5nFJ6a0`$5otrf{!KfXjh$Kj~jX0%%z}aQ^#WEhLGW*0mX65eOzc25d zEJcJ`M5cmjNY-Y-adUv!dOp*_;>7cfRyoCM$ga?|w33HMtURGtXYrz$ z>&?=gNT%XUK!Ti0TL?0YI8lm*79L3^9^)%3D^;Ie{OO;u_;PxrY?{8hX+zQ7$|qn1 z>6^TFOu7nJDcVumJ#-eBe>VkfO>dQc7raO8mytYmA=VI04q%)x`g77eTv@4mWrO3y zV7F8(6Z(G5=^EZ75}Rk4N@m^=@J7HcCe<)r?Eb{SV7_I&9P9m{1?cSS9cnV&*4CE7 z{iC7%u+Dpae_ZKi17!rxB6|)1n5aATReL7yUlTt6<)P!pGlpc2nKXU6m*Yn^;qYWG zJvztuEUO`R0~!KK0H*TB_c5Ky{OS4+QK`LJtAvl{S1^h?!OZNKMu$a?jv7b-_cv-g z(d-~@OR^~eRFcm7)TK*@S-UXU<@=JekI>a-InFcM@znA0`$pfsSp9l%>bugYN8v}B z6y6J(*K1|o&4({s&jg;B_2CKPWS3@Lc6dZYIKE)iWi1*bbv2{?^X5*NKG&yL@`?q; zAvY7|Z};%{R=Bn0enxNU?FGWWR`cg_o;A|7nPDVc-D4x?233Xy2QOfPHE!HL@Y&y3 zLhzal+-x*Fx8}%H5j0Ol5Y2ZEEt?W#;iM z=DCi$>gu}QDAV-K%h!|im-S}|s%L+d1|3*A_w8GdzVnIp*HmU+Dk|8}Y1H!0bIlVA z^~`S_V19~OAe)bU0`?u*f8)=MiQb0}T3x#1d-vv^G&W)|gV+$k6!`(ERjv*=I;kYz z@$LYeK_VBXwTYY5W}@d&6XE+HjyF|)Prh}lKGh5`@@?!XRv82z-QKGC6jX^+;GCex z3HyioIsZ=!u-cYDM#;kx#|B(dGWJ2=xb3Z8xg;(%Jdk9p66624sOX+~)RxZ})m%NU z`LO7a>ARs;3aI!Mw#C~|S$}zLGl1~}4O^^Q^K-?cy-Gb}T=d@C4@g>Wn)l=Vq&0p6 zherEdG(H!v~s8WyY^##^PDNz7C;*|D5TSd~;@hrk>%JF?A6sB^;r?@cWmR z{slrpdR=u~y&8Jup!5}fy?gfDic9`$ZX|o)F;YH#@}#V8MxtVjflb(Z4S7HI&gY6T{cw)2(=#@{gBUt=t*40Tl2uYdcP}22I%CEt3zPIu zxSCW}|Gar|=_K9UaBZje6Q?eGlW@Cpb7URc@_OA>NZ;kvw_o3rv61_tOCr3YHP+m} zzr;zC`1n9`)Tz~uH`1PVYN@4FcgxnVs|PKO^L@JT)vrI*A57xC5%|~p*C?V`duhJ} zz3KfspNubX*@YVcQZGT2DH`lNdTnbpLJ^fH#UIUrq2bg5SS!oZ@wDByZntsp z37M5==#_0Y|HH&btZ#Ucsda$&*3LkG&YbzvtQYlmb{T8CXaT)GT8^IPiEFHx*k|xs z;ZTCBKma$h-(aY0zV5l~7dohT4NU4Ok&{8&H(y?+s7~p-ZAstG8y6k!$+0%Oa)SRo zcv^XQ*KxZu-D+m+iyv{t<)=!2( z^H7t#FK?%BsMp)37|~`U2PF^_`(5-8*gb2`C z7Tr(_oI@IlYYe^GDL4nu2F#Onu+li%FDUqQV6Yb#u2+Qd=2>TwpFQog($@A!gZizz zwVq(C{ZEET?7t_cwe9Te^6Kr&2|Z`ezNgaG*JZ4MukWz|>V2xeFXdNE9qX`V(iHDI z=evubWR5xSgSE{Ds>4{r(No~5@SXYjW)Ody!KZ){`>>D)4a?~KN3OoFFJIQN?3csZu39aQ4i8e2G1(qBd&^YtA=4G7D2Lq7-Y}OI(QJm>p9*n2 zxekfW*@x1CJgS3KvI3H|WPVUR%{5Z7zU-*@8*y>ef=>y~%llLf(90_DRNk^x?7;R8w z+IgsKTcQB?xBcOgK=9rraV7w>vSgU5jqB>;>w8x2*U^L6Ah_v`V$?>8Qv z!;0B$XaGIRSRgO?VDvDxA8b4m7r0>(k=xQr!R6CRt@-ezHKE(P+t}&z=lkbbH|eoL zqjm(X$F?O_;58i~f>`E|N`xo10ytg=;0_87)~l@p=bv*TsiXi{Ok~fQl~d-0@zT348^HN zv;aXZ9SpYmY_5dDw3G{(5>_ zD2l-UASf`YJXibNxBc(AHxkCCStr@hf|C=VNNq#uLa?vL_e2wQAvpMSQqnONwa`bV z-MRBGXj$#UuJgZ-(Fy5bs1xu^>?JRRrB%xB~lSLJbfx9C*XUdx$2Z(g496ig8fL+0my(Yjz(d| zzdDX}84AWK$LePD>8iE2<7>@_=g!7i<&`yGi|^ghNLL>1<+Z?5*~_!Zg(XMS&b`uG zy!geKi^qSTI4~e5B3kqOW5?*ni~YOB%v-vvJY#_0&>3xi-ZLM1OR3J&)^par{n@a? z>Ru!C*NnH=TUwU5&)IF<>de&lD++!lz4$q0g*BOFF?vQa3H0x|a}~;Z=Z*Wfmm@`O z4CgFh6dzTd3Sc*7B{l6cP2JW(Hl3enDnKx_P8dvaE1ev!hU0GqmeC^Hz)TGH*3}NI zq{^Qky|6L)?EA-Oel)WV?;i9JXBe&zh5NBF&X01ey{0Oi_O)j1n{qr*Ltk7T1|7{f z=<6GW5@uLN2OrJ%AhGN!A#_fHIN&Z5Q|9lgZrr$WyY}t#Mow=Xq^94jt$ddH72I-2 zoh3{9(m)Y^=}#Mp?rpF+4-8hacjbs(H@5$vO>nV0i&=TxOr|9zLk z0^E|0pk^i`3C0=DipjMP&*C$4PVMwGi$@XARY|FF%a-RU%a0xF%7y#NMq-m}GF?w^LFpH5?Qm1jCm6)rNFy?f3JuEghs2ct~%sZtcT)7&xshyzeZ0lX%K}ba_jrhCp7p04HOehh#*OFtH7I zA&>x0;Ye&-rgY9TYoh87I(^T4WtZ|29hNL$+*wz(^UNBC5`k6oMryS7=_1G$*$9jX z_@?KuVT$e)+53+lp9w;-r)N8#ys7_vk@0N9>p6M%Nfx~E3Rkl(T0V+P4|a87`E+IL z3O*B<69yOiXsw7t%al%gW@-HW2wAXYYmr=d0{^h~wWX}T4V1&8&dH?G;`GFm|c) zP0oNdaDTu!r_tPE%J2%PhO_)sE>!QoM>r^jv?rFFK--~@hPqMKTx>B@`^~xZw6q>- zYE9W8EY^2_X&vnT>f~2|NCS#L+Q9cKnq{Js;fUV!x9TO?wef7H*aUm zoLR)_ja~M%4L^-DgjMKCBwk!5nzxf5Un~Fj#mp61ud-}ee-08sfn*shPv`UTG0yuD z1X7220+jN0u%0DAOu{ykDV``NPvr$RlT91`D>pj#9Q6QFHERuj?$U4YH5O^5xlL|jVuOSJ$HJ2KGKGL{9|NK@dab|wg z(RSw&+fS+{z(dgs5k(sB2kZ%AHtr_!bwo`|v=UN#dj3KAp$r(Aes=<;_6qR@MB@=+Gc$XSm^U``Tf~* z5JjV@6Sj%LYi4FlZ{c1vHY;JW|KD9a*0<;9?8B*R-_@ydftS6isqUMZ2B<;4sg5igQh6-_N_u zPSid;y%3!#Q$Wr2Nkd`R?0M1D(I;U}ewRnMosEr+y?r8r7uTy#pKnMuWNSMNCrGb& z({Ve5|0N~M{!WD8ZhOXl-h)<644M?sfEjgt0h{WsdAajM?UHdt)um^6tcz+N>(sC! zxGh-Db^JUI$!nfa5ph*^|B0{^tc{g^*D;#1ds6`~BldVCeQc2SQfrsmP{N(#j^rcS zl8?fP{U)3$g6+=EpSmD4>Tn?KpYdzg{!mOc3U9^XOg!a4!rfi=r+i*PhXjpb4?1wP zOfswnNm5|PZ#vRMVqhV&a&P%8_5VC84OAh@cUIu0!|!ZNehrj0T9oI4){`{^O+B3P zw)2KRU6P3sm8pVe?Mn`L&cb;#?fdTECvi9cMt6%92(xIC#|Np*D zbY8V(lw6MuV7-a&K2v)&9ZzYwXRP1xNw*%=uh_v0{P`eB=17qIAr1Ha?UnV!4=v|tWI-x=ONF}ofBYwL4N3^w>K| zK!E1}+B8<|7k`7^H-5OraDQFn{)c7^A3nVE9@#U7Hbj9?n0D{pLL3y6zT9Zqm7~7J zhM@0Uo^7=BNn{UEo+8G~()%g%Cf9?3=a!jiqi|<7^D$J&ICgXL66bYMztz%Q~<u{~3ZNSesD zQQ6|h#q5KW5gJft-VtKo9s4tX-Xbx9w-JsCnv1OrHuP*FYV`L{Vy09-<{$yf=94y=4&OH9+`6SOJQiZm&4HLr}_=R&)2=k;I^*V6iW9u z6rxJF5@LGYeT+vS9+TudC#o)|T?}}|nG@B~VNEC1_Pe(8BVW^$BBgBT?%~mpF1}Z< zURm$T6Vnj7Ii+Zh8oyk z+pm5>JrDUq3nq$GHXOD$Zl8;aeHTrycpCBBt7t?I+CCcAIly0tufDYd2i32&Uo(3J^1 zuJl`mvg2p9SLsQaRh=oaz5x+<(&Oxn*}gLbMwk)O1B==KI9Zx z9Lx9YNGZ-k7)g}p(-&yAzTi!Ngi2_^l`gpz{(e{l^f3?_=frXq=JqtrQO5m6(g0iC>Oh*zu25deUr73qXaC{FwE)@@ zjga-sFHslHV2N0McvNJ)b2rPLhL3P|J?XmeFSlvV~E|FiDHFMCOl6TeVJT zUmL7OY)xA>ye1=Og48Ew_jqq~dxGHz3$9z95P&LDX=HV&g%iT~k~V1aCWp{=cH&5Ge7YzfKw;>lTD`4E5IV8jjy{P@ z0W^~#zO;-SAql*aJI4G!%Ht6?k+QwV&^j#TLb(XZ z2-)7$4q=l(R0gJ3WmCE>*iifN?=&Bb_yL{e^3p+eS3oS;6EKYuZn=^d(8%0^h;Buj zT0i@n+6USJR*GXQg_6By!IGhmSi#cSyCesgPGLTX~^EBWr3_dfBM;(a9UwQ~Bb#B)5+Tf9jO9uT4*HPV>22xL>(aJxpok z(9Zo-RfE&^+2IVm0I>}nVfL?tNfRexv6`BidfvoAfmSzXeOF~=qe;#+dHu+81O9%! z`W%z6XA6;*g}?6#wt>0&k!B&2Wv4E(g6&kjxxW(3&CTmDW0CagN&2+8%dZ+LJC@EX zxHgW&;k2tZaX4;H&#ptIUv%XDL!yF7^@JBoLVtD4f}-lIwXP_zubNsZ-y}XQ>yUjp zHwWm-x^$5C8Jdi4+ik+{G9%1pVI99LH!)1W1P!n-9?s1c{+owt}7fFzI;0U zGEKD%nR9#0za>O0+CF~y(}Ac|dlDkjx#RL)^0g%Zq*v(${5=O9xSr8}jvYDTGP5`` zCMIOq3l}3VPfs>Ibp;Lpg{mXl;JNpa-pt^hOG^5ksG{R*x*IGnV&p|feuY16jbiJL z9hdy~p*h|`vuoiCpQa;6j#OCn>SkjQr0~l1XC8WP-CB>9Fy#G%@cDe+^{iD6TlX~> z4*MqUGll9H3LbF4{dDl9E(3`(RDz%x%i>pO}X!Dt2IlvskmvTEBiIHE1A+G8X=; zC}cZ(o4v_7OMDmJ&07G!FzQRBuv z$kXhH|B}`xV2+ttv+-awn`gK^xc2C)FDhoqD~XA1x_5U=YkVYa;VZE6e^HZxAoCTC zuWlU0Y04Q)&;%%I3Unfa=uGK36T78dM#J+-G2#HB?QcbT5cr4`FdrqHPM;PuquD3k z&`ZN6t82DijoCQ2YO4E{zIi_gLF7dHKrT)DY^U5mHhNu)mM!rb+=X<73T%4M7qV`RnYWhBxJ$FWNrYQ!nFJ4M^y_8uWy!A&e5B{ zS7dvkq0MYLX@a;@3O>FQn^uJra|#p3PJ&E-zz1ZRNd-$m+f$qyg4hC1HX z)SD#M%A+UF_$x=1_PvgjYKBSb)>qg>H_>@47@k-jzY&S94Hw@*7vd7lb{c(Ni5x`fWZDK1r7gZ|ID!HwpO*zZMu8i6Jz{;d>nl^ zHt2s^fM=9C$5h)El~`0wXC=58XSs9ej^fGc!!d#FxEJu}dmou3y1lpi>;(&6DZc1K zMGZo~Z=ku9*RCFgw@)L%%9Q(Z$ZKVuLSv?Az zCJB^~C-`yUwXt(ln|IRKMuQrHKaxci?3AaDaKvk*yPT^}vp_uu73f3r~IV~*2?r$;8jMOorC>m4sAx73E zWR9x}O^+|bX1;@2AFhqGOp>gqQ{Y_}5$Ep(XmxMcu;J;`rw4ZV)}6b4PqVc>>p|$( zI~;FiU~wS5Jf z(dDK;>0$@N(o?22lPxh|!1Yxx?)qJk>DIuC$SB>*moKY8Jow__Wf|4CRCKb(lI%}_ z7%i~1O@;hGOmnroD;e>x9xnw$Ww}a%BLciKtCFudknnxsuo*TqPK!x5xYa%ckJQK1Z_Q;Qsx-G{Veqy30qA{XLjk8vXn3Zz)_!=B z%yfP-1a-*n0sZ>bISIHUmjR$A3L&)6yWZZ53B*#sq3E?Nk7J8cU74-#u!q%6@p+%y z?z*+$c;Gmcq~gnshFEIgtA8r(XPp@1Y>+!OaNHb~|wLTR=v|B??fr6Hu!QU{92-=&r{(SNQuhUgS2#kkvbe*wpF z?D%n5!>~t%9aL4CGOu!M?1n?kxIVhFVI58fCPkB+X*B?NBL7s=H@w6_|MI(Gn3pG5 zZ6_7gW7t#n!^EywSHVh~<;Ppq$!Fj-r=S$%r zhoc^{%H!pUdC#61CCuWozoq$)`qSn2;2*SrM(-o^%(;=aJZ-A%L8wb5;iFeeVF;)K zC#jQ-|#@oCem+9hg5o8*6dn$#9cS@YWOs?S9PJ)}_xWQc1__4mgzx_oa) z<^$Sp3+E!m%AcPz(Y(IP4(Y%{#<^Y*G_&%@$6bgbgb|}@G^pIBzv9+~->sVISN*zq zQybb$8&M=1yxOC7AsuZdgP}sLr~h4R)P^7ZnZ`sc$#xFj%~{%ifm-CZq7>F(L>1GV zOxmza^rh;T8qf$(5;P+$kS*N3Mq506_DnVbm>9K0PEuF##aq1cuH?JbRD)4{A*Ot# z9$TG@hbS}2uGQs6gnhOn^`Y;;S5Qt~>9=x@JPQQ*fuR}h=%a(p&NDPXx9vZ6!*Db( zy_oQ&(?j5SgLN}c;#a;HR=t4%hd0D>iGc7RK z`H@z2#>ef2D6wSR&1fU)_(g^0xpQZaL4)>D3pBX!%Wy1I42StKLj&AH>Xoje z9Jf)qF{_%^R6XfB(~Y;ZkdunNCBMG{Q`6 z2y_3sxOfUE6DrpW?=tEdYkjbcV8+*-=5gGw!g@$O#)G*DW`;yZ`f0%|pju7hW4n&q zco?zuh4fK!PhcLY^m5mH+;iJ&ZJb-ufu|MWZ#TUKQ^V~*h<{mzB}N?m`t7Vu?&$h( z2+&xR-j1fp`FZZ_H-;zw7N2^_3x^-ASzP)r$>Yu2(O@a4Ccty7{+g+(U-`b@X~Sl| z2a*<1e8W6YeNW|*tU?A(MdUYD_Eg9kES?`T>P>dtax_To(7t`NW6^YRHR4#HlO8NY z2ZZihgcLch8Z6hk4pKaD|)l$04|K$6Q%LKa%Z9W8U9(9 z@6eD6`z%#CoWoa;_j!zWLU8lr3bAJumq#AI>Z(}^a5fK z`0GI~`U5eZh+VRo0Y^dDS6-_gj(Q{N_5)fN5wsG#LC(%lvvU+yL)b(ueXIhx7XGLE zPi2n9PA{+1gaC=A3@$oyZ@+5QeACMLI1Q?V_TVVVN5T;V-Q1$Cd^Z(HE0A0aHa2AE zj$_!6JChS`z9G%Gg;CYG#w}W0T;baZ4iZWwpQ#S{H{}kJE}P?rcV(^n+es-aHUpSC zq}Gzg&BxRi28ld=`HlHGRj|viU|=uV*n@134x%4H?)v@v-T<^rFY|FzfXMBS9@B0SNx#E3J9-s+TuZLmCC& zrL5kXY;{G=sHg&OxXm`lEdPi*!MUVN`34~~hc;lM3@ zw6wZ&JvbJV89rm1(JKk^2FvSzWeW*W@GL|s@lnshVip1kPVpOP5>Zr**Qq%&W9Dt{ z)fAXYK%TIi)qlR`T}EesO5n=fr`^r(Rt0i;@a|~h=H|xYE^uL{2acjN(Evb2W)QMz zk9JADzqusn^WVPF?i;^&&xiuHRkpmIH|P>J0i7_r>m7hDeNXon5bT1OO5s=mK+-zz-*Hm9q-E(B6Vs6#AwmwJBB)P2?F#B%C z*;o#Aegdvuu>U1u-4~OoT>d3h&Y86@Y` zu^TL|*fS|~bNyva%e-Wl-#mL(j+WtcZD7C5*}0;*_hjwBEyP>MgZ?J5cXCeg#Am__ zE05UfWvy4rsaTD&1}`Xb;XEMv)cQ7{qqA^_SpW0+x~Q0#*T5%Me6!)67eA@?@4t|I zaitYJ({OiwnwxFZ!Yi*04NlzX@lUoQpO@WaD;dG2OkLGSpNlLx;v zByPp?&hVPo`7W-vzA`ZsQeN!t?%t)n(emQAZx@%g`uoEh0O>%IY!&+|R=(0(V{sf^JFXtr$c}3-SIoxzm{SgJd=t z4iTWj0g*Rc^MBJgp&CDAPY(HsQ2vQ&yr%cd-yE1N+Fu1CyS;gH<20*5k!#-Tks=sl zvs};r3ER7=ruwHyBn=HG1Ldx~uBPZ?I+IBdJpgw@fsq8>b{_Gr%PFQsGak!+fV)^Q6j>5H5gu*(f5ew73j)2CX$4A*ww( z=l;;07s@se@`mC>MJd5LE!j@JF(cvy&50B_4*9n(9Uw26e>WESZ{>_KT(@B(%W? zd}kD>>%tw!*5Qp`Rl7Yvxvt`^Uyv(wh)xfhoPkCt_%wH+o0N zDuiK}egTEay3;Vb_6d!KJ@7M$Kn0EX#esPK4V*U;{~Y@X%)oimjLMjkhJ8-|tG`|~ zrIw$6HrLqcBRg6Nhm+f2OrhveG3Pgw?-P z8!c}%mu>^#WuO911wBTN{B=6>C#{f$QI8LkMY5s5Gw86X8k$_D-oVcIR$*%I3a^Ev z027)O9Zp~FLrMJ#mdwDlp&T^ z4709c{d1HW$K+YiFI&c5aO&qfvs}GM>i=iYs=SJ26!q8RfIt6?XE1?U{OY?)>4#al zsGe9I^$6UBb}>#F9D$W$TPS}70xd3B9`?-I&1vBM zyL*|P-pK!tdrHA*OhZf1mmi4GO-2vUqLSC%P@iY#)lsfxOPuuh^aQ84@PEsG{8&ub z+1+JC3os9A`GnH&%XsnqF$j3JZ1`hF;pt;0FgJ?4_$*0F5JE4t`)G(6n7!CO0_uX^ z@tsb*qT%p+BRcQtU_Q#}YI?ELx^>syy+*nlet*X0P%2R{$c@j7H+vZ<0v#(D<v6iBDQ?uIUT;LahjzZS`t8rDqF z$Nmx88obqH#-DB=)biR@6U(}Um?w-hR>?y^11t{#c*wZv0-8e+A)wlQBJpKXY45X! zLptxt(ej&@VE2JId+Ov#1$Xj*W%g?D9E`1IOPUodRwhVgp*M9k(g2y`qy0Dk+7*ah z-~wTY6+p~ewQ1v+Yz&T2YX7~gEb&7?`U2xco8Rx1rmiHeV2N);b5+A*=Cja#jQ1UF z4fSGLBd_rgsR;f^SoGC30>gK)!1}x&9 z`I#rEk)@6X2LlW#0&`%;sBph`+9k(!y0XxSm+jA896ai2a0OdZg$TDVIBfh=?EnIq^+^ zAs#l6$~Ov>GUA3|zXyTm&ec^M8y6lQb@|qUgz(q)CW|&VRW;mcKC8$sUh9YMGnQS_ z4dn1(hWtSWtRNp7jjxQDFcTp>bV&yl<=ozAwW+cMB|rv3oFf6=6ltxe{xcGYEFVN7 zH$vt$;KCN69LxE5fSelS)Q#hf6g10Dq$@dp=4Cs$21J(pXjc08{NA`$*l||x5f4kA zSR~q0Rkfqxu`?aHe#p){yAvs)aB38!cL!iKSoDF6>Fzb)M7+toyI4&L&=&lxyZSl8 zr$UGP9|?|4Lt${KGGg1O+`qQ^4N+sW*TngYt_|9CORwkHEbTzoprmhxX!aSLN zX>Z{DQR_Z+l{p?75*f2Wl@{$*<4VCkmHMS#!xn695zYS5%W;bf9q$HxsLJ9J+7Ees z7pw?ZG{p-`dd*K*R5qQ-q2}Ysn?(LAZxSM6(}R#UroWK+aD)$auLDUjh8jE0uwnxT z%H`*$O=+vy=_}F&SJ-P+)5i8gc%yK?o4uBw_EY`g?BY^utx4SMA;F>F%1s8Nb3frh4BPmqOrg=j_uU-j#1ui?L*Rx3RCaP<@hcwUd<|Z@MFpo zVb?U{0xRHm6t2UIFh*$hWj)pRFF=8TVN#(Z;p8{3RUjXO;D&XONE_TMkSq8 z;!MC9K(bzAq;~_GQnB@Az*8pMQ9Q_;Gy)6sc?aPDjJw1mzBt0_dBah;6`SJdZ0~af zX#t5iGBg6;N2nOVA|;W9fIU4x4F`RD32_YoM|?qVHe~K5TkG2w0ijkIqmHMmJq3~k zmvRj9s<}IdmoV27*5)3VW(Bo{V0y$nQ7BO9Jj7o{X4A)RSlisX z2eS+Im$=zsnW>^rr5b$>9*%<1F>Sf%8}VeSxeVEh0S?v_2*(!VzM3;y*PD`?xK9}= z^BT)0N_7ahHG`)&d(78=;EtIBe43|Uy%&z%80kG;4+Zu2E?T&7UqHZKIuDpQsX65# za4O|vNlnC?oB~A4bm?SY8*;e+xJ{b09YPQAxtMTF#;zmObd#ti6ILq`m>W3#H9+LOFu9LV;sR3`S%pxRAjHTDNv=O zI*fJY9?%}xFs5N<+-$2?w*|iI4vZm=0~=QLel1=GOvYz_>fJ{<{wjbA7moP~Jw*Pk z6N<=s-JlGFOXUDE3BX@C0h|vigP-+l0>H%<^WL08wo;Z`=h)NK_Xw$F4KL%K!`#^7B27K zzXdRYmXZ>Rp&Fx)Cl;awpmR8YgY6+Y_Q7b*c>PWFmz5vo&B8@$p$UVKW~z50z!q5O zYm$ue=+RY`>ZhBFdmuVLz^fGM=*BqBU=_e$loj5n2rjEO|60RDl_y}{Lju%EyK9lt zDI*rrvneclb}=knX|#^^z*Gte(#QiaHc73CPHNy7(N4xxO2ed@q9=ZU=1B&Ah@$-S zH@TmbmQ2+q`&qiqw=M2Mxmoz>(~5*LQP}yIN(~?twSSnhP$fZOgbVP5ga9keK zo=(md;8@6hJ8E!Kd;ghYWel)KLB^)g6Z$Rvh@B7Jv*e^$P4Pb-p!W zSRxp^wnsppik!gpUA2U?#+I(qFAu`DCDVOuqj? zEbtq0M@+VeFHdWq{85>P&dSoKDW~l`&CnT+dXRUrp`HK2pbDRUnNskb=6|JRSxpJK zY+BmJR{-L?k1HuHqnMCmm zs@j)`4pSI#Y%{_p@vVXsWrjIz;c1>38e2!;C_)5@`v$fOj6YDLGRQM^&)+$?6-)8G z!j<_|Y3W_IZ`CHdH)9Cfe56+x!}F39D7&E#s7ZGuTNP3jAZK|pQqSkeV+KXcpu=Z& zMA#?qmj5iXdWfFkrr-<;>19Lwst!Z)W{P}YI$=kNEk-4fpzQ`pF#0~4@fPe=^~aLq=Yus@L1qgo%g%~f`0s;^BzVH?? zlBfWQO>|j1p9-`wl3;Z<^cn<@V9THA~UTY)E0(ub> zSW5ikyz^S{O)msL<47Pw60j~=0@pYJGI&PfO}4rutDj6wjn+*ca3-gH3Umj}RbTXF zrzdO;wszUDL3}GyOgKr~@o5y4TTTGI z-X1jJKu{f&o}HW7rF2*xGJ?1TK)Ur##>TdzU=6d;4z|I1X$)%=iCUM^KPz?Z3J=#C zGKa4m!)kcJixlew7RXdA$pDaTw=9jv``6T?mw;yUSGy^$k=lcY3`L@WGt(jN%n*<+ z5sAet-ox-(Q0utpju_E8SC{98%^3Qvtc*WsE@TYYlvo+l2|vWA8Aw2OaDdPhiWbV@ zjnfO%2jW_eqQ{D+)u5Z2nwpSk^p{<9);Xbo9>pjU=90iGT@gr;Vpl(mD(;Y?TJr}~ z&|-~vi-u|O+@DphhUbAfWggd{6PBFscqPG$wioH^Ht z5-{G~kz4?^QeL)25!9$zGu9F8CY=RPgXZ|x?9d4}ViNaVUYr_`qr7)&u8&)~isrE< z4(7f6Kr>Hrrzr98a>mM+Nu@*YJ*0i0`dPex6BFYpJzrDs!(f&Ue`= zpD!atveedYHGe)lzwAe;m;Yf^=^jpU3~}Go!@+==-lgV>?TPpRQR*EZ1CL8DX=Of* z+!1f5m~#Jx-MY-NKeHCTQ})Af%K7E?4#+fw@+^jSJ{@wE&v=KLNIZDNf?6b3-8X*O z++4YRLWKx~c`RgiLDx6~d78as=4d6&3}<){ItB7y3SmPW4)~NZ@GbnfJ^+o1>Tl5O0C}kqHZGXY<&X z-zrq&8`Kd1k8}F`!7nZ;v%ZN7PrY%;{8(5x=XG(MB5}!nN1J%Y~4nMqHICB>taybjv`>X0yH{M)+|C#0P>wavl!T*n7!MHEusXjUE%M zx#9P(4JJ*3dhP30x7Vrq6TP(UmYjC?YG>Z>Mw7m3iKmq>TRt_f?zh0k{PL3y+N*SY zR39ZP=;=gam4NUqy>9cwMkU3FnKbnYIg_KTgDiY)dESMTc<{hBQ zW$pyDZ0)6wu!je!su-W^4Cpaa%2`A^dx?VlB+>|j(CJ`eNK>=oK1?jtaeXjsaBWgq%6@y0g=kPVH5EE z0Ik`elStwg(ZLv~jO1O5u#GQwnp7vHEZ(NlgD?s%vL>~Uiwu>ju3B?Nsmb-kG*Lvxeikk}L48Eu1okT2 zD`OsOJLc;vih#wWu13Gx4`yUefGMUKIGY3SN0gz#$rwQ-|Hqvb4&J1} zQK5Tr!K1{lTS#kWgHcwl;@ylaKCoO(5*m=L*`-yR<-H)o`(5#E6x%<1bN5g^l9M1A zS~IduE6oV4xXS-#MnvTIUbn{e=-$5l+FLbk*`)CXJ7|UM6|4^x3pUA8Tm@*?;Lk5W zE)5baBYuubIFx%5@=zFWUJoK!o0zA<*a=m`$I3QLeg2_Zz2qW|fHXVSF;9&X9M2A| zVn=R|aBSo*=FPcA8Ffs{?Sw37VRaODpxb|SWNeFho~3%{_giCoYS-IG@6_sH3~tD# zBBP>8ej?j`dZEP6UIaqRlyuu}-DXkPB4C{Eo2`g7pv)8r>s6w`-r{ChlW(Wp_O$Q;0gg#V#pvnc;Vc$bkU z#G50#4r=(%KNl8-)4(VFdbP{WQTRFrqu>*nj!sz|!!X|{r{~#TyLZ3wHL`HHu!`(_ z16vPJDgm{TzWFxEwTI#sWix$Hi3VZ_S)+mD4dSOuB^?Kz|K5D{+O-TW-+1Y~0tkl& zQUL@HIFG%Vf=vo#4vc>P<;4#Ntc`-3#XMccjX0TGn(hDR?}QfRr2Z3&^N&Se`Uzgx zqliM7uHgX+aKU2d&h<&DB>E0UbmXzA7|ca1@#Wu~=ZN6_4x$}b8h!DRlK_Q~`@2&% zH2N2*2_3X_Tq20o!nH8eP>o%*kSuKzOG(d>p3SbT>4$zx^3Gt76l}Jr&Pxw z%m;qk>-KvqTExfJ3E&tYQ-NqE1T7$0NAta!#p<564`=LQ>@(!ZmTVakZxvV#^Lu8tI++7}0(?cTe$7;d@2za$kAT2g56sX9>ah%{Ov z0Ck;zgAQ1T#rvj#eW=l+ThuS8<-nM?2sLU3~2 zS(UIw$hAu!Svms=#{9@@%@d;9Z8 z+MwQZpI44Y zaCs=5S+kCV+(pJiV?_p zzfs-s3Upy2YpPz<2+qlEC!dR;f=P1jVH3BiXD@hR;a`dQ;he$;n9|Z4lM_>xj}0`J zm3qxd4F+9GcqFFP<2LdRLK+YD51gEDSE8>GN;WSkI_lHx@%uFhDlM*D!CZM{vzB?F zO+sJ7`QF05m0Bb=y-5renG7~Md79&5BX#{@HY+vQT8B zE-XC)fk(#sfJRqW<-n0xUXGo{J=X>g=#(a-5+mBTxK7uW3D^4}(v@%n*j9$ln#pkw zNXe9%PDP2N$QF})PHkMWf`j}1NmNfFU+%HpV%i|DE=${-R%R)K?J$Bpag)LWPhhoK zv(~P+G&mdm^D|*+9MG%OO+^Ihi;c1-A6CheZMx^N1Jkap9hcAiSTzCP)Jg6yK^U}^!1!GSw zLNWfvw9HJDkO8bLnN&Jx`z1T4;LTSxhM1r|L}W2y;|9J8lV^3m5CskM`q&a{xS8!} zt{Yq!Z1xE@KlFip3B!{m%eDX+_*Qej$!BIE9 zoJ`-{byORwKVr}?rpkkpw9Yn3cYRl!5eaAEQE%xj6y4d@=F{uBi0_1K{k=|sr#99K zLT2*zQ=4-Ivx8))^B~-Ow1?A=>KpA?;p5>l{sk3>6ZtMsv#I4w{mvqWr^XK2IcU4a zn^x&+$?a&e#bLso)M?=IU>&$toNAaRj%O_tZGWIqzkOO~*DtzE)1|XjLbB6wb*YoO z?FW=p)(LyRmcII`$yB{tGZv#xPqS`h$A!rLd0M0Ct35Xzds3%~#TVaq0pc9r6=#yJ zs$PD9P4LMvUyb|;e7ord3@cp2L`g~``$F1Ue!@Jppp(CAmV#>2Wp|ZnMJ<~w%m2(CFVT(gJvVR43|XzAci9`MN3oB7FYZaf`@ zSbA|oG5Ap#FyLe2h80b4X1g)>?>gYc)B(Itw!YluH;C6S+^7v&B@p%{xXKxY%`(`b z*uH&Tzcy2R%MB9Sr!RBoA!QHGH0K)%DOk~%aKSp4P0r)0$|hI;5M%;XQpm?H7lGDQEkm?wey@&GGz1k^+`rq4 z=BZ7$ZlCrwTkYgza3E`X_FPIOl9thd-P2oM!BWZN=4;;U6_UDIm|-;TR(`6v2qeW* zLi!!fuhjaJx?kl&S(Y#CVSrKK9FG^3zkap)YgSKkExG5z{Nn$|)K@@NwS8ZM0ZQ14 zq@sj0lF|wYf^;{cfTW0UL0TWBA}HP6-CZi6(hULv(s8A`zqQrhe|&F@H--xL+;jHX zvDRF3&V~B6psG5YLnU29={cifM!EOO9NMK+bMH+RgJgozOGNJ(tSgOdHLz&}KC1G= z4f7{QJ{9pGRhU1)1e*S|RnGg!f3klDPP#J(bqIL|77zp<5X(FVFF(jWZ5ytzi1wVs zFp?U()^s@kt(}j)&4xJWwj& zSOGm-Mm3B3=Qy={5U6TolV!XI`03RkyS|k82zVm0Wh4mFMYc|ND9^v>ZSAt>1{yQ+ zJ$SWR1MCYah$xRwHS#3CxbF`{8hAZGl|c+t*wZo^^FXTTO%N41W#*MXP#BvPU-1%7 zPT(NC=btb$$}v6y`)vpU5rzc8DXJHekx9cFp$km!!lKd<0D}kufO|wX3y>w=&+SJZ zVo;5Nsjl44%24MROdZgagvWa`B=YmOZ>a0<1-J-!D8dyXfdb8g`V=NbKDG^p5JICd zE4MvzFnm!+O$Lh>dbmnux;~AyqorA49YU$TKYeF^Cn-5*>~1=oyLG|Go^iAQ~EgYeZ_@ zSJZ~1(Y}H0H!=Z*_NMRhxh;MuMEj!FB2Cn>p^#10m^S7CdCz=M&p`%2%V0X8OTomx z6<45YWjjj_wfZDA7m#_XzC43y!UGoYc!*XCvw2X^4UU#xwPD>{bJ;XT{Cy};3aGJMatFm)R-I8)bXO8!w_2_o@z#xjvy$0kTM7) zj}StSkB!}PcCLze&jRvRXnKikM*6t~bQLk z`(x8FV3!xmmp;#(R`qPd(WN-oz-hB^ps(kU1oIGfT_`vKP+tInneOih8u-Cb$6IxN$66Zbo4tj^^`k zClyt6fP-isX9~ZhI32DW%+ptzN+XmLbPn9>K3njBEC~7SSiPmb0c-wv(;f%(H6m~s zxD(zc!-MIBHC;@M1NFEeV z0*YmEsj4o=6vWkPPw9o6x7i`qxCzeHKv6_a5WQvyJ9SEKJmb?KDlJU_&kQ(n!ONA$ znD0N~-0K-t%S3`SC>Y5?t{m~b+WE%<+WKI(*g>{9%gccJqY7vqbnHRGH1NlVc?Fwt z+Mq!d>>maYw4t;M+IK=4ECwsd6o^Vtiblx=v`mI9+)4HH6a*k3+YrS;Y;`D@TQ^{V z9UK6u(s@{>5QpaMuIM+SpvRGz@p2;2V9YQx#T5gPu(AL|g4irT-31{JLw6-1Y=y;- z;3NZVX%&dBT_BJ`5+C>qL}UgY1GR|Ak(Z?7X~jTTT+Be{g2UAp^6@~(xWU^uDdA$W#h7f}hJsLqY6)vM`)z7og*D9!X9G2`wOJaYVT zR*IOAFmts|BDGuB`i-S3;#L5g`qk>l6Y0R!ro}`?*dl0e-}Z-bgGv<~Q+TWk-=Jmz z0Nh<*AHm30^V94=Kx%K|>caWBoC+dN#B~RSd<^6^(xcw$PO)m4!LUnY9Av>I;O9@E z*bOo6a|kk2hQt&QZi6sU*eX)$W0hPqRl9bydcWEvRJ9%K@8`T6|0Vsb53LXgc0rvw z4Z$5?GHDlw&cxzJLXQ0hCpcq8X4w1cw6`6FCASWM|BdSF|UHpF5J~7kgqq zv>tieso_%72H6elhH_h%pfc=MQI0Zlo$V%tDmL8fqg82os z$%QmAQ-*`FwF095G+{}oZevmg?2L_5B6<{zC$msNEmwn7Ef`84nRP2c(n(D!p;;)ilADbu$Eeo{H*B5dC1LW3~z=7Jw#1T!15>3y>cI zEa)IXu^FPZL3-(uZLc*0Jpm}1pQ~~{-32FnDDQe>N74pg$_0(B0j7sKUNtQsgbBc@ z1`xXfD+k}q4jucjx1jnYbbf$COl{604R$7vG!%~`EE82zV2%Ow1Mv+$zzyK^=?|Ft z*z|M?CQMW%qm8x>ZN-otoCrGW@^ZqLH-ln&7G(cG$jdpS9|^rr#M(n)YGvRn0r-%; zZU@)83eb~+aHgRuXG(7pl(nE)NhU!vtmS60vqC3=)Iq_QGY_~sd1R{uV6c!Vs+?6> zAcmGqkWvAYNo7i*rzuDMA{A@rtr3)W_ast&K{968<;ewzYDHLRdoDLKia z7D9OPd6JZM+e*^aRpNIiQ~$>WSk-_qQz2$Q%R-_KKx>fZuV8D=8eL^lFbdp;r%V@< zV|w^0M%X0+5FW}`$gS&gCN>E5pDKzV8Uo#+?1w4GTh&<^^XgL|=73grjJn_gCkt6G za^nVyxP0;u;7%EhS(y$Wn1UMd$hb^CA=uTlKoTH^&!E_QEti@I1xpZd>TevVr1HcB z0;do7v1dO)W0B0ZF!OeZyntv%0Dg5)_wR`h<}N?-+ytBeV61q+yaCQW7%vM2PVQ;1=%*vDx%D@Hpc##$3P}L4YV60iYp#4X301Fopzn-{Zf4Q<>dyBu)C?Bw!~HlKdz(CjplY?maB+`kYL>1`{0A57qMu_zSP&Ud>fb8w%We-j&09wYk5u8>TGKBUGfiW>TbYFh$ zdOaAt7KH)RcA(@wE*!{l!c%gBg8~UdASGTKG|xpEdWd3>)ixM(LZd4p0NLTxv)1k9 z14jHbWEe1L2pUF3epnT6f!P2Y8|3Z*fRI747K96s4rLTt4GsYg1LXqc!06DWZ;%RP zE}gvPmJ<|j!7C7Aj*<~Lu2BvTvAiJUZa1N$3rtYxpo99c?z)|7x|oX01U>+)@z@9K)1Dk?9B^^`w`QnWzq{~G$PShY8o(;CKR97klQ37^l2pJmGBu?RDI7m@vXdojv zYz{mv2aZ0>7bG$V_s`NVCEyAJNoowd&x)=gX(_2OsJ9z|%nQ9}P*hZW;en$YNpX7H z($tkvu>%GSHTwMuRu@oI3aZ-$!j7KPLa{mjOBa~!h^7qrClDgRj$Yj$65vQ6NGOdl zJHlq|xB~^g6OZP5(zCRR=e4N%xPh(q1n^MM=UoQXF0upk-hdLu6jD)u(MtJPk`DOZ zig9EWOz&(0@CiUwlR~pOQcr<`?>Q(+prQyUL;$38fQ=QI*JL+GgQ)?4aqLhc0Pi0J zjzOYp`(qlOXB^hvJacA0&|lWTWDRvLM47}Kkq4Z{Phc7&LlP*wt^#LZ6=EAyU2&EG?1`VL!p!_Q=c4#k&AC0=$lJHVBaJX49y`&z4~$SOL?#b62mT zv=#VE9$IhL(H8=JWMXMa9{AjhLINRBxdbFScgL**!0&eOh(ua%kk3*=LCN?L=^-g8|3Pc z3ji6S9&QClF9NVmDjz@D0qa7<2|-pAV0HvzJY=N|kPA$rCSWRXMc=c4J{AbiMcNvG zzkr|h9dK~Ka^Y~z5Od8@0}>^Yh=AP80458>Sr>r0gD_oGI|X_KAZx*T(EivR(D*li za-V|Q7b>mZyZ5>EWms<$)Er>kXV~0!2%$WN+Bc$T4lqMR%LP{C*o~ng3Ei-po{&2C6h2J)^eCj4t)vQM8qhEB7u4o>ADtF&gErO5bfZvew@#FJI_%~ zV$R=A2vv=M7=euOWFU`)ftj3{DTIU&k)DB^3Ti3XoV$Qnlci?vIrbISd)(hN93c)a z?a;w7y)mzO&vUp%BPY1w@fd*FDBc3M-AKUvAg+VeObdrHDC}QDeHKBXV8QtY5J|Db z4#>7qH#&$u?n0IW4#xoQAk7O@FOVDvaH@o~wAlzKXIeM|u?B&OUp(%w_ z4nWBSG!Go5vo{*8P;UUmPM9Z1T@9)!ItW@2&-5P%2^3V=tAjUZpMei4k^%AZ_Q&55 zdlQkgwzA@nM^1(;Sdb_kCNpnPS{dc714p3nAZrraNYpq6?h}!V^jvqQwBE~|q87Jw zf|Y@a*r2>IhRV_zdQni*e+IZ0y+Vjm74~LMqr=$=}Cy%TL!EHgxz#!i1!`&VdOwQ|?G&dwaLx2-poJsfErAtX?RI94e zDB=Df9(|<<^-Nz3BaK1uhUzp0M>;3gsW|Z8GY!@gYSIdY>ckI_67n3>wc!{-M-BQP{2=E^kKc+lK@5G> zGl`d=ql6P^X#ml|k8Jg7H5NF4p&iMk&^+cbbiR%u7t;5jm*?km8gJ@_>? z1_4%T1djVdDR$Iq1K>q^NdKXHqrxXvfS~-MC&gN*k0e|fbwmZqwC)N&1TKkC5Q2d) zi&F72odmul(((e85F8BQL-X$;O!tQc4wzQQobBv}YWoKG$%w(wLpw>-$N`)i`yVHv zOrtCS@K31IB5MEu8AOY>rXX_Zp?V_PLlZ9hXRI+2a2;qU4o$q(BTp$izJqqqKpm5W zNojUl8qH>%w-BNtAv~%N!IpB@;X+o1_|>3NQ3b7;Q;LC;m+9cQ-tYsA0qtdGm|QhW z^!2s07%yg_cZq3%qU}{6@j{{m1^$nbkv?DywaE|NWgyVGNJgghQ1RWaw4)bV!3lEk zI-qc@I;c|00edszTf@oNbWRHW&<_M>o=E(oy^#%JMJgl= zkdj2h3hoz8N)QfcVn^f9b6Ps~<2>?hK|3{s&SlB>;5weX1Dje!tV)Q3V zEW?A`AFM}E(f|}h1fC;)W>Odwj^QV$%9Bwi?)&k7HwWwGjL`icw(pQkBZo0q`KFg6 z(33v<4`u;yu+cn)u=5&3t*B@5{AqSi$c|vHAtegH`zDvN%c7->!q8{tJ>brvSu1qO zV^eUw;s8&C{Iwy(HKU0BbI~i%_YF!1cR<$!@x{09?!qrTs0%s?2?%iRnfhLT#-C1f z5iTVj4NXZsVLwtBd4kH_@To{3LHOSM^F!HfKnj2oaj})iRgzS6AsJ^Za;A}ON*0XOGl{$9KdL^0L;;_fI=~m zh7`?h^c!eQh)L-f(4S<11r7K<)NrHaQV(5rJ`~8McB@t#t}X;MhaRbvQas<*9av>b zw{YCf2pO;_iCjGn*;t-d_B=;s@BFgz0LR`npN53Pl3M2-N78~nxbl$apRPu4h7eQ_ z$t%PZP?wZMi}MAvUTZuJxc=V`B1qw(O8546sIF;sz;eF)jR80U_?tMa7g%E*sm!eO z8MiEB9~H`f8layGIx#rq#?)WCUja36sA54J)s6~b^*WGLz(2thM~pbwwv0qiqNn`H z{`VPwjsuc_T+0EV2MW$FX!ebHAlefKGYKUEuynu~_&mT$-TcsX4?g$!?@;~x4;kwW zm9il{I;4WZ&!Ek1V{3DAQjy1a*9Ga;YT^8FN1);R6FX=fMIji&1 zs+#>y!x??5CHoSaQ^jh*43}M-@>KWYGdJDHW$-%O^{nn%^(6Msb&_Ic*Gaq!$cSdw z`PcD;_@k-Z73HzU*>@ZkX&RDgugXfi$Ga&faZ$qk^as4fZ3o`3al9&T=C&IzIv)+| zfR~Ni@ZP;s*5+Mvwopoj`ZE8`m8no-yyJ9%jbks2hRA#+HjW}!OFutSI4aRkC2CX; ziIkzkq}3dJI9PTu3SSjjTis}SqIeiO$fll?SmvBobug-+_gcI6<9>6l&CZLxJq6)f zwp#hU_7{7WL6CVH0TUgtJz&Qq0%rFGdWqeJ9TDO==u0aOe}NNc{=*BQJ)@=<)X(t# z_OmMe2oX18t|Cve&%eU1-eP4i?jIY@8ZGwkai9C$n04@uH2P#-kXvzwCT2E^#9KjY zeKsgWS*=5xRku&m)~=b&b)ZzMGcs7*_e`|&RUhmGu+p9x6pYr%S) z)zZ9o=+kpkZJ#-%BlgHPuh!=)j~dgBy)Af%PbI3$*z*^?Pc?c#Lo7s=fn6nB)69QN zd#&c^p6}P|9%(T^>qLbdVD~|C3+^gl4l@q%mYJxulsLobm^KFZKbbAoO{O%y4|xM8+5Dc zwwtB>s2VZGiOdN|*`%W^aqJ4nc3HENaejVmA>w{IeuL+Il9v#2|0r`!{Mvci+6mG% zL@q=)DqzKef*{G@9Ad?dBAa&Uw3x4WZ-lCg59zA~@CF~aI6R(Nm68L8 zGS5bRMr^0%@aVhdT>Sx_U|IerwQYwyze6)s9Y`)l(Ir9yAP>FVx<~8@{pwk+nS{9r zy#pm2!1w4x0>%ciYys3Cx-pSm|II`h%eyaR;6Qy;L7L<(|y|H zsmAlwF*oUL*h7OAjf)?1M>4Q5)j3)x0HIID)bzA*p=UwBjTU33Q9wsU`E-V-Q4_v&}uNrG~+sYAV=skVWpfw;nQ| z+|0|>ug2{6XzQAAZ5?m&C)xyWS!L4kRDV`+9pb*5+HJsfm3qGG+Xc&v{6#%eRLH4C@;j-xM}_G#Y+_KO1uWGUOPyT`BEUaMhNR zxG8(wgN>wpREGTcG!*rKzyPhyK)a&kE9k1Y_jhOOF#rhY4=r{(fX8j(hH=ie zS624`nFO8q@Wom3PwMS%qH*##I09P>laz~@s1Fxh^?7H`EfL-DzE?@Bp@Jjt=Vbn-R#Mq|y&2ysi@az5NQ-e5j8rltFV8lg5qx{~VKwlBzt+tJzD3b@sI_-M4N~ zKO^prb%>SAzKCGMC*+TBik)8HPzntV3d#e$0ZLGb6EE_L{^@-uPT5oI=7#jU@&^J~ zl`G1|wNg!omShsN_1P1RxDzk4MiU_e;rL+4VK#XSgh}He=YZw~es}i)BJr&U%_ayS`su2evtSN)JD>umIpXX2&bp&=n0KxRfQ!%Z#52T9?0(eLB`b0X`Y z=Dg57BH_@5af?e#e~;5G>U$46BlRn4q zU`<03k_n*%*@HhZlAvBC>#kK1l+S=zqMcTt9wOcEy0##nv4I5+W$Umsdz4tIN$0b($x z2reW0+s|+QBY-eabv^mXbDU6ccgdRKyKs`Vis;V@ooF46J4URoBd$2e*$+}n6N=z- zm}UT9kggmDparAVpwjPl1c7wRqB@>Zb$cDPPqcAB)sB=NP=QbTs`!?vQ{UktI>mdu zAp6gF%l?Ywshq!f*g4*`w4$&X;qo50rChgzOs~#Uid(3ij_O4NB;4`0z6kxA>$zX< z4XHXW*YRiZkVCBy#fe(pG&%qM4QTks0gqNd6BN=zyJu=~i{_@bvOCQ$I6}Wz}h~X}O345Tz2M zKbHOPi9`kvCnew#I1~a-QRT2o@4zaR=Tvh})T0u7nFn7JpN%pj2;k|NGkcCgTBz3@n5W4Fn)Gk7gaJ)jjYitF{#QDCeq(ivtl@ z?$^#!@zHPs;-Y3)fX{X8+)uDEi$imVs*ObFQA6J_4nmrt5NAT+pZ5N5XHDN?t5K>~ z0bLhrwCPn1M0=7nnPzYRvN{gc4sJh*H-k^vug>;mljDFs{&R-?vAK(M^|BkWOKPx$ z@jgM35q?QU;%{rruYg$)e_Cv*CX>8TzreoHB zvNe}z&snT}kh%dL9$rF!bH9P28-T~)JA{L3JUpau8@^h>IwQyGM)d>QFuu;asMbwp zhB``V()*c_zd5(@{jE(Z4kYm)E7F-T@kkTeEF7e~^YUCZk^iLx3ClsuRh(+QC3dpA zCh~tr(<_K`eTQU~%TN5x?oG@Q&jx5Q3Sr79Rs!(@7j?c9pCM2pr4#pUVq(6rBzhhP zSY@R!3!MJ$BwR^Eol0bmgw$pub8D%+%}`lFqp_f5tRMt7U}{nxrxlr8+l2}5%IH*m z_5Z(*8A6i-a3p|tD1HDlkX>Kq?%wXM8HMk;V*2ZG&Kic`EW;1utjJWdcyRnx$FE10 z$IqYndvKaONGIadriGibWMpKyRswgLXiX#9LzUS}@Ck~>ole{4aG?#c)ds_`M#CPS zb7Roi7$sd^JxzH&__svg3@WN9#SjHHu`9+RPN}WLQ})Jl2GnMCE1Wa0SEaP!P=G0S z>)-c5bwUE?Wx0bH#oKcmK0fLDuYlPhI`II;SK25{)~e&q1?u?^gtW9Sfh^FwDVo6H6^w5#}qCF`IT}pQu>*g=~`wT~TQ+pdp_`^T1 z@qTVMZd~CU`t#t#qMn}T?>SmdDFVgJrnL@OnxaE@Jf#0O9ELv{!WST0t#e%YB%T^* z7?vg?DAc^Cyt^mOA@gQ%(vW$no4zrxLhRoM-hW+m0L9fycTyWqRnFp8Cm#-vgMNDM&cj%SSBO zbMxQa63^|=#2>#8s|ju%15Z4Ejh56nU&=J>TydjU)yzEEzjvG;tN5U;i%_xBHi$mK z_eF?a&rRu7bzvKi4lliT{#c@azh*7t)krEvZRXRKpq$B(%mH5>>Lq1H0h_~nMYokg z39spX(tm4r{I|2Iqa`2f`Gn0`W+m#I^Yq+1=7GmwP@4sI-U?Lj;r{n~k7EIM>7gQ5 zD;AY_vnx(|#UfCdU9^XBit`)eKpwwX%}EqKk%4+r&D%^0^A2XJRbS?1ju($^%oFa# z@6aVu;1MWB%6P4AMGaVV-nkI}@#sIa9wk8g-$N4?l}rM6z~Tt-&W4{0cfsfDxo&U| zic(&Ur^EQg4ha!UmCT=@zM|oOTmXXrQ4`P^Nvo!$+5cv$d(UAFv$!daD6r^(k%sQS zX>oHCpAOb~V!!S#0dpg}qW-OeFE~-}(OB~^G<-J-Aj;(Y_ZsSjfg1Uo)gw(a0O#U{ z|K}XCmRmw~9%-s{Vh$V?SuI&;vK^g7Q^6NSYh?MvP#zM$y|aGijNf>oakR)twIrg2RWSScMSXhpz-QEi(yNSsXCnCoT0SmgABh6t zae5dJ8ZNT$c#^=Jy!GtJY7DL-PHDsuUUX(G!ewXQcKqfOCS6{uI#IpIwUD}kK3T2t zv3WTi@x8%Qxmug~V6)XW8Ev$-$l_cy%PAKtV$;3Ew$R;*Bcs31r@t@gj&sc|q`KzZ zEAXNH3c1_x`rajV$)}xYaoH!q!M|{8sTRz!{=coLT-94@`byMOqxpG)=I%4ka`P-k zc25Qc1+QWkTZ_*RUS`NACz8Jwl8nM1P z3mh%4l3$f>uB|}>Rv)hp2m597KhL=y$`*1Mda{-^ou`eo`RR&At>oKhBXYWZ^=v`4 zM{}Cv+VuwcTHBa@{Gs2i{62VTGAc0l?D&VH8(N(F2Oufx2QW`9&)BGw@&76Q=8V* z+1N_@+=(IGzr-SXqf9}ke!d7(#kq9+o%B1L?ZXDEH$;9oaYrKfE1^!`UfA#JPU?Q2 zI5>H&@ONo&@1hgSz&a1+WfD=~r43IPj+VJAWGS&7DWr+Jc1fCXY&b(_jc>2bwEk}A zpUN9k=5Kd!kyQFy=jg1Y7CXmHlSFFu^ZO52Nt>K4iQrT8|ff_R^b_?R?nFr^`5 zy-vG619<^T;j#ref8pEs^LsG{rP{$wke1esR^HB$V--}pzqZf&wMNuJoQO$TJy833 zjP;fu$eavHbaoR=*spH?4nKR!>{5M15e9&SPWl>>Ylj<@R8bsX42I5Ed#`?bDpS{RpR;l~@FLPGmdYZ6!D zgR2KiwJM~0fyck9I__P`^t8k;v9WiyirDrHaJ-)Vg{Si9$3tt)(`|J0gC51xki|Z? zelcC=8Ov`$Lf#pZ5b(H0OW3FE%_h;(2D@hJht=TIclok6i{Za=SaHH$-JVXE3peod%BMRmwWlFH|3KJqpLx%c)>qKw zW!}(T8N8cp?T*B+!kK2y!MEX85*uo?i=3zGi3(?`HF!|^y6Vnjj#`V+IJ&lZifFlj zM+qbO@?NCtrC*=QsT4laBjwA<_#*I+bi+j_oWzry!BILk+hgmMB(l*3(F2o3D z+i_PVg22Z0#nJAn%w=Y5`cJNl` znvd7O0l520&RXlMPvtD1X@a-%@<_}MGf9HHl{snh}u+$(;5 z$Sm}!JEZ8tQeV&-89UbEQ3uvx(S50r zUsW%fyug{T^_Vm5d9}Bro5mL?sXV}dn2sX|{u0o^FN4iH5o#RB%#f2v|8}1Ge|sPW zor8H)GXApN*0}tz_Z{ZQTI+lz5>Ik-^ii4YFiwi!2ABsZ-Qz;$T;2iarl}?JrtWU5bqq9FUj>C4< z^DX|Tq=EHL&~IZO&!{R2XF+l`XA8&Ude34mT_P#idVm-28b4ogh1wtTCN)d#OxB^Q znNot%&I+lAU1t~K(kB0_7*#%-bUR_I&V%a=HN8l`!CugNu6NQtxM8){=W7>7zW8@b zX1Y{GaOgSKLb%sMvKh-qH<4|9b#`w0*r)RSho?OfQ`@Z9A3tsxFnm1Vc9@Zaz1pio z$$DyeDnNh7uGh-e*Y8o&lda=d9+{*V_{X>0Lg9$%(8LEL$y%iRR?PRvb#>ya^-=pa)fnFP9M=s?a z!~$oIeYBoDVHttf#nJO&bL=zoNLeBr8=jJjV~ZXgo_O9N)d~b_J^3q^- zZT-!hpQ6<#I3S8O`OHaDb0x*vNT&HHS|;_s=RU85-SaJx-=o&rP*shYflrBF3Vs(3 z%uoINZ*B5QRBoQEE>M4p&)j>XWpEU3KpwKi+m<{vpM**BDSZf2(w{uvp_w*xc5efgKf`!a#gW4CkmE!kZ7i&CEIJapYRimVVU zxqr*pC%EVR&3O)=-lk1=&Gk3tQqP}Qm0Zhssq|QX`m}U2^PTYbMHb`VW}O5k#tp}P zXvrx{e4bIYcm^mL=l+!5TYiLR|6y!)&W2gXZLVGpvq$hL@ik$048^e@+YW1TKXr9q zzEHR!;Xbhyn>nC9nk|>&^77Oc#`IfU{nZG(Z4P@`#w|O)$6X!57K7H`sT(!a!?R1j zN9I!f-$8Gdr=7^b4;#XWfkE`NZaXLc)|%oH)5NF19cmUGs;K*Tg#Hs z_3bsIr9Yy;+8;_w^d%bvNn_M+%Io{-$UI{>%}kqaTb$2i!4oMa+BEXL((CqWj={dw z@Ye5r7v5weqo3XJy!PKlF|8jgn_~5oTwV$Y>#Z|rruseZAip}aq*yh~MoVl%xc1z} z^wW{mQrkpg#?rxu+IBw9z+e`Og11??#|mhekG;Dwu4H*XyEr+gxVWz`*=M16vt*-x zL#y(~redXrxw+3SR#iMhBQrte-1(mxL?_-_y!F75`p&~S6SeoPQHGA@ZV~^}fHgO;f+tv5CuBKE^XPopIC3nuuM~SQFgC6Dm^kSwOni4d^$=VIfU;|+G<95-gqb~ zS&}`;k4S*y{dW~6y}>MoMDO{Q0PEf6(wshJHmg3DBaQ3>Zf{x#7t*7V3+Hrg4lPtw z`f03E2bD1jZu$-isq*BRUkr|~VZiO{oA-~*78!L7 zW(AscpC!Z6dV63}^Od0Qb`-9Ljx{jw$Z4LeO*LfBgscDHbaEjEx&b7w02}?cYC2$S{2*%}dGjo?*P{#N3rvG_aRaXPqErN1LNM7h3)+Ir8{g3BT%ofK7-ldrMvymj60kl)y& zUo^kyA=MQUog9#~W*if(v*jN?BOM@ZZ|NjoZ2xsqF;K-iPRU+)-zHmQtEm6@f=k4+&k#A*G`e&YW8_q?91SQ%r1lA5C#`i<667Uh9O7k+y+|Haw^#^6ge zN5UGK{vXwz{fKbhXZu+!Uh86^8tKB^t+GT_Zss?@I9x0*wzoAu8}DcO`|a`Kl?9;; zt9Kddt~riVGxNR$!v!+RVtY>Xni52dnX&?#bnfg@j^(rur1K~x+pCl^zFfpN`+>9M zV%+oVa6URVu{d&Ykx44oYKWzoYkjcfiM;AkcxYnO0}bp$dj=*7rCL2p`DKey7-&nuDbb$&JBHUX=>-%pBo80^;AC3i$J9%$m{yhfZFUw|c1-8f~4Pa|f#& z!IvYR8&aK9W@&yG=*o04%ELNFw9oAbnH8ypw=XbBeMFZ6T z`<-UDB>jO>K2R_ude6>$q%n1VDD)__ME!S1kYZqE)i$OTVVOceGwVc$tGp z?4mrQ*_OsuPMJPoN^Acx@6TlJ$bK`YhBNm?4Je-pX6XxUYEK!@%m*lwnAV@BmkuzN z4@=i`s4lW=u6UxCcRlbbi|JLNx^v>XQ)U6D&3T^nNB9nLXPP9{)Vz#;R=KL1)6hZcaUoq+u1l&x|A+u zchQy}$!*BC!qgcujx^G$*!*vx;!#^;Q|so4`FP1z4f*L(U%UwZJ0{H2EWXxiXzPIu5q2_J4C!>K=$V#qW=cg9^xl6alAk&6W_ zJG6$hSq~paT6TYx=`FggOe=MybHvum%RL+7RFiY0w@=IxX6I!_K5yH;Dl%&`qnlVZ zyh~VSIaF~-!aH9$qnqs6K)Al*K+?#;LYXFzrsp7piCc6Rx=2xK=`yw$iNPk9nn)Pr z>-1-CeLH(t)asgEeC=6Q|59w3d}^$qx{K3>i@eBEY4cH>@J=;mchZ5s(lEX+B&Rz! z^gzvqzOCkd$60i+eFJdm!K??0<#V~LVuKWO=nG)k0D-R>b3pG+%?@qa$(14W53uOWxAFi zCiUD9hi-GnsSS&@r&W1|udjqKcbpB`Pipos@WZ-XH!!^V-;IqW$26b!L;_t8BS-p1 z)t_}dZHrA*bjLTbaWMaoQ?_7hR9O3NWTr|umyEO~HfAm(R8GgD@<<(6>tzy&XKJj7&x30>~N zCFg$35Z9nQW^UiK!qzpP%4G~=Ihe1$QkKp6ju5lklm9Jy>_If28ux~8Q?nn1y_qXa ziHwvd`=rJdcZk9cup*?HT4lk?CvQ0RqEfzB*CZ@BjXo>Xe`1rk=(^5ZvDZ0jyL~6QvZQ3sp|==+FdHkg5U}1>DS)YCv*Mc; zmh5AdI-9-k6gfmm>HcoMi3f{~BwNoG8SZ>mdvi%(YkE_to^^kde(>jrqGAr#bu-y+ zk43k-s&yfB)bW1owjTE6xp&&4O~)nIxrYkfa-Z!@lnx2$Nwz04NqZQ)ClXUgI@Dca zyjkb9zSR9}cj%R{5G{kl#y5`)F>h|;SsWwDFH4pFyGe>->p#7egtl`r0acljdiG=K zl#5PPv0L*c!~AZW;`hH$XAhKB*L}N{o7I=(@7~MFM$cC<=kZ?*<>Fp@Xz8q%&$Q|I zcj^c(v%HX0uEnLSw>R;z!|vWgIt|t%MO#!JQqclxODbwiIyz|q)^&j{_56;mFy_Pe zTgHUwmCt$M;`|CMQ4jo0c1=cD#%J1D#egY`*Un{8 zWBJttHq}hE#-0zmPB}RKiZu`HX8f?RMl<(1Rj(^OP;$;Gw)!r1WH5d8-N8E#W^S&A zb?>Q>VDf7&W5j3zvRUnTsMVJ1o)lW+a@{^nN#*mjFLZvFP`*2ql}~rTKd&eOMd2?XPFSx-Ll6dM`!BxmCjYgVs~SIrH@%;)plWQF9qD*KSMb(H4t z%O7c#-sebKslzXJ%9^0etoqFyE%G$Li+DL_UWdcA49;1T18o7-kk7Jf0*^0x84-P9 z$HC#a`+Wh8@B{sd<+b_n{)b)$CJ#nGqmzkygWJ)tSE=?PwuHcOy>sK*K@<(c1p@P* zdHG}lw(s@aoSqcWYbnqO`#tBDf(U`DF^7ZusF6F8`)St$*=r&?@H`pjcNrAEuTyoTa-&)sdCpAEB?424hB7m-pmAu#uc^vmsVE$y}I2yTP-L+vVrm z7dq;ZBRLNi3wK*N4tD)#&>Gj`vdZA8u2z??Dw2xboBe4Q-xy!vSY4H@Q}|9|_W6^- zkspU6Y&X_s==GJB_9$n61r^< zqXLUl=i?4nd$iDGu#6d9@l$nu7Lv24flVvi=_cTI(~5T;*|!KKtc%iETd^0_x(eJV zad0Ny{$;Me7ttniW0aT87iB?kV-tH*PTnX=R1;f zYpb&8nfcwNL&tf^W*Ud?6I+xSU4&Nq+O>|qsd~97Hp?s49moA7L2G!u8k9H{3nfGQ ztoYjMuYYy=3Rf&xQ6*3nVqW6QgFs7v0v%$sW8XI*#*+H~pp( z(Mc=AACgCVFi%cJxp-$(IOpb`l^(ZXCtg2)$x`B87ZcmfDdYRL#w!}!-^Lk-)}BRL z3cV=Y&<~Bx-jA{n+W+ks%edcu)hixi=>Qr_*4#U7Bg4Mbjg~h4*SCGxiEwaYlXy7K zJidyzonaJm6%pGaZ zI()_p1?$bVBK>2kG@Ob{R1Ou>f=egf8-#zvgVcKL2X>-+opeN4GM2iEYFrmb8cFE}OG&4UGxIUYY_mrqrPSr^VFt&0 za_wvM28+awUarViEA9H}Pt`o7F2vA;E!-K@x6$~J?I`P}Q$zRsXp>I=1+LRb`1`+4 z=E{D1XZX|uCUp;kQz1D&?$%a1*}0_0=;}MRxYW2E1)63|yO-8Z=S`1pbJjM0zvb85 zktg%n)C32|`ND_NO<(pqvS*WmnMB!75O&kx9-S9|dIl|P=L^0Pfz2sKI~u3Y37)z6 z)NtAwtk-#m*sEpVq;_TBD{U-u4B3FZHZ4wUIwzag+Csj3%Y}Qk>l+n zj+1T|V7Ah56HSEPyk0$f*(*+pxbCs_&^PH<*H=>{y_j7`n=kE4;lNJaV;T_B%q8{d z?7G!Gg`}F9`tkSgPjoR@AN$JT(B62-!vHRnl%CE|{`&==)b(tOh_^Q%DUI4Bz&z?= zJnt1A^{Vme-(SkfVJ&Z&y>z|$g8K8RV(&N;3kw-m$;5S{%US967@+xPQDkmRIX}{q3K()zi~M z6Y9%u)p%Fyw!j74OFjRC)*;n=J*wKvJ&_1}1mXPGzhr?UYe);(R-FEg9Qa4WAB*5!x##C)Z zFnj&mqMds>I<8AKwYP4SU%xa&DyT7(A(9R*FGBDKm`uASJ(KJMy)9U(yR>3Pv?b01>{Ere` zZTS2Cr|QD!!ukHpDMeXXUm6BBf%X~cSC1OsPCf|OTpYmK(B9nzMTtUyZC6~4u==qR z4{P=GtbmvDbzA53g})!XLDbyXv{`=Py2h7~{!$}w`GQ|ek{>7d>P;R2FZ5JM*o1FW zR#w(}`30Ik@j)WAWR(sm_@arfDEZ7Tho~-+UQ+J zcYBXjq}6C1hM4ZatRb3^r=XWAnBcl7$xdq5vUK6qr`b^f5k9hT(}3{5gKG&?*K$D{ zowpx?aX#NpH3^|HJ^Flro=E+LVVKxCqNL{K*V!alY1!Eu`4^II{Fw|Tmh?`g%*>j< z-~rfWsQ9D;)}d?S4!lD>zX{n7TtreU#%?~i#~#nV8fl!W_YC|c@@KV|fYGp2SL023 z^eTzo#u#L(<*dR;!Ws(v?H@~D`qtIqF8?KxGoduSKr}A@_kB-M>sy++dfYk~-r2(x z-|!pV%dRK&z@?_W7iUftG&53U9ENXH^cViz5CykJKoLVSH{QPFRXm(m?I3--DMg@3 zElZ|23BRyqxA@*OAZf5di<^sUTZj0g9>{a6Xwsp_O+f@HDW3BWISP$9JqNykB<@W8 z^>VVmPyG}$+GZvuAF&k`V^3nYDkK5ujvRzJQy z0a~qqq;9$BW)-PlVmz65x2uD2aL)2biQiK(Nuo(F=gau>wuzO_L*)4p7c>_EIyKIp zQ=PL;%+}Oc52({ff%9z#D3M%p@Rq^LMt}yW-m(EsFKc0}hP59X{zz$!gmIKauk!kF zXaFG#c8WnXy3X^Skif5$--vT!nC+D0{3aVpBUG@i2s3WK&@9;gaxYl9nC^O<=O8n8 z&N($3(-xzc^x%5{jZp22hJ+%9{E=Az|rNa5M5j>GCo4w8ki?S1mx8I zvWZaUYMy!bYLS|rNwSdsWo~M4d+vJa)lW~o&rl-o2^uM2YV8abt-8o? z%{JCG^n|VHXyvW|8MlcC%^XQ>%@Dll7U+#|#=Y{W&eTFw~fbk$W< zzcrjoI-tn0l?>X)eVcjLasJOxwnW>Hq(gfVsV-9G>A9Flw>hhOcS$e}nm!x;;ZGk1 z#OUo5sRPTcbose|96EEN-uC;hjxD^I4Jgj~{}6X=DKdWocXY z1P+eLR7DO*bF&Cp%kDxDZBqN0KfWDD=;&+h0W0w=$CcQf(=I#XY>n(h3nP`iQYpFj!_?$Y>Vnl0!6Gkt4Wusg;d2h=#>snVKcl+V$(- zsRjGCIW(z?5U|goG5z`0GlJi-pwB`t^Xs%kZ02!}AzqTv4DOo|=-WG7QeBHp!xi)I zGJAeJctu3f3N{}qN=ga1$MJ3nFg>(MdEXt=FxMeazV}D`6BSIFbTIzNMy2>CdzV!wY=}>7 zT4l~&Jl^G~>r#%^!#)*bHoUi}o`_$4E(qQ%9i&gA;z6){|BFGip5Q%A$ge^d*DJZM zPi!oNr#c;Br8ls_^isRf#32JZ2<+-y_WK5u#pegC$8c~cB8@aFHu|(NZG1CDnn#e| z?+%L`reTt?E*V72@={}5x|qIHZl`f(QVtraP7M{e-JyeB?6qsl<@|Bx;QCzptYVI? zHC9BVe6cutX*S0@raLCXU04mzFvs704?DxFo3S7DhQ<`g*cC8?opT7H@4>cumjqcE z>AoEE1RfAF#}DY2j^MmquZc{Vlx8^!4A>GJFR|x^2BrO#wOD>>;XG`~V$Tcwe$15g3kvNV z?00L*@|?*sKN^O`9~?T37|MYhrlEY={$OmyJAsv;J%N!>Y>}YfrP7Ilg|GxW9Y0H^ z#rn&olnoP#4V2o}0y!qkDPfeVKkY6RCYt%(pDMB_q*S*Spd0dITD()RP-ZctR%E2x z;>UF50|VIy#w$JyX5V@!%++j)G;a%}m@sFU2-5W*Ja;W_A&}%+NxIQWA)?#xB*mnq zJuikv=+mr^1X6W$qo_3Ny^4l0(v5MsJzc^kQ8rAExLjm43+M;FaiFtd5> zy|6Q=b>4E>;+$ciAdp&>@DSSk@kChNvkfiLIKqfK)(PO7mjqoXY|Dg5CQO!5reuUIROkrbILTjYh)gS5KCY zRfgcS`_YRD4CPPV$+4hkt)y-78L%E;G5Gnb#$BafA$2#!k!_oc#WU+8bGH(NDAg~V z?6%h+uA93i&(g2Ic;GXS#dhyoyk0bg9x<@iw1M{D!-Lfy(aCWNsfk-{GK*zAzR&w& z8E1Gm{Un*w_+2R_@HxsZ9m!DFcj=vJTGm71R)^>1OP6M$A(EQ4bv}3lr-LsPsp+XK zCCQ_*7uEl-y>tIc`VQmx>f~mwT9&#k%6)($%2`XMNQZv(~ z;A+W1G)l?N6h(zaLWrrMEle~o%eNKP#9tg3hN$GZDpbB5$`suQDEI+CU*b)>A94YbfE z6+Bd25Ijo|8>N`dzQW5tEMe$~0dO|aGpZi$oV!UypLCRWat+UNNV^4L_1MY0lLtv{ z*HOI(_Tn)XWp&LC7rIRI&mug^Yd2lxQjRf=u-{_?JR54!rp#*gb7^J=*->d{jK#pP z#6=2h{~&fpx1G1`eLHU$lT=hXNrgq|xcU0_Q%3|n%ZH!6OPR_x$#Y+b?{Bomj0lZC z2A9%p71JqRE_FD-?!ZJm2nL1yAGJ|;Ph;n%O1J<&irqqE(3#?6#< z$!hS;oU{3^UJmR@yn@P@B2E-`8P=bAtz7xr8J~38JVVp_iaa{ElcNRQo$vAznnFOm z*?S50fjJ~s&RGg5F@UvPe26Xt{n63N1H(Da%*d)=6MlN1KJQNnsV?U6`uj%91%D!O z_V&W|_-7N#7jQV7u(TQ^-aauh-pSA(M6InJ{SE`D-M?7Rv{ckQkKB5G2p^N-`}*|= zqCM}NA`uw?OY-WLWOf}43$Pgca*RZXM4>zEqHYSjy&@gT*i(AsQm$b((<0;)L4aZ0 zVWUxfQZ3`Q4D1p!f(xUX#bH#9?O$mnE$JMr_QQvZ%cbdjKRGeZ*? z5>gH7deb7SsC797;+WXj`DM{vQCw(|P$+yxTm4M-7I2(xnpbHh$=!IsucO?T0QaMb<3f`BYxR)p}>&xE5T{C!KELAymFIXIqMg)wYtm2z-y6ALQd? zGsr?FG>SFqN?y{Pn$E(SPW@MH6g=!lW->xqXxhCvY@8#V+|BGHM2sv!Miux?^?{3Gu-g97zAg|_Zwg!YaWk%RwV6vUKn2B`fCxvjU;prm9&i%)3 zm48Qa@{J8@=@#IK6YFE-l`3)R{J}Ss;1G z`K^uhG_Ym{i&g~UqqJt$+oQul(TiGgqo#oaEDad zEJc{(%n9o_2B|pWk6v~Zm;sD$JNgIWas$VQ`e?3gR9Fc$hWv5tNxK2c)=H$72*u(7 z0Acq_sEN;l6eZXsYXXgr2$d!0ivh}mzqq*j8=Z`pP$N?q+%~qHBeRKQhctdBp?AC?m)WhOn zv>^5H*o2fia`o{U&v2Fpzui`qmPs|*9;Tk%@fGyCSuV$NFp^ze#v9DSKNLOP3LOK9 z#}`l%1lh)QDG7N$L74$$Sq~v84w=h(ctYNu1CW4*Z2S5e3gqdpukJ$LruE$l$oq7; fPv7qU2$WUxwHos}g&h|TMU|JkubbHQ^yPm6kpivu literal 68315 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 Jg6oz~{tr8FMppm; literal 193954 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

      AJ0W1e(FbtMj5cYQ4LnlmtdCYoj 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%0DNdQ=}P__yAFMy@Q{5Hx3 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 GvmQ2%-^Evbp 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