diff --git a/CHANGELOG/CHANGELOG-1.5.0.md b/CHANGELOG/CHANGELOG-1.5.0.md index d3c54ed306..487c34e029 100644 --- a/CHANGELOG/CHANGELOG-1.5.0.md +++ b/CHANGELOG/CHANGELOG-1.5.0.md @@ -10,19 +10,15 @@ - Redistribution is a feature that gives Service Builders a means to not just burn, but repurpose slashed funds. - We introduce a new operatorSet creation mechanism: [`AllocationManager.createRedistributingOperatorSets`](../docs/core/AllocationManager.md#createredistributingoperatorsets), which allows slashed funds to be redistributed to a `RedistributionRecipient`. *Note: The redistribution recipient can be set only once and is immutable*. -- *All slashed funds will now be routed to individual `SlashEscrow` contracts.* The release of funds from escrow is gated by the `SlashEscrowFactory`. The `SlashEscrowFactory` deploys individual `SlashEscrow` contracts per slash, enforces a global delay for all escrowed funds, and handles pausing/unpausing of escrowed funds. +- *All slashed funds now follow a two-step process.* During a slash, we increase burn or redistributable shares. A cronjob then handles the actual redistribution or burning of these shares. - The original `createOperatorSets` function still exists. This function creates operatorSets whose slashed funds will eventually be burned. There is no mechanism to convert an operatorSet to be redistributing. - See [ELIP-006](https://github.com/eigenfoundation/ELIPs/blob/main/ELIPs/ELIP-006.md) for a full description. -⛔ Breaking changes -- Funds marked for burning now go through a 4-day escrow period via `SlashEscrow` contracts. These funds are burned by calling [`SlashEscrowFactory.releaseSlashEscrow`](../docs/core/SlashEscrowFactory.md#releaseslashescrow). - 📌 Future Deprecations - The pre-redistribution burn pathway [`StrategyManager.decreaseBurnableShares`](../docs/core/StrategyManager.md#burnshares) will be deprecated in an upgrade *after* the redistribution release. This function can still be used to burn shares that have been slashed at any point prior to the redistribution upgrade. 🛠️ Security Updates -- The slashing of burned funds is no longer instantaneous. All slashed funds (burned or redistributed) now go through a 4-day escrow delay. The eventual burning or redistribution of slashed funds can be paused by the `PauserMultisig`. -- The upgradability of the `SlashEscrowFactory` is controlled by the `CommunityMultisig`. The contract will have a separate `ProxyAdmin` from the rest of the EigenLayer core protocol. Each individual `SlashEscrow` contract is an immutable clone. +- The slashing of burned funds is no longer instantaneous. All slashed funds (burned or redistributed) now go through a two-step process where shares are first marked for burning/redistribution, then processed by a cronjob. The burning or redistribution of slashed funds can be paused by the `PauserMultisig`. 🔧 Improvements - The [`AllocationManager.slashOperator`](../docs/core/AllocationManager.md#slashoperator) function now returns a `slashId` and array of `shares` to be burned/redistributed. **The function selector remains the same.** @@ -35,7 +31,6 @@ ## Changelog - - feat(draft): `AllocationManager` redistribution support [PR #1346](https://github.com/layr-labs/eigenlayer-contracts/pull/1346) - feat: redistribution upgrade script [PR #1396](https://github.com/layr-labs/eigenlayer-contracts/pull/1396) - chore: bindings [PR #1422](https://github.com/layr-labs/eigenlayer-contracts/pull/1422) @@ -82,4 +77,11 @@ - ci: disable delete unauthorized branches - docs: update addresses for mainnet [PR #1341](https://github.com/layr-labs/eigenlayer-contracts/pull/1341) - docs: enrich MAINTENANCE.md re: release branches [PR #1340](https://github.com/layr-labs/eigenlayer-contracts/pull/1340) -- ci: enable auto delete branch upon eigengit launch [PR #1339](https://github.com/layr-labs/eigenlayer-contracts/pull/1339) \ No newline at end of file +- ci: enable auto delete branch upon eigengit launch [PR #1339](https://github.com/layr-labs/eigenlayer-contracts/pull/1339) +- test(redistribution-changes): passing [PR #1511](https://github.com/layr-labs/eigenlayer-contracts/pull/1511) +- fix: strategy manager gap [PR #1508](https://github.com/layr-labs/eigenlayer-contracts/pull/1508) +- refactor: remove redistribution delay [PR #1485](https://github.com/layr-labs/eigenlayer-contracts/pull/1485) +- docs(audit): note upgrade rescue flow [PR #1467](https://github.com/layr-labs/eigenlayer-contracts/pull/1467) +- fix(audit): assert redistribution recipient != burn address [PR #1466](https://github.com/layr-labs/eigenlayer-contracts/pull/1466) +- fix(audit): more reentrancy checks [PR #1450](https://github.com/layr-labs/eigenlayer-contracts/pull/1450) +- fix(audit): out-of-gas issue [PR #1459](https://github.com/layr-labs/eigenlayer-contracts/pull/1459) \ No newline at end of file diff --git a/CHANGELOG/CHANGELOG-1.6.0.md b/CHANGELOG/CHANGELOG-1.6.0.md index c69f5adf78..5226a9afa7 100644 --- a/CHANGELOG/CHANGELOG-1.6.0.md +++ b/CHANGELOG/CHANGELOG-1.6.0.md @@ -42,3 +42,7 @@ - feat: release scripts for moocow and elip5 - feat: currentCheckpoint now returns finalized checkpoint - feat: implement consolidation and withdrawal requests +- chore: update eigenpod and eigen impls addresses in holesky and hoodi by @bowenli86 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1448 +- chore: add multisend parser to scripts directory by @nadir-akhtar in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1486 +- docs: update version matrix by @ypatil12 in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1491 +- chore: MOOCOW audit fixes by @wadealexc in https://github.com/Layr-Labs/eigenlayer-contracts/pull/1496 \ No newline at end of file diff --git a/docs/core/SlashEscrowFactory.md b/docs/core/SlashEscrowFactory.md deleted file mode 100644 index aeb97837cc..0000000000 --- a/docs/core/SlashEscrowFactory.md +++ /dev/null @@ -1,217 +0,0 @@ -## SlashEscrowFactory - -| File | Notes | -| -------- | -------- | -| [`SlashEscrowFactory.sol`](../../src/contracts/core/SlashEscrowFactory.sol) | single slash escrow factory | -| [`SlashEscrowFactoryStorage.sol`](../../src/contracts/core/SlashEscrowFactory.sol) | state variables | -| [`ISlashEscrowFactory.sol`](../../src/contracts/interfaces/ISlashEscrowFactory.sol) | interface | - -SlashEscrow: - -| File | Notes | -| -------- | -------- | -| [`SlashEscrow.sol`](../../src/contracts/core/SlashEscrow.sol) | Instance, deployed per `OperatorSet`, `slashId` that stores slashed funds | -| [`ISlashEscrow.sol`](../../src/contracts/interface/ISlashEscrow.sol) | interface | - -## Overview -The `SlashEscrowFactory` handles the burning or redistribution of slashed funds out of the EigenLayer protocol. The `SlashEscrowFactory` is responsible for (i) enforcing an escrow delay upon an AVS calling [`slashOperator`](./AllocationManager.md#slashoperator), (ii) deploying the `SlashEscrow` for each slash, and (iii) releasing funds from the escrow contract upon completion of a the escrow delay. - -## Parameterization -* `DEFAULT_BURN_ADDRESS = 0x00000000000000000000000000000000000E16E4` - * The address to which burnt funds are sent -* `_globalEscrowDelayBlocks = 28800` (4 days in blocks) - * On testnet this value is `5` (1 minute in blocks) - -## Initiating and Releasing Escrow -An escrow is initiated for each slash triggered by an AVS. A slash can contain multiple strategies and is unique per `operatorSet` and `slashId`. - -*[`SlashEscrowFactory.initiateSlashEscrow`](#initiateslashescrow) -*[`SlashEscrowFactory.releaseSlashEscrow`](#releaseslashescrow) -*[`SlashEscrowFactory.releaseSlashEscrowByStrategy`](#releaseslashescrow) - -#### `initiateSlashEscrow` - -```solidity -/** - * @notice Locks up a escrow. - * @param operatorSet The operator set whose escrow is being locked up. - * @param slashId The slash ID of the escrow that is being locked up. - * @param strategy The strategy that whose underlying tokens are being redistributed. - * @dev This function can be called multiple times for a given `operatorSet` and `slashId`. - */ -function initiateSlashEscrow( - OperatorSet calldata operatorSet, - uint256 slashId, - IStrategy strategy) -external onlyStrategyManager; -``` -Initiates an escrow for a given `operatorSet`, `slashId`, and `strategy`. This function can be called multiple times in the same transaction by the `StrategyManager`, as a single slash can contain multiple strategies. The `operatorSet`, `slashId`, and `strategy` are each stored in an [EnumerableSet](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/structs/EnumerableSet.sol). - -*Effects*: -* If the operatorSet and slashID have not already been set to pending: - * The `SlashEscrow` contract is [deployed](#deployslashescrow) - * Adds the `operatorSet `to `pendingOperatorSets` - * Adds the `slashId` to the operatorSet's `pendingSlashIds` -* Adds the strategy to `pendingStrategiesForSlashId` -* Emits a `StartEscrow` event - -*Requirements*: -* Can only be called by the `StrategyManager` - -#### `deploySlashEscrow` - -```solidity -/** - * @notice Deploys a counterfactual `SlashEscrow` if code hasn't already been deployed. - * @param operatorSet The operator set whose slash escrow is being deployed. - * @param slashId The slash ID of the slash escrow that is being deployed. - */ -function _deploySlashEscrow( - OperatorSet calldata operatorSet, - uint256 slashId) -internal; -``` - -The internal function is called on `initiateEscrow`. A unique slash escrow contract is deployed per `operatorSet` and `slashId` - -SlashEscrows are deployed deterministically using [Open Zeppelin's Clones Upgradeable Library](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/f6febd79e2a3a17e26969dd0d450c6ebd64bf459/contracts/proxy/ClonesUpgradeable.sol), which is a minimal, non-upgradeable proxy. The deployment salt is a concatenation of the `operatorSet` and `slashId`, which together are guaranteed to be unique. - -#### `releaseSlashEscrow` - -```solidity -/** - * @notice Releases an escrow by transferring tokens from the `SlashEscrow` to the operator set's redistribution recipient. - * @param operatorSet The operator set whose escrow is being released. - * @param slashId The slash ID of the escrow that is being released. - * @dev The caller must be the escrow recipient, unless the escrow recipient - * is the default burn address in which case anyone can call. - * @dev The slash escrow is released once the delay for ALL strategies has elapsed. - */ -function releaseSlashEscrow( - OperatorSet calldata operatorSet, - uint256 slashId) -external onlyWhenNotPaused(PAUSED_RELEASE_ESCROW); - -/** - * @notice Releases an escrow for a single strategy in a slash. - * @param operatorSet The operator set whose escrow is being released. - * @param slashId The slash ID of the escrow that is being released. - * @param strategy The strategy whose escrow is being released. - * @dev The caller must be the redistribution recipient, unless the redistribution recipient - * is the default burn address in which case anyone can call. - * @dev The slash escrow is released once the delay for ALL strategies has elapsed. - */ -function releaseSlashEscrowByStrategy( - OperatorSet calldata operatorSet, - uint256 slashId, - IStrategy strategy -) external; -``` -At or after the `getEscrowCompleteBlock`, tokens are transferred from the `SlashEscrow` contract to the [`redistributionRecipient`](./AllocationManager.md#createredistributingoperatorsets) of an `operatorSet`. - -For each `strategy` in the `slash`, tokens are transferred from the slash's unique `SlashEscrow` contract to the `redistributionRecipient`. - -To accommodate the unlimited number of strategies that can be added to an operatorSet, and a token transfer revert blocking the release of other tokens, a user can release a single strategy from escrow via `releaseSlashEscrowByStrategy`. - -*Effects*: -* Call [`StrategyManager.clearBurnOrRedistributableShares`](./StrategyManager.md#clearburnorredistributableshares). This function may have already been called prior and will no-op if so. We call it again for sanity to ensure that all tokens are transferred to the `SlashEscrow` contract. For `releaseEscrowByStrategy` we call the by strategy variant: `StrategyManager.clearBurnOrRedistributableSharesByStrategy` -* For each strategy: - * Call [`SlashEscrow.releaseTokens`](#releasetokens) - * Emits an `EscrowComplete` - * Remove the `strategy` from the `_pendingStrategiesForSlashId` -* If all strategies from an operatorSet/slashId have been released: - * Remove the `slashId` from `_pendingSlashIds` - * Delete the start block for the `slashId` -* If the `operatorSet` has no more pending slashes, remove it from `pendingOperatorSets` - -*Requirements*: -* The global paused status MUST NOT be set: `PAUSED_RELEASE_ESCROW` -* The escrow paused status MUST NOT be set: `pauseEscrow` -* If the operatorSet is redistributable, caller MUST be the `redistributionRecipient` -* The escrow delay MUST have elapsed - -## SlashEscrow - -A [minimal proxy](https://eips.ethereum.org/EIPS/eip-1167) contract deployed from the `SlashEscrowFactory`. This contract releases funds once an escrow has elapsed. - -### `releaseTokens` - -```solidity -/** - * @notice Burns or redistributes the underlying tokens of the strategies. - * @param slashEscrowFactory The factory contract that created the slash escrow. - * @param slashEscrowImplementation The implementation contract that was used to create the slash escrow. - * @param operatorSet The operator set that was used to create the slash escrow. - * @param slashId The slash ID that was used to create the slash escrow. - * @param recipient The recipient of the underlying tokens. - * @param strategy The strategy that was used to create the slash escrow. - */ -function releaseTokens( - ISlashEscrowFactory slashEscrowFactory, - ISlashEscrow slashEscrowImplementation, - OperatorSet calldata operatorSet, - uint256 slashId, - address recipient, - IStrategy strategy -) external; -``` -Sends this contract's balance for a given `strategy`'s underlyingToken to the `recipient`. The `slashEscrowFactory`, `slashEscrowImplementation`, `operatorSet`, and `slashId` are passed in to validate deployment parameters of the contract, enabling this contract to have no storage. - -*Effects*: -* Transfers the balance of the strategy's `underlyingToken` to `redistributionRecipient` - -*Requirements*: -* Calldata passed in MUST match output of `ClonesUpgradeable.predictDeterministicAddress` -* Caller MUST be the `SlashEscrowFactory` - -## System Configuration - -The `owner` of the `SlashEscrowFactory` can update a `_globalEscrowDelayBlocks` and a per-strategy `_strategyEscrowDelayBlocks`. For a given strategy, its delay is given by `max(_globalEscrowDelayBlocks, _strategyEscrowDelayBlocks)`. For an escrow with multiple strategies, the total time for it to be released is the maximum of each of its strategy's delays. - -The following methods concern the `owner` and its abilities in the `SlashEscrowFactory` -* [`SlashEscrowFactory.setGlobalEscrowDelay`](#setglobalescrowdelay) -* [`SlashEscrowFactory.setStrategyEscrowDelay`](#setstrategyescrowdelay) - -#### `setGlobalEscrowDelay` - -```solidity -/** - * @notice Sets the delay for the escrow of all strategies underlying tokens globally. - * @param delay The delay for the escrow. - */ -function setGlobalEscrowDelay( - uint32 delay -) external onlyOwner; -``` -Sets the global escrow delay observed by all strategies. *Note: If this value is updated, all previous escrows will observe the new delay.* - -*Effects*: -* Sets the `_globalEscrowDelayBlocks` -* Emits a `GlobalEscrowDelaySet` event - -*Requirements*: -* Caller MUST be the `owner` - -#### `setStrategyEscrowDelay` - -```solidity -/** - * @notice Sets the delay for the escrow of a strategies underlying token. - * @dev The maximum of the strategy and global delay is used - * @param strategy The strategy whose escrow delay is being set. - * @param delay The delay for the escrow. - */ -function setStrategyEscrowDelay( - IStrategy strategy, - uint32 delay -) external onlyOwner; -``` - -Sets the delay for a given strategy. *Note: If this value is updated, all previous escrows will observe the new delay.* - -*Effects*: -* Updates the `_strategyEscrowDelayBlocks` for the given `strategy` -* Emits a `StrategyEscrowDelaySet` event - -*Requirements*: -* Caller MUST be the `owner` \ No newline at end of file diff --git a/docs/core/StrategyManager.md b/docs/core/StrategyManager.md index b875b8790d..3c853779f2 100644 --- a/docs/core/StrategyManager.md +++ b/docs/core/StrategyManager.md @@ -251,7 +251,7 @@ This method directs the `strategy` to convert the input deposit shares to tokens ## Increasing/Clearing Slashed Shares Slashes shares are marked as burnable or redistributable. Anybody can call -`clearBurnOrRedistributableShares` to send tokens to the slash's `SlashEscrow` contract. Shares to clear are stored in `_burnOrRedistributableShares`, a nested [EnumerableMap](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/structs/EnumerableMap.sol). The operatorSet and slashId are used to index into the enumerableMap of strategies to shares. The following methods handle clearing burn or redistributable shares: +`clearBurnOrRedistributableShares` to send tokens to the slash's `redistributionRecipient`. Shares to clear are stored in `_burnOrRedistributableShares`, a nested [EnumerableMap](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.0/contracts/utils/structs/EnumerableMap.sol). The operatorSet and slashId are used to index into the enumerableMap of strategies to shares. The following methods handle clearing burn or redistributable shares: * [`StrategyManager.increaseBurnOrRedistributableShares`](#increaseburnorredistributableshares) * [`StrategyManager.clearBurnOrRedistributableShares`](#clearBurnOrRedistributableShares) * [`StrategyManager.clearBurnOrRedistributableSharesByStrategy](#clearburnorredistributableshares) @@ -284,7 +284,7 @@ Anyone can then convert the shares to tokens and trigger a burn via `burnShares` *Effects*: * Sets `burnOrRedistributableShares` for the given `operatorSet`, `slashId`, and `strategy` * Emits a `BurnOrRedistributableSharesIncreased` event -* See [`SlashEscrowFactory.initiateSlashEscrow`](./SlashEscrowFactory.md#initiateslashescrow) + *Requirements*: @@ -320,12 +320,12 @@ function clearBurnOrRedistributableSharesByStrategy( ) external returns (uint256); ``` -Anyone can call this method to transfer slashed shares to the slash's `SlashEscrow` contract. This method sets the `burnOrRedistributableShares` for the given `slashId` and `operatorSet` to 0. To accommodate the unlimited number of strategies that can be added to an operatorSet, users can also pass in a strategy to clear via `clearBurnOrRedistributableSharesByStrategy`. The strategies that haven not been cleared can be retrieved by calling `getBurnOrRedistributableShares(operatorSet, slashId)`. +Anyone can call this method to transfer slashed shares to the operator sets's `redistributionRecipient`. This method sets the `burnOrRedistributableShares` for the given `slashId` and `operatorSet` to 0. To accommodate the unlimited number of strategies that can be added to an operatorSet, users can also pass in a strategy to clear via `clearBurnOrRedistributableSharesByStrategy`. The strategies that haven not been cleared can be retrieved by calling `getBurnOrRedistributableShares(operatorSet, slashId)`. *Effects*: * Resets the strategy's burn or redistributable shares for the operatorSet and slashId to 0 * If the shares to remove are nonzero: - * Calls `withdraw` on the `strategy`, withdrawing shares and sending a corresponding amount of tokens to the slash's `slashEscrow` contract + * Calls `withdraw` on the `strategy`, withdrawing shares and sending a corresponding amount of tokens to the operator sets's `redistributionRecipient` * Emits a `BurnOrRedistributableSharesDecreased` #### `burnShares` diff --git a/pkg/bindings/AVSDirectory/binding.go b/pkg/bindings/AVSDirectory/binding.go index 6b7a8ecdab..fab1efabcf 100644 --- a/pkg/bindings/AVSDirectory/binding.go +++ b/pkg/bindings/AVSDirectory/binding.go @@ -39,7 +39,7 @@ type ISignatureUtilsMixinTypesSignatureWithSaltAndExpiry struct { // AVSDirectoryMetaData contains all meta data concerning the AVSDirectory contract. var AVSDirectoryMetaData = &bind.MetaData{ ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIAVSDirectoryTypes.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\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"operatorSaltIsSpent\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"isSpent\",\"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\":\"structISignatureUtilsMixinTypes.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\":\"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\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"enumIAVSDirectoryTypes.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\":\"Unpaused\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorAlreadyRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToAVS\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotRegisteredToEigenLayer\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SaltSpent\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SignatureExpired\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]", - Bin: "0x60e060405234801561000f575f5ffd5b5060405161185938038061185983398101604081905261002e916101b3565b808084846001600160a01b038116610059576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0526100748161008a565b60c0525061008290506100d0565b5050506102e4565b5f5f829050601f815111156100bd578260405163305a27a960e01b81526004016100b49190610289565b60405180910390fd5b80516100c8826102be565b179392505050565b5f54610100900460ff16156101375760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b4565b5f5460ff90811614610186575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461019c575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101c5575f5ffd5b83516101d081610188565b60208501519093506101e181610188565b60408501519092506001600160401b038111156101fc575f5ffd5b8401601f8101861361020c575f5ffd5b80516001600160401b038111156102255761022561019f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102535761025361019f565b60405281815282820160200188101561026a575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102de575f198160200360031b1b821691505b50919050565b60805160a05160c05161152f61032a5f395f81816104240152610d4d01525f8181610360015261053901525f818161023c01528181610ac90152610dbc015261152f5ff3fe608060405234801561000f575f5ffd5b5060043610610148575f3560e01c8063a1060c88116100bf578063dce974b911610079578063dce974b914610334578063df5cf7231461035b578063ec76f44214610382578063f2fde38b146103b5578063f698da25146103c8578063fabc1cbc146103d0575f5ffd5b8063a1060c881461029a578063a364f4da146102ad578063a98fb355146102c0578063c825fe68146102d3578063cd6dc687146102fa578063d79aceab1461030d575f5ffd5b80635ac86ab7116101105780635ac86ab7146101fa5780635c975abb1461021d578063715018a61461022f578063886f1195146102375780638da5cb5b146102765780639926ee7d14610287575f5ffd5b8063136439dd1461014c578063374823b51461016157806349075da3146101a357806354fd4d50146101dd578063595c6a67146101f2575b5f5ffd5b61015f61015a3660046110dc565b6103e3565b005b61018e61016f366004611107565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101d06101b1366004611131565b609860209081525f928352604080842090915290825290205460ff1681565b60405161019a919061117c565b6101e561041d565b60405161019a91906111d0565b61015f61044d565b61018e6102083660046111e9565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161019a565b61015f610461565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161019a565b6033546001600160a01b031661025e565b61015f610295366004611277565b610472565b6102216102a8366004611364565b610673565b61015f6102bb3660046113a7565b6106f2565b61015f6102ce3660046113c2565b6107b9565b6102217f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61015f610308366004611107565b610800565b6102217fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102217f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b61015f6103903660046110dc565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b61015f6103c33660046113a7565b61091c565b610221610995565b61015f6103de3660046110dc565b610a4e565b6103eb610ab4565b60665481811681146104105760405163c61dca5d60e01b815260040160405180910390fd5b61041982610b57565b5050565b60606104487f0000000000000000000000000000000000000000000000000000000000000000610b94565b905090565b610455610ab4565b61045f5f19610b57565b565b610469610bd1565b61045f5f610c2b565b5f61047c81610c7c565b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156104b5576104b5611168565b036104d357604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561051a57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa15801561057e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a29190611430565b6105bf57604051639f88c8af60e01b815260040160405180910390fd5b6105e3836105d7853386602001518760400151610673565b84516040860151610ca7565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610666919061117c565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906106e99060c00160405160208183030381529060405280519060200120610cff565b95945050505050565b5f6106fc81610c7c565b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561073557610735611168565b14610753576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916107ad919061117c565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516107f492919061144f565b60405180910390a25050565b5f54610100900460ff161580801561081e57505f54600160ff909116105b806108375750303b15801561083757505f5460ff166001145b61089f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156108c0575f805461ff0019166101001790555b6108c982610b57565b6108d283610c2b565b8015610917575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610924610bd1565b6001600160a01b0381166109895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610896565b61099281610c2b565b50565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea610a02610d45565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b610a56610dba565b60665480198219811614610a7d5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107f4565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3a9190611430565b61045f57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b60605f610ba083610e6b565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b0316331461045f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610896565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606654600160ff83161b908116036109925760405163840a48d560e01b815260040160405180910390fd5b42811015610cc857604051630819bdcd60e01b815260040160405180910390fd5b610cdc6001600160a01b0385168484610e98565b610cf957604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610d08610995565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f610d717f0000000000000000000000000000000000000000000000000000000000000000610b94565b9050805f81518110610d8557610d8561147d565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3a9190611491565b6001600160a01b0316336001600160a01b03161461045f5760405163794821ff60e01b815260040160405180910390fd5b5f60ff8216601f811115610e9257604051632cd44ac360e21b815260040160405180910390fd5b92915050565b5f5f5f610ea58585610ef6565b90925090505f816004811115610ebd57610ebd611168565b148015610edb5750856001600160a01b0316826001600160a01b0316145b80610eec5750610eec868686610f38565b9695505050505050565b5f5f8251604103610f2a576020830151604084015160608501515f1a610f1e8782858561101f565b94509450505050610f31565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610f609291906114ac565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f9e91906114cc565b5f60405180830381855afa9150503d805f8114610fd6576040519150601f19603f3d011682016040523d82523d5f602084013e610fdb565b606091505b5091509150818015610fef57506020815110155b8015610eec57508051630b135d3f60e11b9061101490830160209081019084016114e2565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561105457505f905060036110d3565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156110a5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166110cd575f600192509250506110d3565b91505f90505b94509492505050565b5f602082840312156110ec575f5ffd5b5035919050565b6001600160a01b0381168114610992575f5ffd5b5f5f60408385031215611118575f5ffd5b8235611123816110f3565b946020939093013593505050565b5f5f60408385031215611142575f5ffd5b823561114d816110f3565b9150602083013561115d816110f3565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061119c57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6111e260208301846111a2565b9392505050565b5f602082840312156111f9575f5ffd5b813560ff811681146111e2575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561124057611240611209565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561126f5761126f611209565b604052919050565b5f5f60408385031215611288575f5ffd5b8235611293816110f3565b9150602083013567ffffffffffffffff8111156112ae575f5ffd5b8301606081860312156112bf575f5ffd5b6112c761121d565b813567ffffffffffffffff8111156112dd575f5ffd5b8201601f810187136112ed575f5ffd5b803567ffffffffffffffff81111561130757611307611209565b61131a601f8201601f1916602001611246565b81815288602083850101111561132e575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f60808587031215611377575f5ffd5b8435611382816110f3565b93506020850135611392816110f3565b93969395505050506040820135916060013590565b5f602082840312156113b7575f5ffd5b81356111e2816110f3565b5f5f602083850312156113d3575f5ffd5b823567ffffffffffffffff8111156113e9575f5ffd5b8301601f810185136113f9575f5ffd5b803567ffffffffffffffff81111561140f575f5ffd5b856020828401011115611420575f5ffd5b6020919091019590945092505050565b5f60208284031215611440575f5ffd5b815180151581146111e2575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156114a1575f5ffd5b81516111e2816110f3565b828152604060208201525f6114c460408301846111a2565b949350505050565b5f82518060208501845e5f920191825250919050565b5f602082840312156114f2575f5ffd5b505191905056fea264697066735822122010016b8518b7337b95e8a1dbcc4031be24700ceab9864dc64e4525907236b33564736f6c634300081b0033", + Bin: "0x60e060405234801561000f575f5ffd5b5060405161185938038061185983398101604081905261002e916101b3565b808084846001600160a01b038116610059576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b039081166080521660a0526100748161008a565b60c0525061008290506100d0565b5050506102e4565b5f5f829050601f815111156100bd578260405163305a27a960e01b81526004016100b49190610289565b60405180910390fd5b80516100c8826102be565b179392505050565b5f54610100900460ff16156101375760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100b4565b5f5460ff90811614610186575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b038116811461019c575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f606084860312156101c5575f5ffd5b83516101d081610188565b60208501519093506101e181610188565b60408501519092506001600160401b038111156101fc575f5ffd5b8401601f8101861361020c575f5ffd5b80516001600160401b038111156102255761022561019f565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102535761025361019f565b60405281815282820160200188101561026a575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102de575f198160200360031b1b821691505b50919050565b60805160a05160c05161152f61032a5f395f81816104240152610d4d01525f8181610360015261053901525f818161023c01528181610ac90152610dbc015261152f5ff3fe608060405234801561000f575f5ffd5b5060043610610148575f3560e01c8063a1060c88116100bf578063dce974b911610079578063dce974b914610334578063df5cf7231461035b578063ec76f44214610382578063f2fde38b146103b5578063f698da25146103c8578063fabc1cbc146103d0575f5ffd5b8063a1060c881461029a578063a364f4da146102ad578063a98fb355146102c0578063c825fe68146102d3578063cd6dc687146102fa578063d79aceab1461030d575f5ffd5b80635ac86ab7116101105780635ac86ab7146101fa5780635c975abb1461021d578063715018a61461022f578063886f1195146102375780638da5cb5b146102765780639926ee7d14610287575f5ffd5b8063136439dd1461014c578063374823b51461016157806349075da3146101a357806354fd4d50146101dd578063595c6a67146101f2575b5f5ffd5b61015f61015a3660046110dc565b6103e3565b005b61018e61016f366004611107565b609960209081525f928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b6101d06101b1366004611131565b609860209081525f928352604080842090915290825290205460ff1681565b60405161019a919061117c565b6101e561041d565b60405161019a91906111d0565b61015f61044d565b61018e6102083660046111e9565b606654600160ff9092169190911b9081161490565b6066545b60405190815260200161019a565b61015f610461565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161019a565b6033546001600160a01b031661025e565b61015f610295366004611277565b610472565b6102216102a8366004611364565b610673565b61015f6102bb3660046113a7565b6106f2565b61015f6102ce3660046113c2565b6107b9565b6102217f809c5ac049c45b7a7f050a20f00c16cf63797efbf8b1eb8d749fdfa39ff8f92981565b61015f610308366004611107565b610800565b6102217fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd81565b6102217f4ee65f64218c67b68da66fd0db16560040a6b973290b9e71912d661ee53fe49581565b61025e7f000000000000000000000000000000000000000000000000000000000000000081565b61015f6103903660046110dc565b335f90815260996020908152604080832093835292905220805460ff19166001179055565b61015f6103c33660046113a7565b61091c565b610221610995565b61015f6103de3660046110dc565b610a4e565b6103eb610ab4565b60665481811681146104105760405163c61dca5d60e01b815260040160405180910390fd5b61041982610b57565b5050565b60606104487f0000000000000000000000000000000000000000000000000000000000000000610b94565b905090565b610455610ab4565b61045f5f19610b57565b565b610469610bd1565b61045f5f610c2b565b5f61047c81610c7c565b6001335f9081526098602090815260408083206001600160a01b038816845290915290205460ff1660018111156104b5576104b5611168565b036104d357604051631aa528bb60e11b815260040160405180910390fd5b6001600160a01b0383165f90815260996020908152604080832085830151845290915290205460ff161561051a57604051630d4c4c9160e21b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0384811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa15801561057e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a29190611430565b6105bf57604051639f88c8af60e01b815260040160405180910390fd5b6105e3836105d7853386602001518760400151610673565b84516040860151610ca7565b6001600160a01b0383165f81815260996020908152604080832086830151845282528083208054600160ff19918216811790925533808652609885528386208787529094529382902080549094168117909355519092917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b4191610666919061117c565b60405180910390a3505050565b604080517fda2c89bafdd34776a2b8bb9c83c82f419e20cc8c67207f70edd58249b92661bd60208201526001600160a01b038087169282019290925290841660608201526080810183905260a081018290525f906106e99060c00160405160208183030381529060405280519060200120610cff565b95945050505050565b5f6106fc81610c7c565b6001335f9081526098602090815260408083206001600160a01b038716845290915290205460ff16600181111561073557610735611168565b14610753576040516352df45c960e01b815260040160405180910390fd5b335f8181526098602090815260408083206001600160a01b0387168085529252808320805460ff191690555190917ff0952b1c65271d819d39983d2abb044b9cace59bcc4d4dd389f586ebdcb15b41916107ad919061117c565b60405180910390a35050565b336001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371383836040516107f492919061144f565b60405180910390a25050565b5f54610100900460ff161580801561081e57505f54600160ff909116105b806108375750303b15801561083757505f5460ff166001145b61089f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156108c0575f805461ff0019166101001790555b6108c982610b57565b6108d283610c2b565b8015610917575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610924610bd1565b6001600160a01b0381166109895760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610896565b61099281610c2b565b50565b60408051808201909152600a81526922b4b3b2b72630bcb2b960b11b6020909101525f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f71b625cfad44bac63b13dba07f2e1d6084ee04b6f8752101ece6126d584ee6ea610a02610d45565b805160209182012060408051928301949094529281019190915260608101919091524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b610a56610dba565b60665480198219811614610a7d5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c906020016107f4565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015610b16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b3a9190611430565b61045f57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b60605f610ba083610e6b565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6033546001600160a01b0316331461045f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610896565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606654600160ff83161b908116036109925760405163840a48d560e01b815260040160405180910390fd5b42811015610cc857604051630819bdcd60e01b815260040160405180910390fd5b610cdc6001600160a01b0385168484610e98565b610cf957604051638baa579f60e01b815260040160405180910390fd5b50505050565b5f610d08610995565b60405161190160f01b6020820152602281019190915260428101839052606201604051602081830303815290604052805190602001209050919050565b60605f610d717f0000000000000000000000000000000000000000000000000000000000000000610b94565b9050805f81518110610d8557610d8561147d565b016020908101516040516001600160f81b03199091169181019190915260210160405160208183030381529060405291505090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e16573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3a9190611491565b6001600160a01b0316336001600160a01b03161461045f5760405163794821ff60e01b815260040160405180910390fd5b5f60ff8216601f811115610e9257604051632cd44ac360e21b815260040160405180910390fd5b92915050565b5f5f5f610ea58585610ef6565b90925090505f816004811115610ebd57610ebd611168565b148015610edb5750856001600160a01b0316826001600160a01b0316145b80610eec5750610eec868686610f38565b9695505050505050565b5f5f8251604103610f2a576020830151604084015160608501515f1a610f1e8782858561101f565b94509450505050610f31565b505f905060025b9250929050565b5f5f5f856001600160a01b0316631626ba7e60e01b8686604051602401610f609291906114ac565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051610f9e91906114cc565b5f60405180830381855afa9150503d805f8114610fd6576040519150601f19603f3d011682016040523d82523d5f602084013e610fdb565b606091505b5091509150818015610fef57506020815110155b8015610eec57508051630b135d3f60e11b9061101490830160209081019084016114e2565b149695505050505050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561105457505f905060036110d3565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156110a5573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166110cd575f600192509250506110d3565b91505f90505b94509492505050565b5f602082840312156110ec575f5ffd5b5035919050565b6001600160a01b0381168114610992575f5ffd5b5f5f60408385031215611118575f5ffd5b8235611123816110f3565b946020939093013593505050565b5f5f60408385031215611142575f5ffd5b823561114d816110f3565b9150602083013561115d816110f3565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b602081016002831061119c57634e487b7160e01b5f52602160045260245ffd5b91905290565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6111e260208301846111a2565b9392505050565b5f602082840312156111f9575f5ffd5b813560ff811681146111e2575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff8111828210171561124057611240611209565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561126f5761126f611209565b604052919050565b5f5f60408385031215611288575f5ffd5b8235611293816110f3565b9150602083013567ffffffffffffffff8111156112ae575f5ffd5b8301606081860312156112bf575f5ffd5b6112c761121d565b813567ffffffffffffffff8111156112dd575f5ffd5b8201601f810187136112ed575f5ffd5b803567ffffffffffffffff81111561130757611307611209565b61131a601f8201601f1916602001611246565b81815288602083850101111561132e575f5ffd5b816020840160208301375f6020928201830152835283810135908301525060409182013591810191909152919491935090915050565b5f5f5f5f60808587031215611377575f5ffd5b8435611382816110f3565b93506020850135611392816110f3565b93969395505050506040820135916060013590565b5f602082840312156113b7575f5ffd5b81356111e2816110f3565b5f5f602083850312156113d3575f5ffd5b823567ffffffffffffffff8111156113e9575f5ffd5b8301601f810185136113f9575f5ffd5b803567ffffffffffffffff81111561140f575f5ffd5b856020828401011115611420575f5ffd5b6020919091019590945092505050565b5f60208284031215611440575f5ffd5b815180151581146111e2575f5ffd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b634e487b7160e01b5f52603260045260245ffd5b5f602082840312156114a1575f5ffd5b81516111e2816110f3565b828152604060208201525f6114c460408301846111a2565b949350505050565b5f82518060208501845e5f920191825250919050565b5f602082840312156114f2575f5ffd5b505191905056fea26469706673582212200a13d71b74bc920200d4bd3dfb896d7969a93db2d44da6d97a35ee2a35419c2864736f6c634300081b0033", } // AVSDirectoryABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/AllocationManager/binding.go b/pkg/bindings/AllocationManager/binding.go index 43197b9688..89d6d1ab96 100644 --- a/pkg/bindings/AllocationManager/binding.go +++ b/pkg/bindings/AllocationManager/binding.go @@ -80,8 +80,8 @@ type OperatorSet struct { // AllocationManagerMetaData contains all meta data concerning the AllocationManager contract. var AllocationManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRedistributingOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]},{\"name\":\"redistributionRecipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRedistributionRecipient\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"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\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"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\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"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\":\"RedistributionAddressSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"redistributionRecipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"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\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonexistentAVSMetadata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", - Bin: "0x610140604052348015610010575f5ffd5b5060405161611f38038061611f83398101604081905261002f916101e6565b8084878585896001600160a01b03811661005c576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805292831660a05263ffffffff91821660c0521660e052166101005261008d816100a5565b610120525061009a6100eb565b50505050505061034a565b5f5f829050601f815111156100d8578260405163305a27a960e01b81526004016100cf91906102ef565b60405180910390fd5b80516100e382610324565b179392505050565b5f54610100900460ff16156101525760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100cf565b5f5460ff908116146101a1575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101b7575f5ffd5b50565b805163ffffffff811681146101cd575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f60c087890312156101fb575f5ffd5b8651610206816101a3565b6020880151909650610217816101a3565b6040880151909550610228816101a3565b9350610236606088016101ba565b9250610244608088016101ba565b60a08801519092506001600160401b0381111561025f575f5ffd5b8701601f8101891361026f575f5ffd5b80516001600160401b03811115610288576102886101d2565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102b6576102b66101d2565b6040528181528282016020018b10156102cd575f5ffd5b8160208401602083015e5f602083830101528093505050509295509295509295565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610344575f198160200360031b1b821691505b50919050565b60805160a05160c05160e0516101005161012051615d416103de5f395f61132201525f81816104b30152612c4601525f81816106260152613b5701525f81816103bc0152818161171b0152611dee01525f818161079401528181611356015281816113c0015281816120ce01528181612eba015261375701525f818161064d01528181612b12015261416f0152615d415ff3fe608060405234801561000f575f5ffd5b50600436106102e5575f3560e01c80635c975abb11610195578063adc2e3d9116100e4578063d3d96ff41161009e578063f231bd0811610079578063f231bd08146107b6578063f605ce08146107c9578063fabc1cbc146107dc578063fe4b84df146107ef575f5ffd5b8063d3d96ff414610769578063dc2af6921461077c578063df5cf7231461078f575f5ffd5b8063adc2e3d9146106db578063b2447af7146106ee578063b66bd98914610701578063b9fbaed114610714578063ba1a84e514610743578063c221d8ae14610756575f5ffd5b80637bc1ef611161014f57806394d7d00c1161012a57806394d7d00c1461068f578063952899ee146106a2578063a9333ec8146106b5578063a9821821146106c8575f5ffd5b80637bc1ef6114610621578063886f1195146106485780638ce648541461066f575f5ffd5b80635c975abb146105a2578063670d3ba2146105aa5780636cfb4481146105bd5780636e3492b5146105e85780636e875dba146105fb57806379ae50cd1461060e575f5ffd5b806336352057116102515780634cfd29391161020b57806354fd4d50116101e657806354fd4d501461054f57806356c483e614610564578063595c6a67146105775780635ac86ab71461057f575f5ffd5b80634cfd29391461050857806350feea2014610529578063547afb871461053c575f5ffd5b8063363520571461044c57806340120dab1461046d5780634177a87c1461048e5780634657e26a146104ae5780634a10ffe5146104d55780634b5046ef146104f5575f5ffd5b8063261f84e0116102a2578063261f84e0146103a45780632981eb77146103b75780632b453a9a146103f35780632bab2c4a14610413578063304c10cd1461042657806332a879e414610439575f5ffd5b80630f3df50e146102e957806310e1b9b8146103195780631352c3e614610339578063136439dd1461035c57806315fe502814610371578063260dc75814610391575b5f5ffd5b6102fc6102f7366004614b67565b610802565b6040516001600160a01b0390911681526020015b60405180910390f35b61032c610327366004614b81565b610843565b6040516103109190614bc8565b61034c610347366004614bfb565b61087c565b6040519015158152602001610310565b61036f61036a366004614c2f565b6108f7565b005b61038461037f366004614c46565b610931565b6040516103109190614cc4565b61034c61039f366004614b67565b610a48565b61036f6103b2366004614d16565b610a79565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610310565b610406610401366004614dfb565b610b22565b6040516103109190614e9e565b610406610421366004614f01565b610b38565b6102fc610434366004614c46565b610bd7565b61036f610447366004614f85565b610c06565b61045f61045a366004615005565b610d43565b604051610310929190615057565b61048061047b36600461506f565b610e86565b6040516103109291906150fc565b6104a161049c366004614b67565b611001565b6040516103109190615159565b6102fc7f000000000000000000000000000000000000000000000000000000000000000081565b6104e86104e336600461516b565b611025565b60405161031091906151ae565b61036f610503366004614f85565b6110cd565b61051b610516366004614b67565b611160565b604051908152602001610310565b61036f6105373660046151f9565b611182565b6104e861054a366004615257565b611273565b61055761131b565b6040516103109190615299565b61036f6105723660046152ce565b61134b565b61036f611450565b61034c61058d3660046152f8565b606654600160ff9092169190911b9081161490565b60665461051b565b61034c6105b8366004614bfb565b611464565b6105d06105cb36600461506f565b611490565b6040516001600160401b039091168152602001610310565b61036f6105f636600461532e565b6114a5565b6104a1610609366004614b67565b611868565b61038461061c366004614c46565b611879565b6103de7f000000000000000000000000000000000000000000000000000000000000000081565b6102fc7f000000000000000000000000000000000000000000000000000000000000000081565b61068261067d36600461535f565b611953565b60405161031091906153a2565b6104e861069d3660046153b4565b611a0f565b61036f6106b036600461540f565b611afb565b6105d06106c336600461506f565b611f9c565b61036f6106d63660046155b8565b611fcb565b61036f6106e9366004615636565b61207d565b61051b6106fc366004614b67565b6123c6565b61036f61070f3660046151f9565b6123e8565b610727610722366004614c46565b612542565b60408051921515835263ffffffff909116602083015201610310565b61051b610751366004614c46565b6125dc565b6104a1610764366004614bfb565b6125fc565b61036f61077736600461506f565b612625565b61034c61078a366004614c46565b612752565b6102fc7f000000000000000000000000000000000000000000000000000000000000000081565b61034c6107c4366004614b67565b612785565b6105d06107d736600461506f565b6127a4565b61036f6107ea366004614c2f565b6127b0565b61036f6107fd366004614c2f565b61281d565b5f5f60a65f6108108561292e565b815260208101919091526040015f20546001600160a01b031690508015610837578061083c565b620e16e45b9392505050565b604080516060810182525f80825260208201819052918101829052906108728561086c8661292e565b85612991565b9695505050505050565b6001600160a01b0382165f908152609e6020526040812081908161089f8561292e565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff16928201929092529150806108ed5750806020015163ffffffff164311155b9150505b92915050565b6108ff612afd565b60665481811681146109245760405163c61dca5d60e01b815260040160405180910390fd5b61092d82612ba0565b5050565b6001600160a01b0381165f908152609d602052604081206060919061095590612bdd565b90505f816001600160401b0381111561097057610970614a77565b6040519080825280602002602001820160405280156109b457816020015b604080518082019091525f808252602082015281526020019060019003908161098e5790505b5090505f5b82811015610a40576001600160a01b0385165f908152609d60205260409020610a1b906109e69083612be6565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b828281518110610a2d57610a2d615678565b60209081029190910101526001016109b9565b509392505050565b60208082015182516001600160a01b03165f9081526098909252604082206108f19163ffffffff90811690612bf116565b82610a8381612c08565b610aa05760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b0384165f90815260a4602052604090205460ff16610ad8576040516348f7dbb960e01b815260040160405180910390fd5b5f5b82811015610b1b57610b1385858584818110610af857610af8615678565b9050602002810190610b0a919061568c565b620e16e4612cb2565b600101610ada565b5050505050565b6060610b3084848443612e66565b949350505050565b6060610b4685858585612e66565b90505f5b8451811015610bce57610b76858281518110610b6857610b68615678565b60200260200101518761087c565b610bc6575f5b8451811015610bc4575f838381518110610b9857610b98615678565b60200260200101518281518110610bb157610bb1615678565b6020908102919091010152600101610b7c565b505b600101610b4a565b50949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610bff578061083c565b5090919050565b84610c1081612c08565b610c2d5760405163932d94f760e01b815260040160405180910390fd5b838214610c4d576040516343714afd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260a4602052604090205460ff16610c85576040516348f7dbb960e01b815260040160405180910390fd5b5f5b84811015610d3a575f848483818110610ca257610ca2615678565b9050602002016020810190610cb79190614c46565b6001600160a01b031603610cde576040516339b190bb60e11b815260040160405180910390fd5b610d3287878784818110610cf457610cf4615678565b9050602002810190610d06919061568c565b868685818110610d1857610d18615678565b9050602002016020810190610d2d9190614c46565b612cb2565b600101610c87565b50505050505050565b5f60606001610d5181613153565b84610d5b81612c08565b610d785760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280886001600160a01b03168152602001876020016020810190610da691906156aa565b63ffffffff1690529050610dbd60608701876156c3565b9050610dcc60408801886156c3565b905014610dec576040516343714afd60e01b815260040160405180910390fd5b60208082015182516001600160a01b03165f90815260989092526040909120610e1e9163ffffffff90811690612bf116565b610e3b57604051631fb1705560e21b815260040160405180910390fd5b610e51610e4b6020880188614c46565b8261087c565b610e6e5760405163ebbff49760e01b815260040160405180910390fd5b610e788682613181565b945094505050509250929050565b6001600160a01b0382165f908152609d602052604081206060918291610eab90612bdd565b90505f816001600160401b03811115610ec657610ec6614a77565b604051908082528060200260200182016040528015610f0a57816020015b604080518082019091525f8082526020820152815260200190600190039081610ee45790505b5090505f826001600160401b03811115610f2657610f26614a77565b604051908082528060200260200182016040528015610f6f57816020015b604080516060810182525f80825260208083018290529282015282525f19909201910181610f445790505b5090505f5b83811015610ff2576001600160a01b0388165f908152609d60205260408120610fa1906109e69084612be6565b905080848381518110610fb657610fb6615678565b6020026020010181905250610fcc89828a610843565b838381518110610fde57610fde615678565b602090810291909101015250600101610f74565b509093509150505b9250929050565b60605f61083c60995f6110138661292e565b81526020019081526020015f206138c1565b60605f83516001600160401b0381111561104157611041614a77565b60405190808252806020026020018201604052801561106a578160200160208202803683370190505b5090505f5b8451811015610a405761109b85828151811061108d5761108d615678565b602002602001015185611f9c565b8282815181106110ad576110ad615678565b6001600160401b039092166020928302919091019091015260010161106f565b5f6110d781613153565b8382146110f7576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015610d3a576111588787878481811061111757611117615678565b905060200201602081019061112c9190614c46565b86868581811061113e5761113e615678565b90506020020160208101906111539190615708565b6138cd565b6001016110f9565b5f60a55f61116d8461292e565b81526020019081526020015f20549050919050565b8361118c81612c08565b6111a95760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f938452609890529390912091926111e89291612bf116565b61120557604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d3a5761126b8286868481811061122557611225615678565b905060200201602081019061123a9190614c46565b61126660405180604001604052808c6001600160a01b031681526020018b63ffffffff16815250612785565b6139d1565b600101611207565b60605f82516001600160401b0381111561128f5761128f614a77565b6040519080825280602002602001820160405280156112b8578160200160208202803683370190505b5090505f5b8351811015610a40576112e9858583815181106112dc576112dc615678565b6020026020010151611f9c565b8282815181106112fb576112fb615678565b6001600160401b03909216602092830291909101909101526001016112bd565b60606113467f0000000000000000000000000000000000000000000000000000000000000000613a73565b905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114465761138482612c08565b6113a1576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611405573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114299190615729565b6114465760405163ccea9e6f60e01b815260040160405180910390fd5b61092d8282613ab0565b611458612afd565b6114625f19612ba0565b565b5f61083c83609a5f6114758661292e565b81526020019081526020015f20613c5c90919063ffffffff16565b5f5f61149c8484613c7d565b95945050505050565b60026114b081613153565b6114c56114c06020840184614c46565b612c08565b806114de57506114de6114c06040840160208501614c46565b6114fb576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b61150a60408401846156c3565b90508110156117cc575f60405180604001604052808560200160208101906115329190614c46565b6001600160a01b0316815260200161154d60408701876156c3565b8581811061155d5761155d615678565b905060200201602081019061157291906156aa565b63ffffffff1681525090506115bf816020015163ffffffff1660985f8760200160208101906115a19190614c46565b6001600160a01b0316815260208101919091526040015f2090612bf1565b6115dc57604051631fb1705560e21b815260040160405180910390fd5b609e5f6115ec6020870187614c46565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6116158361292e565b815260208101919091526040015f205460ff16611645576040516325131d4f60e01b815260040160405180910390fd5b61167f6116518261292e565b609c5f6116616020890189614c46565b6001600160a01b0316815260208101919091526040015f2090613dec565b506116b76116906020860186614c46565b609a5f61169c8561292e565b81526020019081526020015f20613df790919063ffffffff16565b506116c56020850185614c46565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe826040516116fd9190615748565b60405180910390a2604080518082019091525f8152602081016117407f00000000000000000000000000000000000000000000000000000000000000004361576a565b63ffffffff169052609e5f6117586020880188614c46565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6117818461292e565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff1990931692909217179055506001016114fd565b506117e06104346040840160208501614c46565b6001600160a01b031663303ca9566117fb6020850185614c46565b61180b6040860160208701614c46565b61181860408701876156c3565b6040518563ffffffff1660e01b815260040161183794939291906157bf565b5f604051808303815f87803b15801561184e575f5ffd5b505af1158015611860573d5f5f3e3d5ffd5b505050505050565b60606108f1609a5f6110138561292e565b6001600160a01b0381165f908152609c602052604081206060919061189d90612bdd565b90505f816001600160401b038111156118b8576118b8614a77565b6040519080825280602002602001820160405280156118fc57816020015b604080518082019091525f80825260208201528152602001906001900390816118d65790505b5090505f5b82811015610a40576001600160a01b0385165f908152609c6020526040902061192e906109e69083612be6565b82828151811061194057611940615678565b6020908102919091010152600101611901565b60605f84516001600160401b0381111561196f5761196f614a77565b6040519080825280602002602001820160405280156119b857816020015b604080516060810182525f80825260208083018290529282015282525f1990920191018161198d5790505b5090505f5b8551811015610bce576119ea8682815181106119db576119db615678565b60200260200101518686610843565b8282815181106119fc576119fc615678565b60209081029190910101526001016119bd565b60605f83516001600160401b03811115611a2b57611a2b614a77565b604051908082528060200260200182016040528015611a54578160200160208202803683370190505b5090505f5b8451811015610bce576001600160a01b0386165f90815260a1602052604081208651611ac992879291899086908110611a9457611a94615678565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613e0b90919063ffffffff16565b828281518110611adb57611adb615678565b6001600160401b0390921660209283029190910190910152600101611a59565b5f611b0581613153565b611b0e83612c08565b611b2b576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f611b3786612542565b9150915081611b595760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610b1b57838181518110611b7a57611b7a615678565b60200260200101516040015151848281518110611b9957611b99615678565b6020026020010151602001515114611bc4576040516343714afd60e01b815260040160405180910390fd5b5f848281518110611bd757611bd7615678565b602090810291909101810151518082015181516001600160a01b03165f90815260989093526040909220909250611c179163ffffffff90811690612bf116565b611c3457604051631fb1705560e21b815260040160405180910390fd5b5f611c3f878361087c565b90505f5b868481518110611c5557611c55615678565b60200260200101516020015151811015611f91575f878581518110611c7c57611c7c615678565b6020026020010151602001518281518110611c9957611c99615678565b60200260200101519050611cb0898261ffff6138cd565b5f5f611cbf8b61086c8861292e565b91509150806040015163ffffffff165f14611ced57604051630d8fcbe360e41b815260040160405180910390fd5b5f611cfa87858489613e1f565b9050611d3f825f01518c8a81518110611d1557611d15615678565b6020026020010151604001518781518110611d3257611d32615678565b6020026020010151613e55565b600f0b602083018190525f03611d6857604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b1215611eac578015611e2e57611de9611d898861292e565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b611e137f00000000000000000000000000000000000000000000000000000000000000004361576a565b611e1e90600161576a565b63ffffffff166040830152611f19565b611e4083602001518360200151613e6c565b6001600160401b031660208401528a518b9089908110611e6257611e62615678565b6020026020010151604001518581518110611e7f57611e7f615678565b6020908102919091018101516001600160401b031683525f9083015263ffffffff43166040830152611f19565b5f8260200151600f0b1315611f1957611ecd83602001518360200151613e6c565b6001600160401b039081166020850181905284519091161015611f0357604051636c9be0bf60e01b815260040160405180910390fd5b611f0d894361576a565b63ffffffff1660408301525b611f2e8c611f268961292e565b868686613e8b565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c8886611f63865f01518760200151613e6c565b8660400151604051611f799594939291906157eb565b60405180910390a1505060019092019150611c439050565b505050600101611b5f565b6001600160a01b038083165f90815260a160209081526040808320938516835292905290812061083c906140c3565b82611fd581612c08565b611ff25760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b0384165f90815260a4602052604090205460ff16612034576001600160a01b0384165f90815260a460205260409020805460ff191660011790555b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c943713848460405161206f929190615864565b60405180910390a250505050565b600261208881613153565b8261209281612c08565b6120af5760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015612113573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121379190615729565b6121545760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b61216360208501856156c3565b905081101561232b57604080518082019091525f90806121866020880188614c46565b6001600160a01b031681526020018680602001906121a491906156c3565b858181106121b4576121b4615678565b90506020020160208101906121c991906156aa565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612205929190811690612bf116565b61222257604051631fb1705560e21b815260040160405180910390fd5b61222c868261087c565b1561224a57604051636c6c6e2760e11b815260040160405180910390fd5b6122736122568261292e565b6001600160a01b0388165f908152609c60205260409020906140d6565b5061229f86609a5f6122848561292e565b81526020019081526020015f206140e190919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e826040516122d99190615748565b60405180910390a26001600160a01b0386165f908152609e602052604081206001916123048461292e565b815260208101919091526040015f20805460ff191691151591909117905550600101612156565b5061233c6104346020850185614c46565b6001600160a01b031663c63fd502856123586020870187614c46565b61236560208801886156c3565b61237260408a018a615877565b6040518763ffffffff1660e01b8152600401612393969594939291906158b9565b5f604051808303815f87803b1580156123aa575f5ffd5b505af11580156123bc573d5f5f3e3d5ffd5b5050505050505050565b5f6108f1609a5f6123d68561292e565b81526020019081526020015f20612bdd565b836123f281612c08565b61240f5760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f9384526098905293909120919261244e9291612bf116565b61246b57604051631fb1705560e21b815260040160405180910390fd5b5f6124758261292e565b90505f5b848110156123bc576124be86868381811061249657612496615678565b90506020020160208101906124ab9190614c46565b5f84815260996020526040902090613df7565b6124db576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee8387878481811061250f5761250f615678565b90506020020160208101906125249190614c46565b604051612532929190615905565b60405180910390a1600101612479565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b9091041660608201819052849391929190158015906125c35750826060015163ffffffff164310155b156125d2575050604081015160015b9590945092505050565b6001600160a01b0381165f9081526098602052604081206108f190612bdd565b6001600160a01b0382165f908152609f60205260408120606091906108ed90826110138661292e565b8161262f81612c08565b61264c5760405163932d94f760e01b815260040160405180910390fd5b60405163b526578760e01b81526001600160a01b03848116600483015283169063b526578790602401602060405180830381865afa158015612690573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126b49190615729565b6126d157604051631d0b13c160e31b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361272981610bd7565b604080516001600160a01b039384168152929091166020830152015b60405180910390a1505050565b5f5f61275d83611879565b90505f61276984610931565b905061277584836140f5565b80610b305750610b3084826140f5565b5f620e16e461279383610802565b6001600160a01b0316141592915050565b5f5f610bce8484613c7d565b6127b861416d565b606654801982198116146127df5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f54610100900460ff161580801561283b57505f54600160ff909116105b806128545750303b15801561285457505f5460ff166001145b6128bc5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff1916600117905580156128dd575f805461ff0019166101001790555b6128e682612ba0565b801561092d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b5f815f0151826020015163ffffffff1660405160200161297992919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b6040516020818303038152906040526108f19061592b565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a18452868520908816855290925293822092939281906129f1906140c3565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff16918101829052919250431015612a93579092509050612af5565b612aa4815f01518260200151613e6c565b6001600160401b0316815260208101515f600f9190910b1215612ae257612ad382602001518260200151613e6c565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015612b5f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b839190615729565b61146257604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f6108f1825490565b5f61083c838361421e565b5f818152600183016020526040812054151561083c565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612c8e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108f19190615729565b5f6040518060400160405280856001600160a01b03168152602001845f016020810190612cdf91906156aa565b63ffffffff168152509050612d29816020015163ffffffff1660985f876001600160a01b03166001600160a01b031681526020019081526020015f206140d690919063ffffffff16565b612d4657604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c81604051612d759190615748565b60405180910390a16001600160a01b038216620e16e414801590612e0a578260a65f612da08561292e565b81526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e8284604051612e01929190615905565b60405180910390a15b5f5b612e1960208601866156c3565b905081101561186057612e5e83612e3360208801886156c3565b84818110612e4357612e43615678565b9050602002016020810190612e589190614c46565b846139d1565b600101612e0c565b606083516001600160401b03811115612e8157612e81614a77565b604051908082528060200260200182016040528015612eb457816020015b6060815260200190600190039081612e9f5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401612f0692919061594e565b5f60405180830381865afa158015612f20573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f479190810190615972565b90505f5b8551811015613149575f868281518110612f6757612f67615678565b6020026020010151905085516001600160401b03811115612f8a57612f8a614a77565b604051908082528060200260200182016040528015612fb3578160200160208202803683370190505b50848381518110612fc657612fc6615678565b60209081029190910101525f5b865181101561313f575f878281518110612fef57612fef615678565b6020908102919091018101516001600160a01b038086165f90815260a184526040808220928416825291909352822090925061302a906140c3565b9050806001600160401b03165f03613043575050613137565b5f61304f858d85610843565b90508863ffffffff16816040015163ffffffff161115801561307757505f8160200151600f0b125b156130995761308d815f01518260200151613e6c565b6001600160401b031681525b80515f906130b4906001600160401b03908116908516614244565b90506130fb818989815181106130cc576130cc615678565b602002602001015187815181106130e5576130e5615678565b602002602001015161425890919063ffffffff16565b89888151811061310d5761310d615678565b6020026020010151868151811061312657613126615678565b602002602001018181525050505050505b600101612fd3565b5050600101612f4b565b5050949350505050565b606654600160ff83161b9081160361317e5760405163840a48d560e01b815260040160405180910390fd5b50565b5f60608161319260408601866156c3565b90506001600160401b038111156131ab576131ab614a77565b6040519080825280602002602001820160405280156131d4578160200160208202803683370190505b5090506131e460408601866156c3565b90506001600160401b038111156131fd576131fd614a77565b604051908082528060200260200182016040528015613226578160200160208202803683370190505b50915060a55f6132358661292e565b81526020019081526020015f205f815461324e90615a7e565b918290555092505f5b61326460408701876156c3565b9050811015613853578015806132f7575061328260408701876156c3565b61328d600184615a96565b81811061329c5761329c615678565b90506020020160208101906132b19190614c46565b6001600160a01b03166132c760408801886156c3565b838181106132d7576132d7615678565b90506020020160208101906132ec9190614c46565b6001600160a01b0316115b61331457604051639f1c805360e01b815260040160405180910390fd5b61332160608701876156c3565b8281811061333157613331615678565b905060200201355f1080156133715750670de0b6b3a764000061335760608801886156c3565b8381811061336757613367615678565b9050602002013511155b61338e57604051631353603160e01b815260040160405180910390fd5b6133cf61339e60408801886156c3565b838181106133ae576133ae615678565b90506020020160208101906133c39190614c46565b60995f6114758961292e565b6133ec576040516331bc342760e11b815260040160405180910390fd5b5f8061343e6133fe60208a018a614c46565b6134078961292e565b61341460408c018c6156c3565b8781811061342457613424615678565b90506020020160208101906134399190614c46565b612991565b805191935091506001600160401b03165f0361345b57505061384b565b5f61349661346c60608b018b6156c3565b8681811061347c5761347c615678565b85516001600160401b03169260209091020135905061426c565b83519091506134b16001600160401b03808416908316614244565b8686815181106134c3576134c3615678565b60200260200101818152505081835f018181516134e09190615aa9565b6001600160401b03169052508351829085906134fd908390615aa9565b6001600160401b031690525060208401805183919061351d908390615aa9565b6001600160401b031690525060208301515f600f9190910b1215613635575f61358061354c60608d018d6156c3565b8881811061355c5761355c615678565b90506020020135856020015161357190615ac8565b6001600160801b03169061426c565b9050806001600160401b03168460200181815161359d9190615aec565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd6135d160208d018d614c46565b8b6135df60408f018f6156c3565b8a8181106135ef576135ef615678565b90506020020160208101906136049190614c46565b613615885f01518960200151613e6c565b886040015160405161362b9594939291906157eb565b60405180910390a1505b61368761364560208c018c614c46565b61364e8b61292e565b61365b60408e018e6156c3565b8981811061366b5761366b615678565b90506020020160208101906136809190614c46565b8787613e8b565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd6136b560208c018c614c46565b8a6136c360408e018e6156c3565b898181106136d3576136d3615678565b90506020020160208101906136e89190614c46565b86516040516136fc949392919043906157eb565b60405180910390a161374d61371460208c018c614c46565b61372160408d018d6156c3565b8881811061373157613731615678565b90506020020160208101906137469190614c46565b8651614282565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635ae679a761378960208d018d614c46565b8b8b8e806040019061379b91906156c3565b8b8181106137ab576137ab615678565b90506020020160208101906137c09190614c46565b89516040516001600160e01b031960e088901b1681526137e895949392918991600401615b19565b6020604051808303815f875af1158015613804573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138289190615b6c565b87868151811061383a5761383a615678565b602002602001018181525050505050505b600101613257565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe56138826020870187614c46565b8561389060408901896156c3565b8561389e60808c018c615877565b6040516138b19796959493929190615b83565b60405180910390a1509250929050565b60605f61083c83614304565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f8111801561391757508261ffff1682105b15610b1b576001600160a01b038086165f90815260a360209081526040808320938816835292905290812061394b9061435d565b90505f5f61395a888489612991565b91509150806040015163ffffffff1643101561397857505050610b1b565b6139858884898585613e8b565b6001600160a01b038089165f90815260a360209081526040808320938b168352929052206139b2906143af565b506139bc85615a7e565b94506139c784615c19565b9350505050613905565b8015613a155773beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeabf196001600160a01b03831601613a1557604051632711b74d60e11b815260040160405180910390fd5b613a258260995f6122848761292e565b613a425760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b8383604051612745929190615905565b60605f613a7f8361442c565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613b2c5750806060015163ffffffff164310155b15613b4657604081015163ffffffff168152600160208201525b63ffffffff82166040820152613b7c7f00000000000000000000000000000000000000000000000000000000000000004361576a565b613b8790600161576a565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db9101612745565b6001600160a01b0381165f908152600183016020526040812054151561083c565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b81811015613da8576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120613d109083614453565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015613d8b575050613da8565b613d99868260200151613e6c565b95505050806001019050613cd8565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208390613dd8906140c3565b613de29190615aa9565b9150509250929050565b5f61083c83836144c2565b5f61083c836001600160a01b0384166144c2565b5f61083c8383670de0b6b3a76400006145a5565b5f613e308460995f6114758961292e565b8015613e395750815b801561149c57505090516001600160401b031615159392505050565b5f61083c6001600160401b03808516908416615c2e565b5f61083c613e83836001600160401b038616615aec565b600f0b6145fa565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b03908116911614613f5157602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b15614033576001600160a01b0385165f908152609f60209081526040808320878452909152902061400b90846140e1565b506001600160a01b0385165f908152609d6020526040902061402d90856140d6565b50610b1b565b80516001600160401b03165f03610b1b576001600160a01b0385165f908152609f6020908152604080832087845290915290206140709084613df7565b506001600160a01b0385165f908152609f60209081526040808320878452909152902061409c90612bdd565b5f03610b1b576001600160a01b0385165f908152609d602052604090206118609085613dec565b5f6108f182670de0b6b3a7640000614665565b5f61083c838361469c565b5f61083c836001600160a01b03841661469c565b5f805b8251811015614164576141248484838151811061411757614117615678565b602002602001015161087c565b801561414d575061414d83828151811061414057614140615678565b6020026020010151612785565b1561415c5760019150506108f1565b6001016140f8565b505f9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156141c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141ed9190615c5b565b6001600160a01b0316336001600160a01b0316146114625760405163794821ff60e01b815260040160405180910390fd5b5f825f01828154811061423357614233615678565b905f5260205f200154905092915050565b5f61083c83670de0b6b3a7640000846146e8565b5f61083c8383670de0b6b3a76400006146e8565b5f61083c8383670de0b6b3a764000060016147cd565b6001600160a01b038084165f90815260a1602090815260408083209386168352929052206142b190438361481c565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c90606001612745565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561435157602002820191905f5260205f20905b81548152602001906001019080831161433d575b50505050509050919050565b5f6143778254600f81810b600160801b909204900b131590565b1561439557604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f6143c98254600f81810b600160801b909204900b131590565b156143e757604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f60ff8216601f8111156108f157604051632cd44ac360e21b815260040160405180910390fd5b5f5f61447561446184614835565b85546144709190600f0b615c76565b61489e565b8454909150600160801b9004600f90810b9082900b126144a857604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f818152600183016020526040812054801561459c575f6144e4600183615a96565b85549091505f906144f790600190615a96565b9050818114614556575f865f01828154811061451557614515615678565b905f5260205f200154905080875f01848154811061453557614535615678565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061456757614567615c9d565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506108f1565b5f9150506108f1565b82545f90816145b686868385614907565b905080156145f0576145da866145cd600184615a96565b5f91825260209091200190565b54600160201b90046001600160e01b0316610872565b5091949350505050565b5f6001600160401b038211156146615760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084016128b3565b5090565b81545f9080156146945761467e846145cd600184615a96565b54600160201b90046001600160e01b03166108ed565b509092915050565b5f8181526001830160205260408120546146e157508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556108f1565b505f6108f1565b5f80805f19858709858702925082811083820303915050805f0361471f5783828161471557614715615cb1565b049250505061083c565b8084116147665760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016128b3565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f6147da8686866146e8565b905060018360028111156147f0576147f0615cc5565b14801561480c57505f848061480757614807615cb1565b868809115b1561149c57610872600182615cd9565b61483083836001600160401b03841661495a565b505050565b5f6001600160ff1b038211156146615760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016128b3565b80600f81900b81146149025760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016128b3565b919050565b5f5b81831015610a40575f61491c8484614a5d565b5f8781526020902090915063ffffffff86169082015463ffffffff16111561494657809250614954565b614951816001615cd9565b93505b50614909565b82548015614a10575f614972856145cd600185615a96565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b0316602084015291925090851610156149c45760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff808616911603614a0e57826149e5866145cd600186615a96565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f614a6b6002848418615cec565b61083c90848416615cd9565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614aad57614aad614a77565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614adb57614adb614a77565b604052919050565b6001600160a01b038116811461317e575f5ffd5b803563ffffffff81168114614902575f5ffd5b5f60408284031215614b1a575f5ffd5b604080519081016001600160401b0381118282101715614b3c57614b3c614a77565b6040529050808235614b4d81614ae3565b8152614b5b60208401614af7565b60208201525092915050565b5f60408284031215614b77575f5ffd5b61083c8383614b0a565b5f5f5f60808486031215614b93575f5ffd5b8335614b9e81614ae3565b9250614bad8560208601614b0a565b91506060840135614bbd81614ae3565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff1690820152606081016108f1565b5f5f60608385031215614c0c575f5ffd5b8235614c1781614ae3565b9150614c268460208501614b0a565b90509250929050565b5f60208284031215614c3f575f5ffd5b5035919050565b5f60208284031215614c56575f5ffd5b813561083c81614ae3565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b82811015614cba57614ca4868351614c61565b6040959095019460209190910190600101614c91565b5093949350505050565b602081525f61083c6020830184614c7f565b5f5f83601f840112614ce6575f5ffd5b5081356001600160401b03811115614cfc575f5ffd5b6020830191508360208260051b8501011115610ffa575f5ffd5b5f5f5f60408486031215614d28575f5ffd5b8335614d3381614ae3565b925060208401356001600160401b03811115614d4d575f5ffd5b614d5986828701614cd6565b9497909650939450505050565b5f6001600160401b03821115614d7e57614d7e614a77565b5060051b60200190565b5f82601f830112614d97575f5ffd5b8135614daa614da582614d66565b614ab3565b8082825260208201915060208360051b860101925085831115614dcb575f5ffd5b602085015b83811015614df1578035614de381614ae3565b835260209283019201614dd0565b5095945050505050565b5f5f5f60808486031215614e0d575f5ffd5b614e178585614b0a565b925060408401356001600160401b03811115614e31575f5ffd5b614e3d86828701614d88565b92505060608401356001600160401b03811115614e58575f5ffd5b614e6486828701614d88565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614cba578151865260209586019590910190600101614e80565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614ef557603f19878603018452614ee0858351614e6e565b94506020938401939190910190600101614ec4565b50929695505050505050565b5f5f5f5f60a08587031215614f14575f5ffd5b614f1e8686614b0a565b935060408501356001600160401b03811115614f38575f5ffd5b614f4487828801614d88565b93505060608501356001600160401b03811115614f5f575f5ffd5b614f6b87828801614d88565b925050614f7a60808601614af7565b905092959194509250565b5f5f5f5f5f60608688031215614f99575f5ffd5b8535614fa481614ae3565b945060208601356001600160401b03811115614fbe575f5ffd5b614fca88828901614cd6565b90955093505060408601356001600160401b03811115614fe8575f5ffd5b614ff488828901614cd6565b969995985093965092949392505050565b5f5f60408385031215615016575f5ffd5b823561502181614ae3565b915060208301356001600160401b0381111561503b575f5ffd5b830160a0818603121561504c575f5ffd5b809150509250929050565b828152604060208201525f610b306040830184614e6e565b5f5f60408385031215615080575f5ffd5b823561508b81614ae3565b9150602083013561504c81614ae3565b5f8151808452602084019350602083015f5b82811015614cba576150e686835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b60609590950194602091909101906001016150ad565b604081525f61510e6040830185614c7f565b828103602084015261149c818561509b565b5f8151808452602084019350602083015f5b82811015614cba5781516001600160a01b0316865260209586019590910190600101615132565b602081525f61083c6020830184615120565b5f5f6040838503121561517c575f5ffd5b82356001600160401b03811115615191575f5ffd5b61519d85828601614d88565b925050602083013561504c81614ae3565b602080825282518282018190525f918401906040840190835b818110156151ee5783516001600160401b03168352602093840193909201916001016151c7565b509095945050505050565b5f5f5f5f6060858703121561520c575f5ffd5b843561521781614ae3565b935061522560208601614af7565b925060408501356001600160401b0381111561523f575f5ffd5b61524b87828801614cd6565b95989497509550505050565b5f5f60408385031215615268575f5ffd5b823561527381614ae3565b915060208301356001600160401b0381111561528d575f5ffd5b613de285828601614d88565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f604083850312156152df575f5ffd5b82356152ea81614ae3565b9150614c2660208401614af7565b5f60208284031215615308575f5ffd5b813560ff8116811461083c575f5ffd5b5f60608284031215615328575f5ffd5b50919050565b5f6020828403121561533e575f5ffd5b81356001600160401b03811115615353575f5ffd5b6108ed84828501615318565b5f5f5f60808486031215615371575f5ffd5b83356001600160401b03811115615386575f5ffd5b61539286828701614d88565b935050614bad8560208601614b0a565b602081525f61083c602083018461509b565b5f5f5f606084860312156153c6575f5ffd5b83356153d181614ae3565b925060208401356001600160401b038111156153eb575f5ffd5b6153f786828701614d88565b92505061540660408501614af7565b90509250925092565b5f5f60408385031215615420575f5ffd5b823561542b81614ae3565b915060208301356001600160401b03811115615445575f5ffd5b8301601f81018513615455575f5ffd5b8035615463614da582614d66565b8082825260208201915060208360051b850101925087831115615484575f5ffd5b602084015b838110156155a95780356001600160401b038111156154a6575f5ffd5b85016080818b03601f190112156154bb575f5ffd5b6154c3614a8b565b6154d08b60208401614b0a565b815260608201356001600160401b038111156154ea575f5ffd5b6154f98c602083860101614d88565b60208301525060808201356001600160401b03811115615517575f5ffd5b6020818401019250508a601f83011261552e575f5ffd5b813561553c614da582614d66565b8082825260208201915060208360051b86010192508d83111561555d575f5ffd5b6020850194505b828510156155935784356001600160401b0381168114615582575f5ffd5b825260209485019490910190615564565b6040840152505084525060209283019201615489565b50809450505050509250929050565b5f5f5f604084860312156155ca575f5ffd5b83356155d581614ae3565b925060208401356001600160401b038111156155ef575f5ffd5b8401601f810186136155ff575f5ffd5b80356001600160401b03811115615614575f5ffd5b866020828401011115615625575f5ffd5b939660209190910195509293505050565b5f5f60408385031215615647575f5ffd5b823561565281614ae3565b915060208301356001600160401b0381111561566c575f5ffd5b613de285828601615318565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126156a0575f5ffd5b9190910192915050565b5f602082840312156156ba575f5ffd5b61083c82614af7565b5f5f8335601e198436030181126156d8575f5ffd5b8301803591506001600160401b038211156156f1575f5ffd5b6020019150600581901b3603821315610ffa575f5ffd5b5f60208284031215615718575f5ffd5b813561ffff8116811461083c575f5ffd5b5f60208284031215615739575f5ffd5b8151801515811461083c575f5ffd5b604081016108f18284614c61565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff81811683821601908111156108f1576108f1615756565b8183526020830192505f815f5b84811015614cba5763ffffffff6157a983614af7565b1686526020958601959190910190600101615793565b6001600160a01b038581168252841660208201526060604082018190525f906108729083018486615786565b6001600160a01b038616815260c081016158086020830187614c61565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610b3060208301848661583c565b5f5f8335601e1984360301811261588c575f5ffd5b8301803591506001600160401b038211156158a5575f5ffd5b602001915036819003821315610ffa575f5ffd5b6001600160a01b038781168252861660208201526080604082018190525f906158e59083018688615786565b82810360608401526158f881858761583c565b9998505050505050505050565b606081016159138285614c61565b6001600160a01b039290921660409190910152919050565b80516020808301519190811015615328575f1960209190910360031b1b16919050565b604081525f6159606040830185615120565b828103602084015261149c8185615120565b5f60208284031215615982575f5ffd5b81516001600160401b03811115615997575f5ffd5b8201601f810184136159a7575f5ffd5b80516159b5614da582614d66565b8082825260208201915060208360051b8501019250868311156159d6575f5ffd5b602084015b83811015615a735780516001600160401b038111156159f8575f5ffd5b8501603f81018913615a08575f5ffd5b6020810151615a19614da582614d66565b808282526020820191506020808460051b8601010192508b831115615a3c575f5ffd5b6040840193505b82841015615a5e578351825260209384019390910190615a43565b865250506020938401939190910190506159db565b509695505050505050565b5f60018201615a8f57615a8f615756565b5060010190565b818103818111156108f1576108f1615756565b6001600160401b0382811682821603908111156108f1576108f1615756565b5f81600f0b60016001607f1b03198103615ae457615ae4615756565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b0319821217156108f1576108f1615756565b6001600160a01b038716815260e08101615b366020830188614c61565b60608201959095526001600160a01b039390931660808401526001600160401b0391821660a08401521660c09091015292915050565b5f60208284031215615b7c575f5ffd5b5051919050565b6001600160a01b03881681525f60c08201615ba1602084018a614c61565b60c060608401528690528660e083015f5b88811015615be2578235615bc581614ae3565b6001600160a01b0316825260209283019290910190600101615bb2565b508381036080850152615bf58188614e6e565b91505082810360a0840152615c0b81858761583c565b9a9950505050505050505050565b5f81615c2757615c27615756565b505f190190565b600f82810b9082900b0360016001607f1b0319811260016001607f1b03821317156108f1576108f1615756565b5f60208284031215615c6b575f5ffd5b815161083c81614ae3565b8082018281125f831280158216821582161715615c9557615c95615756565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b808201808211156108f1576108f1615756565b5f82615d0657634e487b7160e01b5f52601260045260245ffd5b50049056fea26469706673582212207ffcd99f9165c1567b83e60ff543a1e3202c0fabec9debb5f8adec22b57d410364736f6c634300081b0033", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_delegation\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"},{\"name\":\"_eigenStrategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"_pauserRegistry\",\"type\":\"address\",\"internalType\":\"contractIPauserRegistry\"},{\"name\":\"_permissionController\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"},{\"name\":\"_DEALLOCATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_ALLOCATION_CONFIGURATION_DELAY\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRedistributingOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]},{\"name\":\"redistributionRecipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRedistributionRecipient\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"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\":\"permissionController\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIPermissionController\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unpause\",\"inputs\":[{\"name\":\"newPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"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\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"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\":\"RedistributionAddressSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"redistributionRecipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"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\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"Empty\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNewPausedStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPermissions\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRedistributionRecipient\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonexistentAVSMetadata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyPauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyUnpauser\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutOfBounds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", + Bin: "0x610160604052348015610010575f5ffd5b506040516161d63803806161d683398101604081905261002f916101ef565b8084888886868a6001600160a01b03811661005d576040516339b190bb60e11b815260040160405180910390fd5b6001600160a01b0390811660805293841660a05291831660c05263ffffffff90811660e05216610100521661012052610095816100ae565b61014052506100a26100f4565b50505050505050610367565b5f5f829050601f815111156100e1578260405163305a27a960e01b81526004016100d8919061030c565b60405180910390fd5b80516100ec82610341565b179392505050565b5f54610100900460ff161561015b5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084016100d8565b5f5460ff908116146101aa575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146101c0575f5ffd5b50565b805163ffffffff811681146101d6575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f5f5f60e0888a031215610205575f5ffd5b8751610210816101ac565b6020890151909750610221816101ac565b6040890151909650610232816101ac565b6060890151909550610243816101ac565b9350610251608089016101c3565b925061025f60a089016101c3565b60c08901519092506001600160401b0381111561027a575f5ffd5b8801601f81018a1361028a575f5ffd5b80516001600160401b038111156102a3576102a36101db565b604051601f8201601f19908116603f011681016001600160401b03811182821017156102d1576102d16101db565b6040528181528282016020018c10156102e8575f5ffd5b8160208401602083015e5f6020838301015280935050505092959891949750929550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80516020808301519190811015610361575f198160200360031b1b821691505b50919050565b60805160a05160c05160e051610100516101205161014051615dca61040c5f395f61136d01525f81816104cd0152612c9101525f81816106400152613be001525f81816103d6015281816117660152611e3901525f818161079b0152613a4c01525f81816107d5015281816113a10152818161140b0152818161211901528181612f0501526137a201525f818161066701528181612b5d01526141f80152615dca5ff3fe608060405234801561000f575f5ffd5b50600436106102ff575f3560e01c8063670d3ba211610195578063b2447af7116100e4578063db4df7611161009e578063f231bd0811610079578063f231bd08146107f7578063f605ce081461080a578063fabc1cbc1461081d578063fe4b84df14610830575f5ffd5b8063db4df76114610796578063dc2af692146107bd578063df5cf723146107d0575f5ffd5b8063b2447af714610708578063b66bd9891461071b578063b9fbaed11461072e578063ba1a84e51461075d578063c221d8ae14610770578063d3d96ff414610783575f5ffd5b8063886f11951161014f578063952899ee1161012a578063952899ee146106bc578063a9333ec8146106cf578063a9821821146106e2578063adc2e3d9146106f5575f5ffd5b8063886f1195146106625780638ce648541461068957806394d7d00c146106a9575f5ffd5b8063670d3ba2146105c45780636cfb4481146105d75780636e3492b5146106025780636e875dba1461061557806379ae50cd146106285780637bc1ef611461063b575f5ffd5b806340120dab1161025157806350feea201161020b57806356c483e6116101e657806356c483e61461057e578063595c6a67146105915780635ac86ab7146105995780635c975abb146105bc575f5ffd5b806350feea2014610543578063547afb871461055657806354fd4d5014610569575f5ffd5b806340120dab146104875780634177a87c146104a85780634657e26a146104c85780634a10ffe5146104ef5780634b5046ef1461050f5780634cfd293914610522575f5ffd5b8063261f84e0116102bc5780632bab2c4a116102975780632bab2c4a1461042d578063304c10cd1461044057806332a879e4146104535780633635205714610466575f5ffd5b8063261f84e0146103be5780632981eb77146103d15780632b453a9a1461040d575f5ffd5b80630f3df50e1461030357806310e1b9b8146103335780631352c3e614610353578063136439dd1461037657806315fe50281461038b578063260dc758146103ab575b5f5ffd5b610316610311366004614bf0565b610843565b6040516001600160a01b0390911681526020015b60405180910390f35b610346610341366004614c0a565b610884565b60405161032a9190614c51565b610366610361366004614c84565b6108bd565b604051901515815260200161032a565b610389610384366004614cb8565b610938565b005b61039e610399366004614ccf565b610972565b60405161032a9190614d4d565b6103666103b9366004614bf0565b610a89565b6103896103cc366004614d9f565b610aba565b6103f87f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161032a565b61042061041b366004614e84565b610b63565b60405161032a9190614f27565b61042061043b366004614f8a565b610b79565b61031661044e366004614ccf565b610c18565b61038961046136600461500e565b610c47565b61047961047436600461508e565b610d8e565b60405161032a9291906150e0565b61049a6104953660046150f8565b610ed1565b60405161032a929190615185565b6104bb6104b6366004614bf0565b61104c565b60405161032a91906151e2565b6103167f000000000000000000000000000000000000000000000000000000000000000081565b6105026104fd3660046151f4565b611070565b60405161032a9190615237565b61038961051d36600461500e565b611118565b610535610530366004614bf0565b6111ab565b60405190815260200161032a565b610389610551366004615282565b6111cd565b6105026105643660046152e0565b6112be565b610571611366565b60405161032a9190615322565b61038961058c366004615357565b611396565b61038961149b565b6103666105a7366004615381565b606654600160ff9092169190911b9081161490565b606654610535565b6103666105d2366004614c84565b6114af565b6105ea6105e53660046150f8565b6114db565b6040516001600160401b03909116815260200161032a565b6103896106103660046153b7565b6114f0565b6104bb610623366004614bf0565b6118b3565b61039e610636366004614ccf565b6118c4565b6103f87f000000000000000000000000000000000000000000000000000000000000000081565b6103167f000000000000000000000000000000000000000000000000000000000000000081565b61069c6106973660046153e8565b61199e565b60405161032a919061542b565b6105026106b736600461543d565b611a5a565b6103896106ca366004615498565b611b46565b6105ea6106dd3660046150f8565b611fe7565b6103896106f0366004615641565b612016565b6103896107033660046156bf565b6120c8565b610535610716366004614bf0565b612411565b610389610729366004615282565b612433565b61074161073c366004614ccf565b61258d565b60408051921515835263ffffffff90911660208301520161032a565b61053561076b366004614ccf565b612627565b6104bb61077e366004614c84565b612647565b6103896107913660046150f8565b612670565b6103167f000000000000000000000000000000000000000000000000000000000000000081565b6103666107cb366004614ccf565b61279d565b6103167f000000000000000000000000000000000000000000000000000000000000000081565b610366610805366004614bf0565b6127d0565b6105ea6108183660046150f8565b6127ef565b61038961082b366004614cb8565b6127fb565b61038961083e366004614cb8565b612868565b5f5f60a65f61085185612979565b815260208101919091526040015f20546001600160a01b031690508015610878578061087d565b620e16e45b9392505050565b604080516060810182525f80825260208201819052918101829052906108b3856108ad86612979565b856129dc565b9695505050505050565b6001600160a01b0382165f908152609e602052604081208190816108e085612979565b815260208082019290925260409081015f2081518083019092525460ff8116151580835261010090910463ffffffff169282019290925291508061092e5750806020015163ffffffff164311155b9150505b92915050565b610940612b48565b60665481811681146109655760405163c61dca5d60e01b815260040160405180910390fd5b61096e82612beb565b5050565b6001600160a01b0381165f908152609d602052604081206060919061099690612c28565b90505f816001600160401b038111156109b1576109b1614b00565b6040519080825280602002602001820160405280156109f557816020015b604080518082019091525f80825260208201528152602001906001900390816109cf5790505b5090505f5b82811015610a81576001600160a01b0385165f908152609d60205260409020610a5c90610a279083612c31565b604080518082019091525f80825260208201525060408051808201909152606082901c815263ffffffff909116602082015290565b828281518110610a6e57610a6e615701565b60209081029190910101526001016109fa565b509392505050565b60208082015182516001600160a01b03165f9081526098909252604082206109329163ffffffff90811690612c3c16565b82610ac481612c53565b610ae15760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b0384165f90815260a4602052604090205460ff16610b19576040516348f7dbb960e01b815260040160405180910390fd5b5f5b82811015610b5c57610b5485858584818110610b3957610b39615701565b9050602002810190610b4b9190615715565b620e16e4612cfd565b600101610b1b565b5050505050565b6060610b7184848443612eb1565b949350505050565b6060610b8785858585612eb1565b90505f5b8451811015610c0f57610bb7858281518110610ba957610ba9615701565b6020026020010151876108bd565b610c07575f5b8451811015610c05575f838381518110610bd957610bd9615701565b60200260200101518281518110610bf257610bf2615701565b6020908102919091010152600101610bbd565b505b600101610b8b565b50949350505050565b6001600160a01b038082165f908152609760205260408120549091168015610c40578061087d565b5090919050565b84610c5181612c53565b610c6e5760405163932d94f760e01b815260040160405180910390fd5b838214610c8e576040516343714afd60e01b815260040160405180910390fd5b6001600160a01b0386165f90815260a4602052604090205460ff16610cc6576040516348f7dbb960e01b815260040160405180910390fd5b5f5b84811015610d85575f848483818110610ce357610ce3615701565b9050602002016020810190610cf89190614ccf565b90506001600160a01b038116610d21576040516339b190bb60e11b815260040160405180910390fd5b620e16e3196001600160a01b03821601610d4e576040516364be1a3f60e11b815260040160405180910390fd5b610d7c88888885818110610d6457610d64615701565b9050602002810190610d769190615715565b83612cfd565b50600101610cc8565b50505050505050565b5f60606001610d9c8161319e565b84610da681612c53565b610dc35760405163932d94f760e01b815260040160405180910390fd5b5f6040518060400160405280886001600160a01b03168152602001876020016020810190610df19190615733565b63ffffffff1690529050610e08606087018761574c565b9050610e17604088018861574c565b905014610e37576040516343714afd60e01b815260040160405180910390fd5b60208082015182516001600160a01b03165f90815260989092526040909120610e699163ffffffff90811690612c3c16565b610e8657604051631fb1705560e21b815260040160405180910390fd5b610e9c610e966020880188614ccf565b826108bd565b610eb95760405163ebbff49760e01b815260040160405180910390fd5b610ec386826131cc565b945094505050509250929050565b6001600160a01b0382165f908152609d602052604081206060918291610ef690612c28565b90505f816001600160401b03811115610f1157610f11614b00565b604051908082528060200260200182016040528015610f5557816020015b604080518082019091525f8082526020820152815260200190600190039081610f2f5790505b5090505f826001600160401b03811115610f7157610f71614b00565b604051908082528060200260200182016040528015610fba57816020015b604080516060810182525f80825260208083018290529282015282525f19909201910181610f8f5790505b5090505f5b8381101561103d576001600160a01b0388165f908152609d60205260408120610fec90610a279084612c31565b90508084838151811061100157611001615701565b602002602001018190525061101789828a610884565b83838151811061102957611029615701565b602090810291909101015250600101610fbf565b509093509150505b9250929050565b60605f61087d60995f61105e86612979565b81526020019081526020015f2061390c565b60605f83516001600160401b0381111561108c5761108c614b00565b6040519080825280602002602001820160405280156110b5578160200160208202803683370190505b5090505f5b8451811015610a81576110e68582815181106110d8576110d8615701565b602002602001015185611fe7565b8282815181106110f8576110f8615701565b6001600160401b03909216602092830291909101909101526001016110ba565b5f6111228161319e565b838214611142576040516343714afd60e01b815260040160405180910390fd5b5f5b84811015610d85576111a38787878481811061116257611162615701565b90506020020160208101906111779190614ccf565b86868581811061118957611189615701565b905060200201602081019061119e9190615791565b613918565b600101611144565b5f60a55f6111b884612979565b81526020019081526020015f20549050919050565b836111d781612c53565b6111f45760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f938452609890529390912091926112339291612c3c16565b61125057604051631fb1705560e21b815260040160405180910390fd5b5f5b83811015610d85576112b68286868481811061127057611270615701565b90506020020160208101906112859190614ccf565b6112b160405180604001604052808c6001600160a01b031681526020018b63ffffffff168152506127d0565b613a1c565b600101611252565b60605f82516001600160401b038111156112da576112da614b00565b604051908082528060200260200182016040528015611303578160200160208202803683370190505b5090505f5b8351811015610a81576113348585838151811061132757611327615701565b6020026020010151611fe7565b82828151811061134657611346615701565b6001600160401b0390921660209283029190910190910152600101611308565b60606113917f0000000000000000000000000000000000000000000000000000000000000000613afc565b905090565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611491576113cf82612c53565b6113ec576040516348f5c3ed60e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa158015611450573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147491906157b2565b6114915760405163ccea9e6f60e01b815260040160405180910390fd5b61096e8282613b39565b6114a3612b48565b6114ad5f19612beb565b565b5f61087d83609a5f6114c086612979565b81526020019081526020015f20613ce590919063ffffffff16565b5f5f6114e78484613d06565b95945050505050565b60026114fb8161319e565b61151061150b6020840184614ccf565b612c53565b80611529575061152961150b6040840160208501614ccf565b611546576040516348f5c3ed60e01b815260040160405180910390fd5b5f5b611555604084018461574c565b9050811015611817575f604051806040016040528085602001602081019061157d9190614ccf565b6001600160a01b03168152602001611598604087018761574c565b858181106115a8576115a8615701565b90506020020160208101906115bd9190615733565b63ffffffff16815250905061160a816020015163ffffffff1660985f8760200160208101906115ec9190614ccf565b6001600160a01b0316815260208101919091526040015f2090612c3c565b61162757604051631fb1705560e21b815260040160405180910390fd5b609e5f6116376020870187614ccf565b6001600160a01b03166001600160a01b031681526020019081526020015f205f61166083612979565b815260208101919091526040015f205460ff16611690576040516325131d4f60e01b815260040160405180910390fd5b6116ca61169c82612979565b609c5f6116ac6020890189614ccf565b6001600160a01b0316815260208101919091526040015f2090613e75565b506117026116db6020860186614ccf565b609a5f6116e785612979565b81526020019081526020015f20613e8090919063ffffffff16565b506117106020850185614ccf565b6001600160a01b03167fad34c3070be1dffbcaa499d000ba2b8d9848aefcac3059df245dd95c4ece14fe8260405161174891906157d1565b60405180910390a2604080518082019091525f81526020810161178b7f0000000000000000000000000000000000000000000000000000000000000000436157f3565b63ffffffff169052609e5f6117a36020880188614ccf565b6001600160a01b03166001600160a01b031681526020019081526020015f205f6117cc84612979565b81526020808201929092526040015f2082518154939092015163ffffffff166101000264ffffffff00199215159290921664ffffffffff199093169290921717905550600101611548565b5061182b61044e6040840160208501614ccf565b6001600160a01b031663303ca9566118466020850185614ccf565b6118566040860160208701614ccf565b611863604087018761574c565b6040518563ffffffff1660e01b81526004016118829493929190615848565b5f604051808303815f87803b158015611899575f5ffd5b505af11580156118ab573d5f5f3e3d5ffd5b505050505050565b6060610932609a5f61105e85612979565b6001600160a01b0381165f908152609c60205260408120606091906118e890612c28565b90505f816001600160401b0381111561190357611903614b00565b60405190808252806020026020018201604052801561194757816020015b604080518082019091525f80825260208201528152602001906001900390816119215790505b5090505f5b82811015610a81576001600160a01b0385165f908152609c6020526040902061197990610a279083612c31565b82828151811061198b5761198b615701565b602090810291909101015260010161194c565b60605f84516001600160401b038111156119ba576119ba614b00565b604051908082528060200260200182016040528015611a0357816020015b604080516060810182525f80825260208083018290529282015282525f199092019101816119d85790505b5090505f5b8551811015610c0f57611a35868281518110611a2657611a26615701565b60200260200101518686610884565b828281518110611a4757611a47615701565b6020908102919091010152600101611a08565b60605f83516001600160401b03811115611a7657611a76614b00565b604051908082528060200260200182016040528015611a9f578160200160208202803683370190505b5090505f5b8451811015610c0f576001600160a01b0386165f90815260a1602052604081208651611b1492879291899086908110611adf57611adf615701565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20613e9490919063ffffffff16565b828281518110611b2657611b26615701565b6001600160401b0390921660209283029190910190910152600101611aa4565b5f611b508161319e565b611b5983612c53565b611b76576040516348f5c3ed60e01b815260040160405180910390fd5b5f5f5f611b828661258d565b9150915081611ba45760405163fa55fc8160e01b815260040160405180910390fd5b91505f90505b8351811015610b5c57838181518110611bc557611bc5615701565b60200260200101516040015151848281518110611be457611be4615701565b6020026020010151602001515114611c0f576040516343714afd60e01b815260040160405180910390fd5b5f848281518110611c2257611c22615701565b602090810291909101810151518082015181516001600160a01b03165f90815260989093526040909220909250611c629163ffffffff90811690612c3c16565b611c7f57604051631fb1705560e21b815260040160405180910390fd5b5f611c8a87836108bd565b90505f5b868481518110611ca057611ca0615701565b60200260200101516020015151811015611fdc575f878581518110611cc757611cc7615701565b6020026020010151602001518281518110611ce457611ce4615701565b60200260200101519050611cfb898261ffff613918565b5f5f611d0a8b6108ad88612979565b91509150806040015163ffffffff165f14611d3857604051630d8fcbe360e41b815260040160405180910390fd5b5f611d4587858489613ea8565b9050611d8a825f01518c8a81518110611d6057611d60615701565b6020026020010151604001518781518110611d7d57611d7d615701565b6020026020010151613ede565b600f0b602083018190525f03611db357604051634606179360e11b815260040160405180910390fd5b5f8260200151600f0b1215611ef7578015611e7957611e34611dd488612979565b6001600160a01b03808f165f90815260a360209081526040808320938a16835292905220908154600160801b90819004600f0b5f818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b611e5e7f0000000000000000000000000000000000000000000000000000000000000000436157f3565b611e699060016157f3565b63ffffffff166040830152611f64565b611e8b83602001518360200151613ef5565b6001600160401b031660208401528a518b9089908110611ead57611ead615701565b6020026020010151604001518581518110611eca57611eca615701565b6020908102919091018101516001600160401b031683525f9083015263ffffffff43166040830152611f64565b5f8260200151600f0b1315611f6457611f1883602001518360200151613ef5565b6001600160401b039081166020850181905284519091161015611f4e57604051636c9be0bf60e01b815260040160405180910390fd5b611f5889436157f3565b63ffffffff1660408301525b611f798c611f7189612979565b868686613f14565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd8c8886611fae865f01518760200151613ef5565b8660400151604051611fc4959493929190615874565b60405180910390a1505060019092019150611c8e9050565b505050600101611baa565b6001600160a01b038083165f90815260a160209081526040808320938516835292905290812061087d9061414c565b8261202081612c53565b61203d5760405163932d94f760e01b815260040160405180910390fd5b6001600160a01b0384165f90815260a4602052604090205460ff1661207f576001600160a01b0384165f90815260a460205260409020805460ff191660011790555b836001600160a01b03167fa89c1dc243d8908a96dd84944bcc97d6bc6ac00dd78e20621576be6a3c94371384846040516120ba9291906158ed565b60405180910390a250505050565b60026120d38161319e565b826120dd81612c53565b6120fa5760405163932d94f760e01b815260040160405180910390fd5b6040516336b87bd760e11b81526001600160a01b0385811660048301527f00000000000000000000000000000000000000000000000000000000000000001690636d70f7ae90602401602060405180830381865afa15801561215e573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061218291906157b2565b61219f5760405163ccea9e6f60e01b815260040160405180910390fd5b5f5b6121ae602085018561574c565b905081101561237657604080518082019091525f90806121d16020880188614ccf565b6001600160a01b031681526020018680602001906121ef919061574c565b858181106121ff576121ff615701565b90506020020160208101906122149190615733565b63ffffffff90811690915260208083015183516001600160a01b03165f90815260989092526040909120929350612250929190811690612c3c16565b61226d57604051631fb1705560e21b815260040160405180910390fd5b61227786826108bd565b1561229557604051636c6c6e2760e11b815260040160405180910390fd5b6122be6122a182612979565b6001600160a01b0388165f908152609c602052604090209061415f565b506122ea86609a5f6122cf85612979565b81526020019081526020015f2061416a90919063ffffffff16565b50856001600160a01b03167f43232edf9071753d2321e5fa7e018363ee248e5f2142e6c08edd3265bfb4895e8260405161232491906157d1565b60405180910390a26001600160a01b0386165f908152609e6020526040812060019161234f84612979565b815260208101919091526040015f20805460ff1916911515919091179055506001016121a1565b5061238761044e6020850185614ccf565b6001600160a01b031663c63fd502856123a36020870187614ccf565b6123b0602088018861574c565b6123bd60408a018a615900565b6040518763ffffffff1660e01b81526004016123de96959493929190615942565b5f604051808303815f87803b1580156123f5575f5ffd5b505af1158015612407573d5f5f3e3d5ffd5b5050505050505050565b5f610932609a5f61242185612979565b81526020019081526020015f20612c28565b8361243d81612c53565b61245a5760405163932d94f760e01b815260040160405180910390fd5b6040805180820182526001600160a01b03871680825263ffffffff80881660208085018290525f938452609890529390912091926124999291612c3c16565b6124b657604051631fb1705560e21b815260040160405180910390fd5b5f6124c082612979565b90505f5b84811015612407576125098686838181106124e1576124e1615701565b90506020020160208101906124f69190614ccf565b5f84815260996020526040902090613e80565b612526576040516331bc342760e11b815260040160405180910390fd5b7f7b4b073d80dcac55a11177d8459ad9f664ceeb91f71f27167bb14f8152a7eeee8387878481811061255a5761255a615701565b905060200201602081019061256f9190614ccf565b60405161257d92919061598e565b60405180910390a16001016124c4565b6001600160a01b0381165f908152609b602090815260408083208151608081018352905463ffffffff80821680845260ff600160201b8404161515958401869052650100000000008304821694840194909452600160481b90910416606082018190528493919291901580159061260e5750826060015163ffffffff164310155b1561261d575050604081015160015b9590945092505050565b6001600160a01b0381165f90815260986020526040812061093290612c28565b6001600160a01b0382165f908152609f602052604081206060919061092e908261105e86612979565b8161267a81612c53565b6126975760405163932d94f760e01b815260040160405180910390fd5b60405163b526578760e01b81526001600160a01b03848116600483015283169063b526578790602401602060405180830381865afa1580156126db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126ff91906157b2565b61271c57604051631d0b13c160e31b815260040160405180910390fd5b6001600160a01b038381165f90815260976020526040902080546001600160a01b0319169184169190911790557f2ae945c40c44dc0ec263f95609c3fdc6952e0aefa22d6374e44f2c997acedf858361277481610c18565b604080516001600160a01b039384168152929091166020830152015b60405180910390a1505050565b5f5f6127a8836118c4565b90505f6127b484610972565b90506127c0848361417e565b80610b715750610b71848261417e565b5f620e16e46127de83610843565b6001600160a01b0316141592915050565b5f5f610c0f8484613d06565b6128036141f6565b6066548019821981161461282a5760405163c61dca5d60e01b815260040160405180910390fd5b606682905560405182815233907f3582d1828e26bf56bd801502bc021ac0bc8afb57c826e4986b45593c8fad389c9060200160405180910390a25050565b5f54610100900460ff161580801561288657505f54600160ff909116105b8061289f5750303b15801561289f57505f5460ff166001145b6129075760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015612928575f805461ff0019166101001790555b61293182612beb565b801561096e575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b5f815f0151826020015163ffffffff166040516020016129c492919060609290921b6bffffffffffffffffffffffff1916825260a01b6001600160a01b031916601482015260200190565b604051602081830303815290604052610932906159b4565b6040805180820182525f80825260208083018290528351606081018552828152808201839052808501839052845180860186526001600160a01b03898116855260a1845286852090881685529092529382209293928190612a3c9061414c565b6001600160401b0390811682526001600160a01b038981165f81815260a260209081526040808320948c168084529482528083205486169682019690965291815260a082528481208b8252825284812092815291815290839020835160608101855290549283168152600160401b8304600f0b91810191909152600160c01b90910463ffffffff16918101829052919250431015612ade579092509050612b40565b612aef815f01518260200151613ef5565b6001600160401b0316815260208101515f600f9190910b1215612b2d57612b1e82602001518260200151613ef5565b6001600160401b031660208301525b5f60408201819052602082015290925090505b935093915050565b60405163237dfb4760e11b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906346fbf68e90602401602060405180830381865afa158015612baa573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bce91906157b2565b6114ad57604051631d77d47760e21b815260040160405180910390fd5b606681905560405181815233907fab40a374bc51de372200a8bc981af8c9ecdc08dfdaef0bb6e09f88f3c616ef3d9060200160405180910390a250565b5f610932825490565b5f61087d83836142a7565b5f818152600183016020526040812054151561087d565b604051631beb2b9760e31b81526001600160a01b0382811660048301523360248301523060448301525f80356001600160e01b0319166064840152917f00000000000000000000000000000000000000000000000000000000000000009091169063df595cb8906084016020604051808303815f875af1158015612cd9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093291906157b2565b5f6040518060400160405280856001600160a01b03168152602001845f016020810190612d2a9190615733565b63ffffffff168152509050612d74816020015163ffffffff1660985f876001600160a01b03166001600160a01b031681526020019081526020015f2061415f90919063ffffffff16565b612d9157604051631fb1705560e21b815260040160405180910390fd5b7f31629285ead2335ae0933f86ed2ae63321f7af77b4e6eaabc42c057880977e6c81604051612dc091906157d1565b60405180910390a16001600160a01b038216620e16e414801590612e55578260a65f612deb85612979565b81526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055507f90a6fa2a9b79b910872ebca540cf3bd8be827f586e6420c30d8836e30012907e8284604051612e4c92919061598e565b60405180910390a15b5f5b612e64602086018661574c565b90508110156118ab57612ea983612e7e602088018861574c565b84818110612e8e57612e8e615701565b9050602002016020810190612ea39190614ccf565b84613a1c565b600101612e57565b606083516001600160401b03811115612ecc57612ecc614b00565b604051908082528060200260200182016040528015612eff57816020015b6060815260200190600190039081612eea5790505b5090505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f0e0e67686866040518363ffffffff1660e01b8152600401612f519291906159d7565b5f60405180830381865afa158015612f6b573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f9291908101906159fb565b90505f5b8551811015613194575f868281518110612fb257612fb2615701565b6020026020010151905085516001600160401b03811115612fd557612fd5614b00565b604051908082528060200260200182016040528015612ffe578160200160208202803683370190505b5084838151811061301157613011615701565b60209081029190910101525f5b865181101561318a575f87828151811061303a5761303a615701565b6020908102919091018101516001600160a01b038086165f90815260a18452604080822092841682529190935282209092506130759061414c565b9050806001600160401b03165f0361308e575050613182565b5f61309a858d85610884565b90508863ffffffff16816040015163ffffffff16111580156130c257505f8160200151600f0b125b156130e4576130d8815f01518260200151613ef5565b6001600160401b031681525b80515f906130ff906001600160401b039081169085166142cd565b90506131468189898151811061311757613117615701565b6020026020010151878151811061313057613130615701565b60200260200101516142e190919063ffffffff16565b89888151811061315857613158615701565b6020026020010151868151811061317157613171615701565b602002602001018181525050505050505b60010161301e565b5050600101612f96565b5050949350505050565b606654600160ff83161b908116036131c95760405163840a48d560e01b815260040160405180910390fd5b50565b5f6060816131dd604086018661574c565b90506001600160401b038111156131f6576131f6614b00565b60405190808252806020026020018201604052801561321f578160200160208202803683370190505b50905061322f604086018661574c565b90506001600160401b0381111561324857613248614b00565b604051908082528060200260200182016040528015613271578160200160208202803683370190505b50915060a55f61328086612979565b81526020019081526020015f205f815461329990615b07565b918290555092505f5b6132af604087018761574c565b905081101561389e5780158061334257506132cd604087018761574c565b6132d8600184615b1f565b8181106132e7576132e7615701565b90506020020160208101906132fc9190614ccf565b6001600160a01b0316613312604088018861574c565b8381811061332257613322615701565b90506020020160208101906133379190614ccf565b6001600160a01b0316115b61335f57604051639f1c805360e01b815260040160405180910390fd5b61336c606087018761574c565b8281811061337c5761337c615701565b905060200201355f1080156133bc5750670de0b6b3a76400006133a2606088018861574c565b838181106133b2576133b2615701565b9050602002013511155b6133d957604051631353603160e01b815260040160405180910390fd5b61341a6133e9604088018861574c565b838181106133f9576133f9615701565b905060200201602081019061340e9190614ccf565b60995f6114c089612979565b613437576040516331bc342760e11b815260040160405180910390fd5b5f8061348961344960208a018a614ccf565b61345289612979565b61345f60408c018c61574c565b8781811061346f5761346f615701565b90506020020160208101906134849190614ccf565b6129dc565b805191935091506001600160401b03165f036134a6575050613896565b5f6134e16134b760608b018b61574c565b868181106134c7576134c7615701565b85516001600160401b0316926020909102013590506142f5565b83519091506134fc6001600160401b038084169083166142cd565b86868151811061350e5761350e615701565b60200260200101818152505081835f0181815161352b9190615b32565b6001600160401b0316905250835182908590613548908390615b32565b6001600160401b0316905250602084018051839190613568908390615b32565b6001600160401b031690525060208301515f600f9190910b1215613680575f6135cb61359760608d018d61574c565b888181106135a7576135a7615701565b9050602002013585602001516135bc90615b51565b6001600160801b0316906142f5565b9050806001600160401b0316846020018181516135e89190615b75565b600f0b9052507f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61361c60208d018d614ccf565b8b61362a60408f018f61574c565b8a81811061363a5761363a615701565b905060200201602081019061364f9190614ccf565b613660885f01518960200151613ef5565b8860400151604051613676959493929190615874565b60405180910390a1505b6136d261369060208c018c614ccf565b6136998b612979565b6136a660408e018e61574c565b898181106136b6576136b6615701565b90506020020160208101906136cb9190614ccf565b8787613f14565b7f1487af5418c47ee5ea45ef4a93398668120890774a9e13487e61e9dc3baf76dd61370060208c018c614ccf565b8a61370e60408e018e61574c565b8981811061371e5761371e615701565b90506020020160208101906137339190614ccf565b865160405161374794939291904390615874565b60405180910390a161379861375f60208c018c614ccf565b61376c60408d018d61574c565b8881811061377c5761377c615701565b90506020020160208101906137919190614ccf565b865161430b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635ae679a76137d460208d018d614ccf565b8b8b8e80604001906137e6919061574c565b8b8181106137f6576137f6615701565b905060200201602081019061380b9190614ccf565b89516040516001600160e01b031960e088901b16815261383395949392918991600401615ba2565b6020604051808303815f875af115801561384f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138739190615bf5565b87868151811061388557613885615701565b602002602001018181525050505050505b6001016132a2565b507f80969ad29428d6797ee7aad084f9e4a42a82fc506dcd2ca3b6fb431f85ccebe56138cd6020870187614ccf565b856138db604089018961574c565b856138e960808c018c615900565b6040516138fc9796959493929190615c0c565b60405180910390a1509250929050565b60605f61087d8361438d565b6001600160a01b038381165f90815260a360209081526040808320938616835292905290812054600f81810b600160801b909204900b035b5f8111801561396257508261ffff1682105b15610b5c576001600160a01b038086165f90815260a3602090815260408083209388168352929052908120613996906143e6565b90505f5f6139a58884896129dc565b91509150806040015163ffffffff164310156139c357505050610b5c565b6139d08884898585613f14565b6001600160a01b038089165f90815260a360209081526040808320938b168352929052206139fd90614438565b50613a0785615b07565b9450613a1284615ca2565b9350505050613950565b8015613a9e576001600160a01b03821673beac0eeeeeeeeeeeeeeeeeeeeeeeeeeeeeebeac014801590613a8157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b613a9e57604051632711b74d60e11b815260040160405180910390fd5b613aae8260995f6122cf87612979565b613acb5760405163585cfb2f60e01b815260040160405180910390fd5b7f7ab260fe0af193db5f4986770d831bda4ea46099dc817e8b6716dcae8af8e88b838360405161279092919061598e565b60605f613b08836144b5565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b6001600160a01b0382165f908152609b60209081526040918290208251608081018452905463ffffffff808216835260ff600160201b830416151593830193909352650100000000008104831693820193909352600160481b909204166060820181905215801590613bb55750806060015163ffffffff164310155b15613bcf57604081015163ffffffff168152600160208201525b63ffffffff82166040820152613c057f0000000000000000000000000000000000000000000000000000000000000000436157f3565b613c109060016157f3565b63ffffffff90811660608381019182526001600160a01b0386165f818152609b602090815260409182902087518154838a0151858b01519851928a1664ffffffffff1990921691909117600160201b91151591909102176cffffffffffffffff0000000000191665010000000000978916979097026cffffffff000000000000000000191696909617600160481b968816968702179055815192835294871694820194909452928301919091527f4e85751d6331506c6c62335f207eb31f12a61e570f34f5c17640308785c6d4db9101612790565b6001600160a01b0381165f908152600183016020526040812054151561087d565b6001600160a01b038281165f81815260a2602090815260408083209486168084529482528083205493835260a38252808320948352939052918220546001600160401b039091169190600f81810b600160801b909204900b03815b81811015613e31576001600160a01b038087165f90815260a3602090815260408083209389168352929052908120613d9990836144dc565b6001600160a01b038881165f90815260a0602090815260408083208584528252808320938b16835292815290829020825160608101845290546001600160401b0381168252600160401b8104600f0b92820192909252600160c01b90910463ffffffff16918101829052919250431015613e14575050613e31565b613e22868260200151613ef5565b95505050806001019050613d61565b506001600160a01b038086165f90815260a1602090815260408083209388168352929052208390613e619061414c565b613e6b9190615b32565b9150509250929050565b5f61087d838361454b565b5f61087d836001600160a01b03841661454b565b5f61087d8383670de0b6b3a764000061462e565b5f613eb98460995f6114c089612979565b8015613ec25750815b80156114e757505090516001600160401b031615159392505050565b5f61087d6001600160401b03808516908416615cb7565b5f61087d613f0c836001600160401b038616615b75565b600f0b614683565b6020808301516001600160a01b038088165f90815260a284526040808220928816825291909352909120546001600160401b03908116911614613fda57602082810180516001600160a01b038881165f81815260a286526040808220938a1680835293875290819020805467ffffffffffffffff19166001600160401b0395861617905593518451918252948101919091529216908201527facf9095feb3a370c9cf692421c69ef320d4db5c66e6a7d29c7694eb02364fc559060600160405180910390a15b6001600160a01b038086165f90815260a060209081526040808320888452825280832093871683529281529082902083518154928501519385015163ffffffff16600160c01b0263ffffffff60c01b196001600160801b038616600160401b026001600160c01b03199095166001600160401b03909316929092179390931716919091179055600f0b156140bc576001600160a01b0385165f908152609f602090815260408083208784529091529020614094908461416a565b506001600160a01b0385165f908152609d602052604090206140b6908561415f565b50610b5c565b80516001600160401b03165f03610b5c576001600160a01b0385165f908152609f6020908152604080832087845290915290206140f99084613e80565b506001600160a01b0385165f908152609f60209081526040808320878452909152902061412590612c28565b5f03610b5c576001600160a01b0385165f908152609d602052604090206118ab9085613e75565b5f61093282670de0b6b3a76400006146ee565b5f61087d8383614725565b5f61087d836001600160a01b038416614725565b5f805b82518110156141ed576141ad848483815181106141a0576141a0615701565b60200260200101516108bd565b80156141d657506141d68382815181106141c9576141c9615701565b60200260200101516127d0565b156141e5576001915050610932565b600101614181565b505f9392505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eab66d7a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015614252573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142769190615ce4565b6001600160a01b0316336001600160a01b0316146114ad5760405163794821ff60e01b815260040160405180910390fd5b5f825f0182815481106142bc576142bc615701565b905f5260205f200154905092915050565b5f61087d83670de0b6b3a764000084614771565b5f61087d8383670de0b6b3a7640000614771565b5f61087d8383670de0b6b3a76400006001614856565b6001600160a01b038084165f90815260a16020908152604080832093861683529290522061433a9043836148a5565b604080516001600160a01b038086168252841660208201526001600160401b038316918101919091527f1c6458079a41077d003c11faf9bf097e693bd67979e4e6500bac7b29db779b5c90606001612790565b6060815f018054806020026020016040519081016040528092919081815260200182805480156143da57602002820191905f5260205f20905b8154815260200190600101908083116143c6575b50505050509050919050565b5f6144008254600f81810b600160801b909204900b131590565b1561441e57604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f9081526001909101602052604090205490565b5f6144528254600f81810b600160801b909204900b131590565b1561447057604051631ed9509560e11b815260040160405180910390fd5b508054600f0b5f818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b5f60ff8216601f81111561093257604051632cd44ac360e21b815260040160405180910390fd5b5f5f6144fe6144ea846148be565b85546144f99190600f0b615cff565b614927565b8454909150600160801b9004600f90810b9082900b1261453157604051632d0483c560e21b815260040160405180910390fd5b600f0b5f9081526001939093016020525050604090205490565b5f8181526001830160205260408120548015614625575f61456d600183615b1f565b85549091505f9061458090600190615b1f565b90508181146145df575f865f01828154811061459e5761459e615701565b905f5260205f200154905080875f0184815481106145be576145be615701565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806145f0576145f0615d26565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610932565b5f915050610932565b82545f908161463f86868385614990565b905080156146795761466386614656600184615b1f565b5f91825260209091200190565b54600160201b90046001600160e01b03166108b3565b5091949350505050565b5f6001600160401b038211156146ea5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b60648201526084016128fe565b5090565b81545f90801561471d5761470784614656600184615b1f565b54600160201b90046001600160e01b031661092e565b509092915050565b5f81815260018301602052604081205461476a57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610932565b505f610932565b5f80805f19858709858702925082811083820303915050805f036147a85783828161479e5761479e615d3a565b049250505061087d565b8084116147ef5760405162461bcd60e51b81526020600482015260156024820152744d6174683a206d756c446976206f766572666c6f7760581b60448201526064016128fe565b5f8486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091025f889003889004909101858311909403939093029303949094049190911702949350505050565b5f5f614863868686614771565b9050600183600281111561487957614879615d4e565b14801561489557505f848061489057614890615d3a565b868809115b156114e7576108b3600182615d62565b6148b983836001600160401b0384166149e3565b505050565b5f6001600160ff1b038211156146ea5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016128fe565b80600f81900b811461498b5760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b60648201526084016128fe565b919050565b5f5b81831015610a81575f6149a58484614ae6565b5f8781526020902090915063ffffffff86169082015463ffffffff1611156149cf578092506149dd565b6149da816001615d62565b93505b50614992565b82548015614a99575f6149fb85614656600185615b1f565b60408051808201909152905463ffffffff808216808452600160201b9092046001600160e01b031660208401529192509085161015614a4d5760405163151b8e3f60e11b815260040160405180910390fd5b805163ffffffff808616911603614a975782614a6e86614656600186615b1f565b80546001600160e01b0392909216600160201b0263ffffffff9092169190911790555050505050565b505b506040805180820190915263ffffffff92831681526001600160e01b03918216602080830191825285546001810187555f968752952091519051909216600160201b029190921617910155565b5f614af46002848418615d75565b61087d90848416615d62565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b3657614b36614b00565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b6457614b64614b00565b604052919050565b6001600160a01b03811681146131c9575f5ffd5b803563ffffffff8116811461498b575f5ffd5b5f60408284031215614ba3575f5ffd5b604080519081016001600160401b0381118282101715614bc557614bc5614b00565b6040529050808235614bd681614b6c565b8152614be460208401614b80565b60208201525092915050565b5f60408284031215614c00575f5ffd5b61087d8383614b93565b5f5f5f60808486031215614c1c575f5ffd5b8335614c2781614b6c565b9250614c368560208601614b93565b91506060840135614c4681614b6c565b809150509250925092565b81516001600160401b03168152602080830151600f0b9082015260408083015163ffffffff169082015260608101610932565b5f5f60608385031215614c95575f5ffd5b8235614ca081614b6c565b9150614caf8460208501614b93565b90509250929050565b5f60208284031215614cc8575f5ffd5b5035919050565b5f60208284031215614cdf575f5ffd5b813561087d81614b6c565b80516001600160a01b0316825260209081015163ffffffff16910152565b5f8151808452602084019350602083015f5b82811015614d4357614d2d868351614cea565b6040959095019460209190910190600101614d1a565b5093949350505050565b602081525f61087d6020830184614d08565b5f5f83601f840112614d6f575f5ffd5b5081356001600160401b03811115614d85575f5ffd5b6020830191508360208260051b8501011115611045575f5ffd5b5f5f5f60408486031215614db1575f5ffd5b8335614dbc81614b6c565b925060208401356001600160401b03811115614dd6575f5ffd5b614de286828701614d5f565b9497909650939450505050565b5f6001600160401b03821115614e0757614e07614b00565b5060051b60200190565b5f82601f830112614e20575f5ffd5b8135614e33614e2e82614def565b614b3c565b8082825260208201915060208360051b860101925085831115614e54575f5ffd5b602085015b83811015614e7a578035614e6c81614b6c565b835260209283019201614e59565b5095945050505050565b5f5f5f60808486031215614e96575f5ffd5b614ea08585614b93565b925060408401356001600160401b03811115614eba575f5ffd5b614ec686828701614e11565b92505060608401356001600160401b03811115614ee1575f5ffd5b614eed86828701614e11565b9150509250925092565b5f8151808452602084019350602083015f5b82811015614d43578151865260209586019590910190600101614f09565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015614f7e57603f19878603018452614f69858351614ef7565b94506020938401939190910190600101614f4d565b50929695505050505050565b5f5f5f5f60a08587031215614f9d575f5ffd5b614fa78686614b93565b935060408501356001600160401b03811115614fc1575f5ffd5b614fcd87828801614e11565b93505060608501356001600160401b03811115614fe8575f5ffd5b614ff487828801614e11565b92505061500360808601614b80565b905092959194509250565b5f5f5f5f5f60608688031215615022575f5ffd5b853561502d81614b6c565b945060208601356001600160401b03811115615047575f5ffd5b61505388828901614d5f565b90955093505060408601356001600160401b03811115615071575f5ffd5b61507d88828901614d5f565b969995985093965092949392505050565b5f5f6040838503121561509f575f5ffd5b82356150aa81614b6c565b915060208301356001600160401b038111156150c4575f5ffd5b830160a081860312156150d5575f5ffd5b809150509250929050565b828152604060208201525f610b716040830184614ef7565b5f5f60408385031215615109575f5ffd5b823561511481614b6c565b915060208301356150d581614b6c565b5f8151808452602084019350602083015f5b82811015614d435761516f86835180516001600160401b03168252602080820151600f0b9083015260409081015163ffffffff16910152565b6060959095019460209190910190600101615136565b604081525f6151976040830185614d08565b82810360208401526114e78185615124565b5f8151808452602084019350602083015f5b82811015614d435781516001600160a01b03168652602095860195909101906001016151bb565b602081525f61087d60208301846151a9565b5f5f60408385031215615205575f5ffd5b82356001600160401b0381111561521a575f5ffd5b61522685828601614e11565b92505060208301356150d581614b6c565b602080825282518282018190525f918401906040840190835b818110156152775783516001600160401b0316835260209384019390920191600101615250565b509095945050505050565b5f5f5f5f60608587031215615295575f5ffd5b84356152a081614b6c565b93506152ae60208601614b80565b925060408501356001600160401b038111156152c8575f5ffd5b6152d487828801614d5f565b95989497509550505050565b5f5f604083850312156152f1575f5ffd5b82356152fc81614b6c565b915060208301356001600160401b03811115615316575f5ffd5b613e6b85828601614e11565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215615368575f5ffd5b823561537381614b6c565b9150614caf60208401614b80565b5f60208284031215615391575f5ffd5b813560ff8116811461087d575f5ffd5b5f606082840312156153b1575f5ffd5b50919050565b5f602082840312156153c7575f5ffd5b81356001600160401b038111156153dc575f5ffd5b61092e848285016153a1565b5f5f5f608084860312156153fa575f5ffd5b83356001600160401b0381111561540f575f5ffd5b61541b86828701614e11565b935050614c368560208601614b93565b602081525f61087d6020830184615124565b5f5f5f6060848603121561544f575f5ffd5b833561545a81614b6c565b925060208401356001600160401b03811115615474575f5ffd5b61548086828701614e11565b92505061548f60408501614b80565b90509250925092565b5f5f604083850312156154a9575f5ffd5b82356154b481614b6c565b915060208301356001600160401b038111156154ce575f5ffd5b8301601f810185136154de575f5ffd5b80356154ec614e2e82614def565b8082825260208201915060208360051b85010192508783111561550d575f5ffd5b602084015b838110156156325780356001600160401b0381111561552f575f5ffd5b85016080818b03601f19011215615544575f5ffd5b61554c614b14565b6155598b60208401614b93565b815260608201356001600160401b03811115615573575f5ffd5b6155828c602083860101614e11565b60208301525060808201356001600160401b038111156155a0575f5ffd5b6020818401019250508a601f8301126155b7575f5ffd5b81356155c5614e2e82614def565b8082825260208201915060208360051b86010192508d8311156155e6575f5ffd5b6020850194505b8285101561561c5784356001600160401b038116811461560b575f5ffd5b8252602094850194909101906155ed565b6040840152505084525060209283019201615512565b50809450505050509250929050565b5f5f5f60408486031215615653575f5ffd5b833561565e81614b6c565b925060208401356001600160401b03811115615678575f5ffd5b8401601f81018613615688575f5ffd5b80356001600160401b0381111561569d575f5ffd5b8660208284010111156156ae575f5ffd5b939660209190910195509293505050565b5f5f604083850312156156d0575f5ffd5b82356156db81614b6c565b915060208301356001600160401b038111156156f5575f5ffd5b613e6b858286016153a1565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112615729575f5ffd5b9190910192915050565b5f60208284031215615743575f5ffd5b61087d82614b80565b5f5f8335601e19843603018112615761575f5ffd5b8301803591506001600160401b0382111561577a575f5ffd5b6020019150600581901b3603821315611045575f5ffd5b5f602082840312156157a1575f5ffd5b813561ffff8116811461087d575f5ffd5b5f602082840312156157c2575f5ffd5b8151801515811461087d575f5ffd5b604081016109328284614cea565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8181168382160190811115610932576109326157df565b8183526020830192505f815f5b84811015614d435763ffffffff61583283614b80565b168652602095860195919091019060010161581c565b6001600160a01b038581168252841660208201526060604082018190525f906108b3908301848661580f565b6001600160a01b038616815260c081016158916020830187614cea565b6001600160a01b039490941660608201526001600160401b0392909216608083015263ffffffff1660a09091015292915050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f610b716020830184866158c5565b5f5f8335601e19843603018112615915575f5ffd5b8301803591506001600160401b0382111561592e575f5ffd5b602001915036819003821315611045575f5ffd5b6001600160a01b038781168252861660208201526080604082018190525f9061596e908301868861580f565b82810360608401526159818185876158c5565b9998505050505050505050565b6060810161599c8285614cea565b6001600160a01b039290921660409190910152919050565b805160208083015191908110156153b1575f1960209190910360031b1b16919050565b604081525f6159e960408301856151a9565b82810360208401526114e781856151a9565b5f60208284031215615a0b575f5ffd5b81516001600160401b03811115615a20575f5ffd5b8201601f81018413615a30575f5ffd5b8051615a3e614e2e82614def565b8082825260208201915060208360051b850101925086831115615a5f575f5ffd5b602084015b83811015615afc5780516001600160401b03811115615a81575f5ffd5b8501603f81018913615a91575f5ffd5b6020810151615aa2614e2e82614def565b808282526020820191506020808460051b8601010192508b831115615ac5575f5ffd5b6040840193505b82841015615ae7578351825260209384019390910190615acc565b86525050602093840193919091019050615a64565b509695505050505050565b5f60018201615b1857615b186157df565b5060010190565b81810381811115610932576109326157df565b6001600160401b038281168282160390811115610932576109326157df565b5f81600f0b60016001607f1b03198103615b6d57615b6d6157df565b5f0392915050565b600f81810b9083900b0160016001607f1b03811360016001607f1b031982121715610932576109326157df565b6001600160a01b038716815260e08101615bbf6020830188614cea565b60608201959095526001600160a01b039390931660808401526001600160401b0391821660a08401521660c09091015292915050565b5f60208284031215615c05575f5ffd5b5051919050565b6001600160a01b03881681525f60c08201615c2a602084018a614cea565b60c060608401528690528660e083015f5b88811015615c6b578235615c4e81614b6c565b6001600160a01b0316825260209283019290910190600101615c3b565b508381036080850152615c7e8188614ef7565b91505082810360a0840152615c948185876158c5565b9a9950505050505050505050565b5f81615cb057615cb06157df565b505f190190565b600f82810b9082900b0360016001607f1b0319811260016001607f1b0382131715610932576109326157df565b5f60208284031215615cf4575f5ffd5b815161087d81614b6c565b8082018281125f831280158216821582161715615d1e57615d1e6157df565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b80820180821115610932576109326157df565b5f82615d8f57634e487b7160e01b5f52601260045260245ffd5b50049056fea2646970667358221220b98600b0e7b1bc01b94cca63b70ea7277460740c85043ebacb392abecb1a571764736f6c634300081b0033", } // AllocationManagerABI is the input ABI used to generate the binding from. @@ -93,7 +93,7 @@ var AllocationManagerABI = AllocationManagerMetaData.ABI var AllocationManagerBin = AllocationManagerMetaData.Bin // DeployAllocationManager deploys a new Ethereum contract, binding an instance of AllocationManager to it. -func DeployAllocationManager(auth *bind.TransactOpts, backend bind.ContractBackend, _delegation common.Address, _pauserRegistry common.Address, _permissionController common.Address, _DEALLOCATION_DELAY uint32, _ALLOCATION_CONFIGURATION_DELAY uint32, _version string) (common.Address, *types.Transaction, *AllocationManager, error) { +func DeployAllocationManager(auth *bind.TransactOpts, backend bind.ContractBackend, _delegation common.Address, _eigenStrategy common.Address, _pauserRegistry common.Address, _permissionController common.Address, _DEALLOCATION_DELAY uint32, _ALLOCATION_CONFIGURATION_DELAY uint32, _version string) (common.Address, *types.Transaction, *AllocationManager, error) { parsed, err := AllocationManagerMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -102,7 +102,7 @@ func DeployAllocationManager(auth *bind.TransactOpts, backend bind.ContractBacke return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(AllocationManagerBin), backend, _delegation, _pauserRegistry, _permissionController, _DEALLOCATION_DELAY, _ALLOCATION_CONFIGURATION_DELAY, _version) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(AllocationManagerBin), backend, _delegation, _eigenStrategy, _pauserRegistry, _permissionController, _DEALLOCATION_DELAY, _ALLOCATION_CONFIGURATION_DELAY, _version) if err != nil { return common.Address{}, nil, nil, err } @@ -344,6 +344,37 @@ func (_AllocationManager *AllocationManagerCallerSession) Delegation() (common.A return _AllocationManager.Contract.Delegation(&_AllocationManager.CallOpts) } +// EigenStrategy is a free data retrieval call binding the contract method 0xdb4df761. +// +// Solidity: function eigenStrategy() view returns(address) +func (_AllocationManager *AllocationManagerCaller) EigenStrategy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _AllocationManager.contract.Call(opts, &out, "eigenStrategy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// EigenStrategy is a free data retrieval call binding the contract method 0xdb4df761. +// +// Solidity: function eigenStrategy() view returns(address) +func (_AllocationManager *AllocationManagerSession) EigenStrategy() (common.Address, error) { + return _AllocationManager.Contract.EigenStrategy(&_AllocationManager.CallOpts) +} + +// EigenStrategy is a free data retrieval call binding the contract method 0xdb4df761. +// +// Solidity: function eigenStrategy() view returns(address) +func (_AllocationManager *AllocationManagerCallerSession) EigenStrategy() (common.Address, error) { + return _AllocationManager.Contract.EigenStrategy(&_AllocationManager.CallOpts) +} + // GetAVSRegistrar is a free data retrieval call binding the contract method 0x304c10cd. // // Solidity: function getAVSRegistrar(address avs) view returns(address) diff --git a/pkg/bindings/AllocationManagerStorage/binding.go b/pkg/bindings/AllocationManagerStorage/binding.go index 9a773316b3..8d0cd4d447 100644 --- a/pkg/bindings/AllocationManagerStorage/binding.go +++ b/pkg/bindings/AllocationManagerStorage/binding.go @@ -80,7 +80,7 @@ type OperatorSet struct { // AllocationManagerStorageMetaData contains all meta data concerning the AllocationManagerStorage contract. var AllocationManagerStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRedistributingOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]},{\"name\":\"redistributionRecipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRedistributionRecipient\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RedistributionAddressSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"redistributionRecipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonexistentAVSMetadata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"ALLOCATION_CONFIGURATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEALLOCATION_DELAY\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRedistributingOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]},{\"name\":\"redistributionRecipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegation\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIDelegationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"eigenStrategy\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRedistributionRecipient\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RedistributionAddressSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"redistributionRecipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRedistributionRecipient\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonexistentAVSMetadata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", } // AllocationManagerStorageABI is the input ABI used to generate the binding from. @@ -322,6 +322,37 @@ func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) Delegati return _AllocationManagerStorage.Contract.Delegation(&_AllocationManagerStorage.CallOpts) } +// EigenStrategy is a free data retrieval call binding the contract method 0xdb4df761. +// +// Solidity: function eigenStrategy() view returns(address) +func (_AllocationManagerStorage *AllocationManagerStorageCaller) EigenStrategy(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _AllocationManagerStorage.contract.Call(opts, &out, "eigenStrategy") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// EigenStrategy is a free data retrieval call binding the contract method 0xdb4df761. +// +// Solidity: function eigenStrategy() view returns(address) +func (_AllocationManagerStorage *AllocationManagerStorageSession) EigenStrategy() (common.Address, error) { + return _AllocationManagerStorage.Contract.EigenStrategy(&_AllocationManagerStorage.CallOpts) +} + +// EigenStrategy is a free data retrieval call binding the contract method 0xdb4df761. +// +// Solidity: function eigenStrategy() view returns(address) +func (_AllocationManagerStorage *AllocationManagerStorageCallerSession) EigenStrategy() (common.Address, error) { + return _AllocationManagerStorage.Contract.EigenStrategy(&_AllocationManagerStorage.CallOpts) +} + // GetAVSRegistrar is a free data retrieval call binding the contract method 0x304c10cd. // // Solidity: function getAVSRegistrar(address avs) view returns(address) diff --git a/pkg/bindings/EigenPod/binding.go b/pkg/bindings/EigenPod/binding.go index 777bc93ab3..0d9bf6e7a5 100644 --- a/pkg/bindings/EigenPod/binding.go +++ b/pkg/bindings/EigenPod/binding.go @@ -85,8 +85,13 @@ type IEigenPodTypesWithdrawalRequest struct { // EigenPodMetaData contains all meta data concerning the EigenPod contract. var EigenPodMetaData = &bind.MetaData{ +<<<<<<< HEAD ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"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\":\"getConsolidationRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"requestConsolidation\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.ConsolidationRequest[]\",\"components\":[{\"name\":\"srcPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"targetPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"requestWithdrawal\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.WithdrawalRequest[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amountGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"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\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCheckpointTwiceInSingleBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointAlreadyActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CredentialsAlreadyVerified\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeQueryFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ForkTimestampZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFunds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PredeployFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RefundFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]", Bin: "0x60e060405234801561000f575f5ffd5b506040516148cd3803806148cd83398101604081905261002e91610188565b806100388161005f565b608052506001600160a01b0380841660a052821660c0526100576100a5565b5050506102b9565b5f5f829050601f81511115610092578260405163305a27a960e01b8152600401610089919061025e565b60405180910390fd5b805161009d82610293565b179392505050565b5f54610100900460ff161561010c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610089565b5f5460ff9081161461015b575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610171575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561019a575f5ffd5b83516101a58161015d565b60208501519093506101b68161015d565b60408501519092506001600160401b038111156101d1575f5ffd5b8401601f810186136101e1575f5ffd5b80516001600160401b038111156101fa576101fa610174565b604051601f8201601f19908116603f011681016001600160401b038111828210171561022857610228610174565b60405281815282820160200188101561023f575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102b3575f198160200360031b1b821691505b50919050565b60805160a05160c0516145886103455f395f8181610329015281816106d40152818161077c01528181610a2a01528181610dd301528181610f9e015281816110a901528181611605015281816116ac0152818161193501528181611c8301528181611db001528181612286015261319001525f818161057a015261171501525f61100a01526145885ff3fe6080604052600436106101bd575f3560e01c80636691954e116100f2578063b522538a11610092578063d06d558711610062578063d06d55871461063f578063dda3346c1461065e578063ee94d67c1461067d578063f074ba621461069c575f5ffd5b8063b522538a146105ce578063c44e30dc146105ed578063c490744214610601578063c4d66de814610620575f5ffd5b80637439841f116100cd5780637439841f1461053457806374cdd7981461056957806388676cad1461059c5780639b4e4634146105bb575f5ffd5b80636691954e146104d65780636c0d2d5a146104e95780636fcd0e5314610508575f5ffd5b806342ecff2a1161015d57806352396a591161013857806352396a591461043657806354fd4d501461046a578063587533571461048b57806358eaee79146104aa575f5ffd5b806342ecff2a146102f25780634665bcda1461031857806347d283721461034b575f5ffd5b80632340e8d3116101985780632340e8d31461027a5780633474aa161461028f5780633f5fa57a146102c05780633f65cf19146102d3575f5ffd5b8063039157d2146101fb5780630b18ff661461021c5780631e51553314610258575f5ffd5b366101f7576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b348015610206575f5ffd5b5061021a610215366004613a2f565b6106bb565b005b348015610227575f5ffd5b5060335461023b906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610263575f5ffd5b5061026c6109f0565b60405190815260200161024f565b348015610285575f5ffd5b5061026c60395481565b34801561029a575f5ffd5b506034546001600160401b03165b6040516001600160401b03909116815260200161024f565b61021a6102ce366004613aea565b610a11565b3480156102de575f5ffd5b5061021a6102ed366004613b28565b610d7a565b3480156102fd575f5ffd5b50603a546102a890600160401b90046001600160401b031681565b348015610323575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610356575f5ffd5b506103db6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b60405161024f91905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b348015610441575f5ffd5b506102a8610450366004613bff565b603b6020525f90815260409020546001600160401b031681565b348015610475575f5ffd5b5061047e611003565b60405161024f9190613c48565b348015610496575f5ffd5b50603e5461023b906001600160a01b031681565b3480156104b5575f5ffd5b506104c96104c4366004613c97565b61102e565b60405161024f9190613cfd565b61021a6104e4366004613aea565b611090565b3480156104f4575f5ffd5b5061026c610503366004613bff565b6113f3565b348015610513575f5ffd5b50610527610522366004613d0b565b611501565b60405161024f9190613d22565b34801561053f575f5ffd5b506104c961054e366004613d0b565b5f90815260366020526040902054600160c01b900460ff1690565b348015610574575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105a7575f5ffd5b5061021a6105b6366004613d82565b6115ac565b61021a6105c9366004613d9d565b6116a1565b3480156105d9575f5ffd5b506105276105e8366004613c97565b61181f565b3480156105f8575f5ffd5b5061026c61190e565b34801561060c575f5ffd5b5061021a61061b366004613e32565b61192a565b34801561062b575f5ffd5b5061021a61063a366004613e5c565b611a61565b34801561064a575f5ffd5b5061021a610659366004613e5c565b611bab565b348015610669575f5ffd5b5061021a610678366004613f47565b611c3f565b348015610688575f5ffd5b50603a546102a8906001600160401b031681565b3480156106a7575f5ffd5b5061021a6106b6366004614019565b611d97565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610721573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107459190614080565b156107635760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ed9190614080565b1561080b5760405163840a48d560e01b815260040160405180910390fd5b5f61084f610819858061409b565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061219392505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108bd576108bd613cc9565b60028111156108ce576108ce613cc9565b81525050905080604001516001600160401b0316876001600160401b03161161090a576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561092257610922613cc9565b146109405760405163d49e19a760e01b815260040160405180910390fd5b61098361094d868061409b565b808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506121b592505050565b6109a05760405163161ce5ed60e31b815260040160405180910390fd5b6109b26109ac886113f3565b876121dd565b6109de6109be88612282565b87356109ca888061409b565b6109d760208b018b6140e0565b8751612359565b6109e75f61248d565b50505050505050565b5f610a0c71bbddc7ce488642fb579f8b00f3a59000725161260d565b905090565b604051635ac86ab760e01b8152600a60048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610a77573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9b9190614080565b15610ab95760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b0316331480610adc5750603e546001600160a01b031633145b610af95760405163427a777960e01b815260040160405180910390fd5b5f610b0261190e565b9050610b0e8382614136565b341015610b2e5760405163356680b760e01b815260040160405180910390fd5b5f610b398483614136565b610b43903461414d565b90505f5b84811015610d625736868683818110610b6257610b62614160565b9050602002810190610b749190614174565b9050610b8081806140e0565b9050603014610ba257604051634f88323960e11b815260040160405180910390fd5b5f610bad82806140e0565b610bbd6040850160208601613bff565b604051602001610bcf93929190614192565b60405160208183030381529060405290505f710961ef480eb55e80d19ad83579a64c0070026001600160a01b03168683604051610c0c91906141ca565b5f6040518083038185875af1925050503d805f8114610c46576040519150601f19603f3d011682016040523d82523d5f602084013e610c4b565b606091505b5050905080610c6d5760405163fc52d48360e01b815260040160405180910390fd5b5f610cb4610c7b85806140e0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061269392505050565b9050610cc66040850160208601613bff565b6001600160401b03165f03610d045760405181907f60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320905f90a2610d52565b807f8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05610d366040870160208801613bff565b6040516001600160401b03909116815260200160405180910390a25b505060019092019150610b479050565b508015610d7357610d733382612724565b5050505050565b6033546001600160a01b0316331480610d9d5750603e546001600160a01b031633145b610dba5760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610e20573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e449190614080565b15610e625760405163840a48d560e01b815260040160405180910390fd5b8584148015610e7057508382145b610e8d576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610ec3576040516337e07ffd60e01b815260040160405180910390fd5b610ed5610ecf8a6113f3565b896121dd565b5f805b87811015610f6e57610f5a8b8b358b8b85818110610ef857610ef8614160565b9050602002016020810190610f0d91906141d5565b8a8a86818110610f1f57610f1f614160565b9050602002810190610f3191906140e0565b8a8a88818110610f4357610f43614160565b9050602002810190610f55919061409b565b612839565b610f6490836141f9565b9150600101610ed8565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610fe1575f5ffd5b505af1158015610ff3573d5f5f3e3d5ffd5b5050505050505050505050505050565b6060610a0c7f0000000000000000000000000000000000000000000000000000000000000000612d3a565b5f5f61106e84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061269392505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b604051635ac86ab760e01b8152600960048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156110f6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a9190614080565b156111385760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b031633148061115b5750603e546001600160a01b031633145b6111785760405163427a777960e01b815260040160405180910390fd5b5f6111816109f0565b905061118d8382614136565b3410156111ad5760405163356680b760e01b815260040160405180910390fd5b5f6111b88483614136565b6111c2903461414d565b90505f5b84811015610d6257368686838181106111e1576111e1614160565b90506020028101906111f39190614174565b90506111ff81806140e0565b905060301461122157604051634f88323960e11b815260040160405180910390fd5b61122e60208201826140e0565b905060301461125057604051634f88323960e11b815260040160405180910390fd5b5f61125e610c7b83806140e0565b90505f611271610c7b60208501856140e0565b90505f61127d82611501565b905060018160600151600281111561129757611297613cc9565b146112b55760405163d49e19a760e01b815260040160405180910390fd5b5f6112c085806140e0565b6112cd60208801886140e0565b6040516020016112e0949392919061420c565b60405160208183030381529060405290505f71bbddc7ce488642fb579f8b00f3a5900072516001600160a01b0316898360405161131d91906141ca565b5f6040518083038185875af1925050503d805f8114611357576040519150601f19603f3d011682016040523d82523d5f602084013e61135c565b606091505b505090508061137e5760405163fc52d48360e01b815260040160405180910390fd5b8385036113b45760405185907fc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016905f90a26113e1565b604051849086907f42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94905f90a35b5050600190940193506111c692505050565b5f611401611fff600c614136565b6114146001600160401b0384164261414d565b1061143257604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f1981840301815290829052611479916141ca565b5f60405180830381855afa9150503d805f81146114b1576040519150601f19603f3d011682016040523d82523d5f602084013e6114b6565b606091505b50915091508180156114c857505f8151115b6114e55760405163558ad0a360e01b815260040160405180910390fd5b808060200190518101906114f9919061422b565b949350505050565b611528604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff16600281111561159257611592613cc9565b60028111156115a3576115a3613cc9565b90525092915050565b6033546001600160a01b03163314806115cf5750603e546001600160a01b031633145b6115ec5760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611652573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116769190614080565b156116945760405163840a48d560e01b815260040160405180910390fd5b61169d8261248d565b5050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116ea57604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec800000146117135760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec8000008787611756612d77565b8888886040518863ffffffff1660e01b815260040161177a9695949392919061426a565b5f604051808303818588803b158015611791575f5ffd5b505af11580156117a3573d5f5f3e3d5ffd5b50505050507fa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc1121961180786868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061269392505050565b60405190815260200160405180910390a15050505050565b611846604080516080810182525f8082526020820181905291810182905290606082015290565b60365f61188785858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061269392505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff1660028111156118f3576118f3613cc9565b600281111561190457611904613cc9565b9052509392505050565b5f610a0c710961ef480eb55e80d19ad83579a64c00700261260d565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461197357604051633213a66160e21b815260040160405180910390fd5b5f611982633b9aca00836142cc565b905061199b633b9aca006001600160401b038316614136565b6034549092506001600160401b0390811690821611156119ce576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906119eb9084906001600160401b03166142df565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e83604051611a4a91815260200190565b60405180910390a2611a5c8383612724565b505050565b5f54610100900460ff1615808015611a7f57505f54600160ff909116105b80611a985750303b158015611a9857505f5460ff166001145b611b005760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611b21575f805461ff0019166101001790555b6001600160a01b038216611b48576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b038416179055801561169d575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b03163314611bd65760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611c6a5760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611cd0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf49190614080565b15611d125760405163840a48d560e01b815260040160405180910390fd5b8251845114611d34576040516343714afd60e01b815260040160405180910390fd5b5f5b8451811015610d7357611d8f83858381518110611d5557611d55614160565b6020026020010151878481518110611d6f57611d6f614160565b60200260200101516001600160a01b0316612da79092919063ffffffff16565b600101611d36565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611dfd573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e219190614080565b15611e3f5760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f819003611e7357604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b90049091166080820152611eda611ed283612282565b825188612df9565b5f805b8581101561213a5736878783818110611ef857611ef8614160565b9050602002810190611f0a91906142fe565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611f7a57611f7a613cc9565b6002811115611f8b57611f8b613cc9565b9052509050600181606001516002811115611fa857611fa8613cc9565b14611fb4575050612132565b856001600160401b031681604001516001600160401b031610611fd8575050612132565b5f8080611fe8848a8f3588612eba565b60208b0180519396509194509250611fff82614312565b62ffffff1690525060808801805184919061201b90839061432f565b6001600160401b031690525060608801805183919061203b90839061434e565b60070b90525061204b818861432f565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b8360028111156120ef576120ef613cc9565b021790555050604051863591506001600160401b038b16907fe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350905f90a350505050505b600101611edd565b506001600160401b038084165f908152603b60205260408120805484939192916121669185911661432f565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506109e782612fd0565b5f815f815181106121a6576121a6614160565b60200260200101519050919050565b5f816003815181106121c9576121c9614160565b60200260200101515f5f1b14159050919050565b6121e960036020614136565b6121f660208301836140e0565b905014612216576040516313717da960e21b815260040160405180910390fd5b61226561222660208301836140e0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250869250508435905060036131f0565b61169d576040516309bde33960e01b815260040160405180910390fd5b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632704351a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122e0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612304919061437d565b9050806001600160401b03165f0361232f576040516341a02cc960e01b815260040160405180910390fd5b806001600160401b0316836001600160401b03161115612350576001612352565b5f5b9392505050565b6008841461237a5760405163200591bd60e01b815260040160405180910390fd5b5f61238488613207565b905080612393602860016141f9565b61239d91906141f9565b6123a8906020614136565b83146123c7576040516313717da960e21b815260040160405180910390fd5b5f6124038787808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061322f92505050565b90505f64ffffffffff841661241a602860016141f9565b600b901b17905061246486868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508d92508691508590506131f0565b612481576040516309bde33960e01b815260040160405180910390fd5b50505050505050505050565b603a54600160401b90046001600160401b0316156124bd5760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b034281169116036124eb576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b0316612507633b9aca00476142cc565b61251191906142df565b905081801561252757506001600160401b038116155b15612545576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a0016040528061255a426113f3565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff00000000000000001990921691909117905590506125be81612fd0565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f5f836001600160a01b03166040515f60405180830381855afa9150503d805f8114612655576040519150601f19603f3d011682016040523d82523d5f602084013e61265a565b606091505b509150915081801561266d575080516020145b61268a5760405163c90158af60e01b815260040160405180910390fd5b6114f981614398565b5f81516030146126b657604051634f88323960e11b815260040160405180910390fd5b6040516002906126cc9084905f906020016143bb565b60408051601f19818403018152908290526126e6916141ca565b602060405180830381855afa158015612701573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061108a919061422b565b804710156127745760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401611af7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146127bd576040519150601f19603f3d011682016040523d82523d5f602084013e6127c2565b606091505b5050905080611a5c5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401611af7565b5f5f6128768484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061219392505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156128e4576128e4613cc9565b60028111156128f5576128f5613cc9565b90525090505f8160600151600281111561291157612911613cc9565b1461292f576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b0380166129748686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134bf92505050565b6001600160401b03160361299b57604051631958236d60e21b815260040160405180910390fd5b6001600160401b0380166129e08686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134e392505050565b6001600160401b031614612a0757604051632eade63760e01b815260040160405180910390fd5b612a0f612d77565b612a1890614398565b612a538686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134fa92505050565b1480612aa85750612a6261350e565b612a6b90614398565b612aa68686808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506134fa92505050565b145b612ac557604051633772dd5360e11b815260040160405180910390fd5b5f612b018686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061352a92505050565b9050612b1a612b0f8c612282565b8b88888c8c8f612359565b60398054905f612b29836143df565b9091555050603a545f90600160401b90046001600160401b031615612b6057603a54600160401b90046001600160401b0316612b6d565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115612c4257612c42613cc9565b021790555050603d8054849250601390612c6d908490600160981b90046001600160401b031661432f565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee884604051612cc291815260200190565b60405180910390a1604080518581526001600160401b03838116602083015284168183015290517fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f9181900360600190a1612d2a633b9aca006001600160401b038416614136565b9c9b505050505050505050505050565b60605f612d4683613541565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b604051606090612d9390600160f81b905f9030906020016143f7565b604051602081830303815290604052905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a5c908490613568565b5f612e0384613207565b9050612e108160036141f9565b612e1b906020614136565b612e2860208401846140e0565b905014612e48576040516313717da960e21b815260040160405180910390fd5b6003811b600c17612e9d612e5f60208501856140e0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892505086359050846131f0565b610d73576040516309bde33960e01b815260040160405180910390fd5b5f5f5f866020015192505f612ed386895f01518761363b565b9050836001600160401b0316816001600160401b031614612f4757612ef88482614435565b60408051873581526001600160401b038a8116602083015284168183015290519194507fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f919081900360600190a15b6001600160401b0380821660208a0181905290881660408a01525f03612fc55760398054905f612f7683614464565b909155505060026060890152612f8b83614479565b6040519092508535906001600160401b038916907f5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107905f90a35b509450945094915050565b8051603c556020810151603d805460408401516060850151608086015162ffffff9095166affffffffffffffffffffff19909316831763010000006001600160401b0393841602176fffffffffffffffffffffffffffffffff60581b1916600160581b9183169190910267ffffffffffffffff60981b191617600160981b9190941602929092179055156130615750565b60808101516034545f9161307d916001600160401b031661432f565b90505f82606001518360400151613094919061434e565b60408401516034805492935090915f906130b89084906001600160401b031661432f565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061310890633b9aca00908516614136565b90505f61311d633b9aca00600785900b61449e565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b1580156131d3575f5ffd5b505af11580156131e5573d5f5f3e3d5ffd5b505050505050505050565b5f836131fd868585613719565b1495945050505050565b5f8082600181111561321b5761321b613cc9565b1461322757600661108a565b600592915050565b5f5f6002835161323f91906142cc565b90505f816001600160401b0381111561325a5761325a613e77565b604051908082528060200260200182016040528015613283578160200160208202803683370190505b5090505f5b8281101561337d5760028561329d8383614136565b815181106132ad576132ad614160565b6020026020010151868360026132c39190614136565b6132ce9060016141f9565b815181106132de576132de614160565b6020026020010151604051602001613300929190918252602082015260400190565b60408051601f198184030181529082905261331a916141ca565b602060405180830381855afa158015613335573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613358919061422b565b82828151811061336a5761336a614160565b6020908102919091010152600101613288565b506133896002836142cc565b91505b811561349c575f5b82811015613489576002826133a98383614136565b815181106133b9576133b9614160565b6020026020010151838360026133cf9190614136565b6133da9060016141f9565b815181106133ea576133ea614160565b602002602001015160405160200161340c929190918252602082015260400190565b60408051601f1981840301815290829052613426916141ca565b602060405180830381855afa158015613441573d5f5f3e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613464919061422b565b82828151811061347657613476614160565b6020908102919091010152600101613394565b506134956002836142cc565b915061338c565b805f815181106134ae576134ae614160565b602002602001015192505050919050565b5f61108a826005815181106134d6576134d6614160565b60200260200101516137ed565b5f61108a826006815181106134d6576134d6614160565b5f816001815181106121a6576121a6614160565b604051606090612d9390600160f91b905f9030906020016143f7565b5f61108a826002815181106134d6576134d6614160565b5f60ff8216601f81111561108a57604051632cd44ac360e21b815260040160405180910390fd5b5f6135bc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166138549092919063ffffffff16565b905080515f14806135dc5750808060200190518101906135dc9190614080565b611a5c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611af7565b5f613648602660016141f9565b613653906020614136565b61366060408401846140e0565b905014613680576040516313717da960e21b815260040160405180910390fd5b5f61368c6004856144cd565b64ffffffffff1690506136e56136a560408501856140e0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525089925050506020860135846131f0565b613702576040516309bde33960e01b815260040160405180910390fd5b613710836020013585613862565b95945050505050565b5f83515f1415801561373657506020845161373491906144f6565b155b613753576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b855181116137e3576137776002856144f6565b5f036137a95781515f528086015160205260208260405f60026107d05a03fa61379e575f5ffd5b6002840493506137d1565b808601515f52815160205260208260405f60026107d05a03fa6137ca575f5ffd5b6002840493505b6137dc6020826141f9565b9050613764565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b60606114f984845f8561388e565b5f8061386f600484614509565b61387a906040614532565b64ffffffffff1690506114f984821b6137ed565b6060824710156138ef5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611af7565b5f5f866001600160a01b0316858760405161390a91906141ca565b5f6040518083038185875af1925050503d805f8114613944576040519150601f19603f3d011682016040523d82523d5f602084013e613949565b606091505b509150915061395a87838387613965565b979650505050505050565b606083156139d35782515f036139cc576001600160a01b0385163b6139cc5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611af7565b50816114f9565b6114f983838151156139e85781518083602001fd5b8060405162461bcd60e51b8152600401611af79190613c48565b6001600160401b0381168114613a16575f5ffd5b50565b5f60408284031215613a29575f5ffd5b50919050565b5f5f5f60608486031215613a41575f5ffd5b8335613a4c81613a02565b925060208401356001600160401b03811115613a66575f5ffd5b613a7286828701613a19565b92505060408401356001600160401b03811115613a8d575f5ffd5b613a9986828701613a19565b9150509250925092565b5f5f83601f840112613ab3575f5ffd5b5081356001600160401b03811115613ac9575f5ffd5b6020830191508360208260051b8501011115613ae3575f5ffd5b9250929050565b5f5f60208385031215613afb575f5ffd5b82356001600160401b03811115613b10575f5ffd5b613b1c85828601613aa3565b90969095509350505050565b5f5f5f5f5f5f5f5f60a0898b031215613b3f575f5ffd5b8835613b4a81613a02565b975060208901356001600160401b03811115613b64575f5ffd5b613b708b828c01613a19565b97505060408901356001600160401b03811115613b8b575f5ffd5b613b978b828c01613aa3565b90975095505060608901356001600160401b03811115613bb5575f5ffd5b613bc18b828c01613aa3565b90955093505060808901356001600160401b03811115613bdf575f5ffd5b613beb8b828c01613aa3565b999c989b5096995094979396929594505050565b5f60208284031215613c0f575f5ffd5b813561235281613a02565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6123526020830184613c1a565b5f5f83601f840112613c6a575f5ffd5b5081356001600160401b03811115613c80575f5ffd5b602083019150836020828501011115613ae3575f5ffd5b5f5f60208385031215613ca8575f5ffd5b82356001600160401b03811115613cbd575f5ffd5b613b1c85828601613c5a565b634e487b7160e01b5f52602160045260245ffd5b60038110613cf957634e487b7160e01b5f52602160045260245ffd5b9052565b6020810161108a8284613cdd565b5f60208284031215613d1b575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b0360408401511660408301526060830151613d6e6060840182613cdd565b5092915050565b8015158114613a16575f5ffd5b5f60208284031215613d92575f5ffd5b813561235281613d75565b5f5f5f5f5f60608688031215613db1575f5ffd5b85356001600160401b03811115613dc6575f5ffd5b613dd288828901613c5a565b90965094505060208601356001600160401b03811115613df0575f5ffd5b613dfc88828901613c5a565b96999598509660400135949350505050565b6001600160a01b0381168114613a16575f5ffd5b8035613e2d81613e0e565b919050565b5f5f60408385031215613e43575f5ffd5b8235613e4e81613e0e565b946020939093013593505050565b5f60208284031215613e6c575f5ffd5b813561235281613e0e565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613eb357613eb3613e77565b604052919050565b5f6001600160401b03821115613ed357613ed3613e77565b5060051b60200190565b5f82601f830112613eec575f5ffd5b8135613eff613efa82613ebb565b613e8b565b8082825260208201915060208360051b860101925085831115613f20575f5ffd5b602085015b83811015613f3d578035835260209283019201613f25565b5095945050505050565b5f5f5f60608486031215613f59575f5ffd5b83356001600160401b03811115613f6e575f5ffd5b8401601f81018613613f7e575f5ffd5b8035613f8c613efa82613ebb565b8082825260208201915060208360051b850101925088831115613fad575f5ffd5b6020840193505b82841015613fd8578335613fc781613e0e565b825260209384019390910190613fb4565b955050505060208401356001600160401b03811115613ff5575f5ffd5b61400186828701613edd565b92505061401060408501613e22565b90509250925092565b5f5f5f6040848603121561402b575f5ffd5b83356001600160401b03811115614040575f5ffd5b61404c86828701613a19565b93505060208401356001600160401b03811115614067575f5ffd5b61407386828701613aa3565b9497909650939450505050565b5f60208284031215614090575f5ffd5b815161235281613d75565b5f5f8335601e198436030181126140b0575f5ffd5b8301803591506001600160401b038211156140c9575f5ffd5b6020019150600581901b3603821315613ae3575f5ffd5b5f5f8335601e198436030181126140f5575f5ffd5b8301803591506001600160401b0382111561410e575f5ffd5b602001915036819003821315613ae3575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761108a5761108a614122565b8181038181111561108a5761108a614122565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e19833603018112614188575f5ffd5b9190910192915050565b8284823760c09190911b6001600160c01b0319169101908152600801919050565b5f81518060208401855e5f93019283525090919050565b5f61235282846141b3565b5f602082840312156141e5575f5ffd5b813564ffffffffff81168114612352575f5ffd5b8082018082111561108a5761108a614122565b838582375f8482015f8152838582375f93019283525090949350505050565b5f6020828403121561423b575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b608081525f61427d60808301888a614242565b828103602084015261428f8188613c1a565b905082810360408401526142a4818688614242565b915050826060830152979650505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826142da576142da6142b8565b500490565b6001600160401b03828116828216039081111561108a5761108a614122565b5f8235605e19833603018112614188575f5ffd5b5f62ffffff82168061432657614326614122565b5f190192915050565b6001600160401b03818116838216019081111561108a5761108a614122565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff198212171561108a5761108a614122565b5f6020828403121561438d575f5ffd5b815161235281613a02565b80516020808301519190811015613a29575f1960209190910360031b1b16919050565b5f6143c682856141b3565b6001600160801b03199390931683525050601001919050565b5f600182016143f0576143f0614122565b5060010190565b6001600160f81b03199390931683526001600160a81b031991909116600183015260601b6bffffffffffffffffffffffff1916600c82015260200190565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff8213171561108a5761108a614122565b5f8161447257614472614122565b505f190190565b5f8160070b677fffffffffffffff19810361449657614496614122565b5f0392915050565b8082025f8212600160ff1b841416156144b9576144b9614122565b818105831482151761108a5761108a614122565b5f64ffffffffff8316806144e3576144e36142b8565b8064ffffffffff84160491505092915050565b5f82614504576145046142b8565b500690565b5f64ffffffffff83168061451f5761451f6142b8565b8064ffffffffff84160691505092915050565b64ffffffffff8181168382160290811690818114613d6e57613d6e61412256fea2646970667358221220c31696eee7e27f3e914425e93c37f0b681c35af5a2060c6259ff4810c327e96b64736f6c634300081b0033", +======= + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_ethPOS\",\"type\":\"address\",\"internalType\":\"contractIETHPOSDeposit\"},{\"name\":\"_eigenPodManager\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"},{\"name\":\"_version\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"receive\",\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"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\":\"getConsolidationRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_podOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"requestConsolidation\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.ConsolidationRequest[]\",\"components\":[{\"name\":\"srcPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"targetPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"requestWithdrawal\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.WithdrawalRequest[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amountGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"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\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"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\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCheckpointTwiceInSingleBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointAlreadyActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CredentialsAlreadyVerified\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeQueryFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ForkTimestampZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFunds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidProofLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorFieldsLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PredeployFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]", + Bin: "0x60e060405234801561000f575f5ffd5b5060405161484238038061484283398101604081905261002e91610188565b806100388161005f565b608052506001600160a01b0380841660a052821660c0526100576100a5565b5050506102b9565b5f5f829050601f81511115610092578260405163305a27a960e01b8152600401610089919061025e565b60405180910390fd5b805161009d82610293565b179392505050565b5f54610100900460ff161561010c5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b6064820152608401610089565b5f5460ff9081161461015b575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610171575f5ffd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f6060848603121561019a575f5ffd5b83516101a58161015d565b60208501519093506101b68161015d565b60408501519092506001600160401b038111156101d1575f5ffd5b8401601f810186136101e1575f5ffd5b80516001600160401b038111156101fa576101fa610174565b604051601f8201601f19908116603f011681016001600160401b038111828210171561022857610228610174565b60405281815282820160200188101561023f575f5ffd5b8160208401602083015e5f602083830101528093505050509250925092565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156102b3575f198160200360031b1b821691505b50919050565b60805160a05160c0516144fd6103455f395f8181610329015281816106d40152818161077c01528181610a2a01528181610da201528181610f6d01528181611078015281816115730152818161161a015281816118a301528181611bf101528181611d25015281816121fb015261310501525f818161057a015261168301525f610fd901526144fd5ff3fe6080604052600436106101bd575f3560e01c80636691954e116100f2578063b522538a11610092578063d06d558711610062578063d06d55871461063f578063dda3346c1461065e578063ee94d67c1461067d578063f074ba621461069c575f5ffd5b8063b522538a146105ce578063c44e30dc146105ed578063c490744214610601578063c4d66de814610620575f5ffd5b80637439841f116100cd5780637439841f1461053457806374cdd7981461056957806388676cad1461059c5780639b4e4634146105bb575f5ffd5b80636691954e146104d65780636c0d2d5a146104e95780636fcd0e5314610508575f5ffd5b806342ecff2a1161015d57806352396a591161013857806352396a591461043657806354fd4d501461046a578063587533571461048b57806358eaee79146104aa575f5ffd5b806342ecff2a146102f25780634665bcda1461031857806347d283721461034b575f5ffd5b80632340e8d3116101985780632340e8d31461027a5780633474aa161461028f5780633f5fa57a146102c05780633f65cf19146102d3575f5ffd5b8063039157d2146101fb5780630b18ff661461021c5780631e51553314610258575f5ffd5b366101f7576040513481527f6fdd3dbdb173299608c0aa9f368735857c8842b581f8389238bf05bd04b3bf499060200160405180910390a1005b5f5ffd5b348015610206575f5ffd5b5061021a6102153660046139a4565b6106bb565b005b348015610227575f5ffd5b5060335461023b906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610263575f5ffd5b5061026c6109f0565b60405190815260200161024f565b348015610285575f5ffd5b5061026c60395481565b34801561029a575f5ffd5b506034546001600160401b03165b6040516001600160401b03909116815260200161024f565b61021a6102ce366004613a5f565b610a11565b3480156102de575f5ffd5b5061021a6102ed366004613a9d565b610d49565b3480156102fd575f5ffd5b50603a546102a890600160401b90046001600160401b031681565b348015610323575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b348015610356575f5ffd5b506103db6040805160a0810182525f80825260208201819052918101829052606081018290526080810191909152506040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b9004909116608082015290565b60405161024f91905f60a0820190508251825262ffffff60208401511660208301526001600160401b036040840151166040830152606083015160070b60608301526001600160401b03608084015116608083015292915050565b348015610441575f5ffd5b506102a8610450366004613b74565b603b6020525f90815260409020546001600160401b031681565b348015610475575f5ffd5b5061047e610fd2565b60405161024f9190613bbd565b348015610496575f5ffd5b50603e5461023b906001600160a01b031681565b3480156104b5575f5ffd5b506104c96104c4366004613c0c565b610ffd565b60405161024f9190613c72565b61021a6104e4366004613a5f565b61105f565b3480156104f4575f5ffd5b5061026c610503366004613b74565b611361565b348015610513575f5ffd5b50610527610522366004613c80565b61146f565b60405161024f9190613c97565b34801561053f575f5ffd5b506104c961054e366004613c80565b5f90815260366020526040902054600160c01b900460ff1690565b348015610574575f5ffd5b5061023b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105a7575f5ffd5b5061021a6105b6366004613cf7565b61151a565b61021a6105c9366004613d12565b61160f565b3480156105d9575f5ffd5b506105276105e8366004613c0c565b61178d565b3480156105f8575f5ffd5b5061026c61187c565b34801561060c575f5ffd5b5061021a61061b366004613da7565b611898565b34801561062b575f5ffd5b5061021a61063a366004613dd1565b6119cf565b34801561064a575f5ffd5b5061021a610659366004613dd1565b611b19565b348015610669575f5ffd5b5061021a610678366004613ebc565b611bad565b348015610688575f5ffd5b50603a546102a8906001600160401b031681565b3480156106a7575f5ffd5b5061021a6106b6366004613f8e565b611d0c565b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610721573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107459190613ff5565b156107635760405163840a48d560e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600860048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156107c9573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ed9190613ff5565b1561080b5760405163840a48d560e01b815260040160405180910390fd5b5f61084f6108198580614010565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061210892505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff1660028111156108bd576108bd613c3e565b60028111156108ce576108ce613c3e565b81525050905080604001516001600160401b0316876001600160401b03161161090a576040516337e07ffd60e01b815260040160405180910390fd5b60018160600151600281111561092257610922613c3e565b146109405760405163d49e19a760e01b815260040160405180910390fd5b61098361094d8680614010565b808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061212a92505050565b6109a05760405163161ce5ed60e31b815260040160405180910390fd5b6109b26109ac88611361565b87612152565b6109de6109be886121f7565b87356109ca8880614010565b6109d760208b018b614055565b87516122ce565b6109e75f612402565b50505050505050565b5f610a0c71bbddc7ce488642fb579f8b00f3a590007251612582565b905090565b604051635ac86ab760e01b8152600a60048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610a77573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9b9190613ff5565b15610ab95760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b0316331480610adc5750603e546001600160a01b031633145b610af95760405163427a777960e01b815260040160405180910390fd5b5f610b0261187c565b90505f610b0f84836140ab565b905080341015610b325760405163356680b760e01b815260040160405180910390fd5b5f610b3d82346140c2565b90505f5b85811015610d305736878783818110610b5c57610b5c6140d5565b9050602002810190610b6e91906140e9565b90505f610bb7610b7e8380614055565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061260892505050565b90505f610bc48380614055565b610bd46040860160208701613b74565b604051602001610be693929190614107565b60405160208183030381529060405290505f710961ef480eb55e80d19ad83579a64c0070026001600160a01b03168883604051610c23919061413f565b5f6040518083038185875af1925050503d805f8114610c5d576040519150601f19603f3d011682016040523d82523d5f602084013e610c62565b606091505b5050905080610c845760405163fc52d48360e01b815260040160405180910390fd5b610c946040850160208601613b74565b6001600160401b03165f03610cd25760405183907f60d8ca014d4765a2b8b389e25714cb1cef83b574222911a01d90c1bd69d2d320905f90a2610d20565b827f8b2737bb64ab2f2dc09552dfa1c250399e6a42c7ea9f0e1c658f5d65d708ec05610d046040870160208801613b74565b6040516001600160401b03909116815260200160405180910390a25b505060019092019150610b419050565b508015610d4157610d413382612699565b505050505050565b6033546001600160a01b0316331480610d6c5750603e546001600160a01b031633145b610d895760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600260048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015610def573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e139190613ff5565b15610e315760405163840a48d560e01b815260040160405180910390fd5b8584148015610e3f57508382145b610e5c576040516343714afd60e01b815260040160405180910390fd5b603a546001600160401b03600160401b9091048116908a1611610e92576040516337e07ffd60e01b815260040160405180910390fd5b610ea4610e9e8a611361565b89612152565b5f805b87811015610f3d57610f298b8b358b8b85818110610ec757610ec76140d5565b9050602002016020810190610edc919061414a565b8a8a86818110610eee57610eee6140d5565b9050602002810190610f009190614055565b8a8a88818110610f1257610f126140d5565b9050602002810190610f249190614010565b6127ae565b610f33908361416e565b9150600101610ea7565b5060335460405163a1ca780b60e01b81526001600160a01b0391821660048201525f6024820152604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015610fb0575f5ffd5b505af1158015610fc2573d5f5f3e3d5ffd5b5050505050505050505050505050565b6060610a0c7f0000000000000000000000000000000000000000000000000000000000000000612caf565b5f5f61103d84848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061260892505050565b5f90815260366020526040902054600160c01b900460ff169150505b92915050565b604051635ac86ab760e01b8152600960048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156110c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e99190613ff5565b156111075760405163840a48d560e01b815260040160405180910390fd5b6033546001600160a01b031633148061112a5750603e546001600160a01b031633145b6111475760405163427a777960e01b815260040160405180910390fd5b5f6111506109f0565b90505f61115d84836140ab565b9050803410156111805760405163356680b760e01b815260040160405180910390fd5b5f61118b82346140c2565b90505f5b85811015610d3057368787838181106111aa576111aa6140d5565b90506020028101906111bc91906140e9565b90505f6111cc610b7e8380614055565b90505f6111df610b7e6020850185614055565b90505f6111eb8261146f565b905060018160600151600281111561120557611205613c3e565b146112235760405163d49e19a760e01b815260040160405180910390fd5b5f61122e8580614055565b61123b6020880188614055565b60405160200161124e9493929190614181565b60405160208183030381529060405290505f71bbddc7ce488642fb579f8b00f3a5900072516001600160a01b03168a8360405161128b919061413f565b5f6040518083038185875af1925050503d805f81146112c5576040519150601f19603f3d011682016040523d82523d5f602084013e6112ca565b606091505b50509050806112ec5760405163fc52d48360e01b815260040160405180910390fd5b8385036113225760405185907fc97b965b92ae7fd20095fe8eb7b99f81f95f8c4adffb22a19116d8eb2846b016905f90a261134f565b604051849086907f42f9c9db2ca443e9ec62f4588bd0c9b241065c02c2a8001ac164ae1282dc7b94905f90a35b50506001909401935061118f92505050565b5f61136f611fff600c6140ab565b6113826001600160401b038416426140c2565b106113a057604051637944e66d60e11b815260040160405180910390fd5b604080516001600160401b03841660208201525f918291720f3df6d732807ef1319fb7b8bb8522d0beac02910160408051601f19818403018152908290526113e79161413f565b5f60405180830381855afa9150503d805f811461141f576040519150601f19603f3d011682016040523d82523d5f602084013e611424565b606091505b509150915081801561143657505f8151115b6114535760405163558ad0a360e01b815260040160405180910390fd5b8080602001905181019061146791906141a0565b949350505050565b611496604080516080810182525f8082526020820181905291810182905290606082015290565b5f82815260366020908152604091829020825160808101845281546001600160401b038082168352600160401b8204811694830194909452600160801b810490931693810193909352906060830190600160c01b900460ff16600281111561150057611500613c3e565b600281111561151157611511613c3e565b90525092915050565b6033546001600160a01b031633148061153d5750603e546001600160a01b031633145b61155a5760405163427a777960e01b815260040160405180910390fd5b604051635ac86ab760e01b8152600660048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa1580156115c0573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e49190613ff5565b156116025760405163840a48d560e01b815260040160405180910390fd5b61160b82612402565b5050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461165857604051633213a66160e21b815260040160405180910390fd5b346801bc16d674ec800000146116815760405163049696b360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663228951186801bc16d674ec80000087876116c4612cec565b8888886040518863ffffffff1660e01b81526004016116e8969594939291906141df565b5f604051808303818588803b1580156116ff575f5ffd5b505af1158015611711573d5f5f3e3d5ffd5b50505050507fa01003766d3cd97cf2ade5429690bf5d206be7fb01ef9d3a0089ecf67bc1121961177586868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061260892505050565b60405190815260200160405180910390a15050505050565b6117b4604080516080810182525f8082526020820181905291810182905290606082015290565b60365f6117f585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061260892505050565b815260208082019290925260409081015f20815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b81049094169281019290925290916060830190600160c01b900460ff16600281111561186157611861613c3e565b600281111561187257611872613c3e565b9052509392505050565b5f610a0c710961ef480eb55e80d19ad83579a64c007002612582565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118e157604051633213a66160e21b815260040160405180910390fd5b5f6118f0633b9aca0083614241565b9050611909633b9aca006001600160401b0383166140ab565b6034549092506001600160401b03908116908216111561193c576040516302c6f54760e21b815260040160405180910390fd5b603480548291905f906119599084906001600160401b0316614254565b92506101000a8154816001600160401b0302191690836001600160401b03160217905550826001600160a01b03167f8947fd2ce07ef9cc302c4e8f0461015615d91ce851564839e91cc804c2f49d8e836040516119b891815260200190565b60405180910390a26119ca8383612699565b505050565b5f54610100900460ff16158080156119ed57505f54600160ff909116105b80611a065750303b158015611a0657505f5460ff166001145b611a6e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b5f805460ff191660011790558015611a8f575f805461ff0019166101001790555b6001600160a01b038216611ab6576040516339b190bb60e11b815260040160405180910390fd5b603380546001600160a01b0319166001600160a01b038416179055801561160b575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b6033546001600160a01b03163314611b445760405163719f370360e11b815260040160405180910390fd5b603e54604080516001600160a01b03928316815291831660208301527ffb8129080a19d34dceac04ba253fc50304dc86c729bd63cdca4a969ad19a5eac910160405180910390a1603e80546001600160a01b0319166001600160a01b0392909216919091179055565b6033546001600160a01b03163314611bd85760405163719f370360e11b815260040160405180910390fd5b604051635ac86ab760e01b8152600560048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611c3e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c629190613ff5565b15611c805760405163840a48d560e01b815260040160405180910390fd5b8251845114611ca2576040516343714afd60e01b815260040160405180910390fd5b5f5b8451811015611d0557611cfd83858381518110611cc357611cc36140d5565b6020026020010151878481518110611cdd57611cdd6140d5565b60200260200101516001600160a01b0316612d1c9092919063ffffffff16565b600101611ca4565b5050505050565b604051635ac86ab760e01b8152600760048201819052907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ac86ab790602401602060405180830381865afa158015611d72573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d969190613ff5565b15611db45760405163840a48d560e01b815260040160405180910390fd5b603a54600160401b90046001600160401b03165f819003611de857604051631a544f4960e01b815260040160405180910390fd5b6040805160a081018252603c548152603d5462ffffff811660208301526001600160401b0363010000008204811693830193909352600160581b810460070b6060830152600160981b90049091166080820152611e4f611e47836121f7565b825188612d6e565b5f805b858110156120af5736878783818110611e6d57611e6d6140d5565b9050602002810190611e7f9190614273565b80355f908152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff166002811115611eef57611eef613c3e565b6002811115611f0057611f00613c3e565b9052509050600181606001516002811115611f1d57611f1d613c3e565b14611f295750506120a7565b856001600160401b031681604001516001600160401b031610611f4d5750506120a7565b5f8080611f5d848a8f3588612e2f565b60208b0180519396509194509250611f7482614287565b62ffffff16905250608088018051849190611f909083906142a4565b6001600160401b0316905250606088018051839190611fb09083906142c3565b60070b905250611fc081886142a4565b85355f908152603660209081526040918290208751815492890151938901516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b0319909516919092161792909217928316821781556060880151939a50879390929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b83600281111561206457612064613c3e565b021790555050604051863591506001600160401b038b16907fe4866335761a51dcaff766448ab0af6064291ee5dc94e68492bb9cd757c1e350905f90a350505050505b600101611e52565b506001600160401b038084165f908152603b60205260408120805484939192916120db918591166142a4565b92506101000a8154816001600160401b0302191690836001600160401b031602179055506109e782612f45565b5f815f8151811061211b5761211b6140d5565b60200260200101519050919050565b5f8160038151811061213e5761213e6140d5565b60200260200101515f5f1b14159050919050565b61215e600360206140ab565b61216b6020830183614055565b90501461218b576040516313717da960e21b815260040160405180910390fd5b6121da61219b6020830183614055565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525086925050843590506003613165565b61160b576040516309bde33960e01b815260040160405180910390fd5b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632704351a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612255573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227991906142f2565b9050806001600160401b03165f036122a4576040516341a02cc960e01b815260040160405180910390fd5b806001600160401b0316836001600160401b031611156122c55760016122c7565b5f5b9392505050565b600884146122ef5760405163200591bd60e01b815260040160405180910390fd5b5f6122f98861317c565b9050806123086028600161416e565b612312919061416e565b61231d9060206140ab565b831461233c576040516313717da960e21b815260040160405180910390fd5b5f6123788787808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506131a492505050565b90505f64ffffffffff841661238f6028600161416e565b600b901b1790506123d986868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508d9250869150859050613165565b6123f6576040516309bde33960e01b815260040160405180910390fd5b50505050505050505050565b603a54600160401b90046001600160401b0316156124325760405162be9bc360e81b815260040160405180910390fd5b603a546001600160401b03428116911603612460576040516367db5b8b60e01b815260040160405180910390fd5b6034545f906001600160401b031661247c633b9aca0047614241565b6124869190614254565b905081801561249c57506001600160401b038116155b156124ba576040516332dea95960e21b815260040160405180910390fd5b5f6040518060a001604052806124cf42611361565b815260395462ffffff1660208201526001600160401b0380851660408301525f60608301819052608090920191909152603a805442909216600160401b026fffffffffffffffff000000000000000019909216919091179055905061253381612f45565b805160208083015160405162ffffff90911681526001600160401b034216917f575796133bbed337e5b39aa49a30dc2556a91e0c6c2af4b7b886ae77ebef1076910160405180910390a3505050565b5f5f5f836001600160a01b03166040515f60405180830381855afa9150503d805f81146125ca576040519150601f19603f3d011682016040523d82523d5f602084013e6125cf565b606091505b50915091508180156125e2575080516020145b6125ff5760405163c90158af60e01b815260040160405180910390fd5b6114678161430d565b5f815160301461262b57604051634f88323960e11b815260040160405180910390fd5b6040516002906126419084905f90602001614330565b60408051601f198184030181529082905261265b9161413f565b602060405180830381855afa158015612676573d5f5f3e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061105991906141a0565b804710156126e95760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401611a65565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612732576040519150601f19603f3d011682016040523d82523d5f602084013e612737565b606091505b50509050806119ca5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401611a65565b5f5f6127eb8484808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061210892505050565b5f818152603660209081526040808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092529394509192906060830190600160c01b900460ff16600281111561285957612859613c3e565b600281111561286a5761286a613c3e565b90525090505f8160600151600281111561288657612886613c3e565b146128a4576040516335e09e9d60e01b815260040160405180910390fd5b6001600160401b0380166128e98686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061343492505050565b6001600160401b03160361291057604051631958236d60e21b815260040160405180910390fd5b6001600160401b0380166129558686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061345892505050565b6001600160401b03161461297c57604051632eade63760e01b815260040160405180910390fd5b612984612cec565b61298d9061430d565b6129c88686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061346f92505050565b1480612a1d57506129d7613483565b6129e09061430d565b612a1b8686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061346f92505050565b145b612a3a57604051633772dd5360e11b815260040160405180910390fd5b5f612a768686808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061349f92505050565b9050612a8f612a848c6121f7565b8b88888c8c8f6122ce565b60398054905f612a9e83614354565b9091555050603a545f90600160401b90046001600160401b031615612ad557603a54600160401b90046001600160401b0316612ae2565b603a546001600160401b03165b6040805160808101825264ffffffffff8d1681526001600160401b03858116602083015283169181019190915290915060608101600190525f858152603660209081526040918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836002811115612bb757612bb7613c3e565b021790555050603d8054849250601390612be2908490600160981b90046001600160401b03166142a4565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507f101790c2993f6a4d962bd17c786126823ba1c4cf04ff4cccb2659d50fb20aee884604051612c3791815260200190565b60405180910390a1604080518581526001600160401b03838116602083015284168183015290517fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f9181900360600190a1612c9f633b9aca006001600160401b0384166140ab565b9c9b505050505050505050505050565b60605f612cbb836134b6565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b604051606090612d0890600160f81b905f90309060200161436c565b604051602081830303815290604052905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526119ca9084906134dd565b5f612d788461317c565b9050612d8581600361416e565b612d909060206140ab565b612d9d6020840184614055565b905014612dbd576040516313717da960e21b815260040160405180910390fd5b6003811b600c17612e12612dd46020850185614055565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250508635905084613165565b611d05576040516309bde33960e01b815260040160405180910390fd5b5f5f5f866020015192505f612e4886895f0151876135b0565b9050836001600160401b0316816001600160401b031614612ebc57612e6d84826143aa565b60408051873581526001600160401b038a8116602083015284168183015290519194507fcdae700d7241bc027168c53cf6f889763b0a2c88a65d77fc13a8a9fef0d8605f919081900360600190a15b6001600160401b0380821660208a0181905290881660408a01525f03612f3a5760398054905f612eeb836143d9565b909155505060026060890152612f00836143ee565b6040519092508535906001600160401b038916907f5ce0aa04ae51d52da6e680fbe0336d2e2432f7c3dc2d4f3193204c57b9072107905f90a35b509450945094915050565b8051603c556020810151603d805460408401516060850151608086015162ffffff9095166affffffffffffffffffffff19909316831763010000006001600160401b0393841602176fffffffffffffffffffffffffffffffff60581b1916600160581b9183169190910267ffffffffffffffff60981b191617600160981b919094160292909217905515612fd65750565b60808101516034545f91612ff2916001600160401b03166142a4565b90505f8260600151836040015161300991906142c3565b60408401516034805492935090915f9061302d9084906001600160401b03166142a4565b82546101009290920a6001600160401b03818102199093169183160217909155603a8054600160401b810483166001600160801b03199091161790555f915061307d90633b9aca009085166140ab565b90505f613092633b9aca00600785900b614413565b603a546040518281529192506001600160401b0316907f525408c201bc1576eb44116f6478f1c2a54775b19a043bcfdc708364f74f8e449060200160405180910390a260335460405163a1ca780b60e01b81526001600160a01b03918216600482015260248101849052604481018390527f00000000000000000000000000000000000000000000000000000000000000009091169063a1ca780b906064015f604051808303815f87803b158015613148575f5ffd5b505af115801561315a573d5f5f3e3d5ffd5b505050505050505050565b5f8361317286858561368e565b1495945050505050565b5f8082600181111561319057613190613c3e565b1461319c576006611059565b600592915050565b5f5f600283516131b49190614241565b90505f816001600160401b038111156131cf576131cf613dec565b6040519080825280602002602001820160405280156131f8578160200160208202803683370190505b5090505f5b828110156132f25760028561321283836140ab565b81518110613222576132226140d5565b60200260200101518683600261323891906140ab565b61324390600161416e565b81518110613253576132536140d5565b6020026020010151604051602001613275929190918252602082015260400190565b60408051601f198184030181529082905261328f9161413f565b602060405180830381855afa1580156132aa573d5f5f3e3d5ffd5b5050506040513d601f19601f820116820180604052508101906132cd91906141a0565b8282815181106132df576132df6140d5565b60209081029190910101526001016131fd565b506132fe600283614241565b91505b8115613411575f5b828110156133fe5760028261331e83836140ab565b8151811061332e5761332e6140d5565b60200260200101518383600261334491906140ab565b61334f90600161416e565b8151811061335f5761335f6140d5565b6020026020010151604051602001613381929190918252602082015260400190565b60408051601f198184030181529082905261339b9161413f565b602060405180830381855afa1580156133b6573d5f5f3e3d5ffd5b5050506040513d601f19601f820116820180604052508101906133d991906141a0565b8282815181106133eb576133eb6140d5565b6020908102919091010152600101613309565b5061340a600283614241565b9150613301565b805f81518110613423576134236140d5565b602002602001015192505050919050565b5f6110598260058151811061344b5761344b6140d5565b6020026020010151613762565b5f6110598260068151811061344b5761344b6140d5565b5f8160018151811061211b5761211b6140d5565b604051606090612d0890600160f91b905f90309060200161436c565b5f6110598260028151811061344b5761344b6140d5565b5f60ff8216601f81111561105957604051632cd44ac360e21b815260040160405180910390fd5b5f613531826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166137c99092919063ffffffff16565b905080515f14806135515750808060200190518101906135519190613ff5565b6119ca5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401611a65565b5f6135bd6026600161416e565b6135c89060206140ab565b6135d56040840184614055565b9050146135f5576040516313717da960e21b815260040160405180910390fd5b5f613601600485614442565b64ffffffffff16905061365a61361a6040850185614055565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508992505050602086013584613165565b613677576040516309bde33960e01b815260040160405180910390fd5b6136858360200135856137d7565b95945050505050565b5f83515f141580156136ab5750602084516136a9919061446b565b155b6136c8576040516313717da960e21b815260040160405180910390fd5b604080516020808201909252848152905b85518111613758576136ec60028561446b565b5f0361371e5781515f528086015160205260208260405f60026107d05a03fa613713575f5ffd5b600284049350613746565b808601515f52815160205260208260405f60026107d05a03fa61373f575f5ffd5b6002840493505b61375160208261416e565b90506136d9565b5051949350505050565b60f881901c60e882901c61ff00161760d882901c62ff0000161760c882901c63ff000000161764ff0000000060b883901c161765ff000000000060a883901c161766ff000000000000609883901c161767ff0000000000000060889290921c919091161790565b606061146784845f85613803565b5f806137e460048461447e565b6137ef9060406144a7565b64ffffffffff16905061146784821b613762565b6060824710156138645760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401611a65565b5f5f866001600160a01b0316858760405161387f919061413f565b5f6040518083038185875af1925050503d805f81146138b9576040519150601f19603f3d011682016040523d82523d5f602084013e6138be565b606091505b50915091506138cf878383876138da565b979650505050505050565b606083156139485782515f03613941576001600160a01b0385163b6139415760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611a65565b5081611467565b611467838381511561395d5781518083602001fd5b8060405162461bcd60e51b8152600401611a659190613bbd565b6001600160401b038116811461398b575f5ffd5b50565b5f6040828403121561399e575f5ffd5b50919050565b5f5f5f606084860312156139b6575f5ffd5b83356139c181613977565b925060208401356001600160401b038111156139db575f5ffd5b6139e78682870161398e565b92505060408401356001600160401b03811115613a02575f5ffd5b613a0e8682870161398e565b9150509250925092565b5f5f83601f840112613a28575f5ffd5b5081356001600160401b03811115613a3e575f5ffd5b6020830191508360208260051b8501011115613a58575f5ffd5b9250929050565b5f5f60208385031215613a70575f5ffd5b82356001600160401b03811115613a85575f5ffd5b613a9185828601613a18565b90969095509350505050565b5f5f5f5f5f5f5f5f60a0898b031215613ab4575f5ffd5b8835613abf81613977565b975060208901356001600160401b03811115613ad9575f5ffd5b613ae58b828c0161398e565b97505060408901356001600160401b03811115613b00575f5ffd5b613b0c8b828c01613a18565b90975095505060608901356001600160401b03811115613b2a575f5ffd5b613b368b828c01613a18565b90955093505060808901356001600160401b03811115613b54575f5ffd5b613b608b828c01613a18565b999c989b5096995094979396929594505050565b5f60208284031215613b84575f5ffd5b81356122c781613977565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6122c76020830184613b8f565b5f5f83601f840112613bdf575f5ffd5b5081356001600160401b03811115613bf5575f5ffd5b602083019150836020828501011115613a58575f5ffd5b5f5f60208385031215613c1d575f5ffd5b82356001600160401b03811115613c32575f5ffd5b613a9185828601613bcf565b634e487b7160e01b5f52602160045260245ffd5b60038110613c6e57634e487b7160e01b5f52602160045260245ffd5b9052565b602081016110598284613c52565b5f60208284031215613c90575f5ffd5b5035919050565b5f6080820190506001600160401b0383511682526001600160401b0360208401511660208301526001600160401b0360408401511660408301526060830151613ce36060840182613c52565b5092915050565b801515811461398b575f5ffd5b5f60208284031215613d07575f5ffd5b81356122c781613cea565b5f5f5f5f5f60608688031215613d26575f5ffd5b85356001600160401b03811115613d3b575f5ffd5b613d4788828901613bcf565b90965094505060208601356001600160401b03811115613d65575f5ffd5b613d7188828901613bcf565b96999598509660400135949350505050565b6001600160a01b038116811461398b575f5ffd5b8035613da281613d83565b919050565b5f5f60408385031215613db8575f5ffd5b8235613dc381613d83565b946020939093013593505050565b5f60208284031215613de1575f5ffd5b81356122c781613d83565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715613e2857613e28613dec565b604052919050565b5f6001600160401b03821115613e4857613e48613dec565b5060051b60200190565b5f82601f830112613e61575f5ffd5b8135613e74613e6f82613e30565b613e00565b8082825260208201915060208360051b860101925085831115613e95575f5ffd5b602085015b83811015613eb2578035835260209283019201613e9a565b5095945050505050565b5f5f5f60608486031215613ece575f5ffd5b83356001600160401b03811115613ee3575f5ffd5b8401601f81018613613ef3575f5ffd5b8035613f01613e6f82613e30565b8082825260208201915060208360051b850101925088831115613f22575f5ffd5b6020840193505b82841015613f4d578335613f3c81613d83565b825260209384019390910190613f29565b955050505060208401356001600160401b03811115613f6a575f5ffd5b613f7686828701613e52565b925050613f8560408501613d97565b90509250925092565b5f5f5f60408486031215613fa0575f5ffd5b83356001600160401b03811115613fb5575f5ffd5b613fc18682870161398e565b93505060208401356001600160401b03811115613fdc575f5ffd5b613fe886828701613a18565b9497909650939450505050565b5f60208284031215614005575f5ffd5b81516122c781613cea565b5f5f8335601e19843603018112614025575f5ffd5b8301803591506001600160401b0382111561403e575f5ffd5b6020019150600581901b3603821315613a58575f5ffd5b5f5f8335601e1984360301811261406a575f5ffd5b8301803591506001600160401b03821115614083575f5ffd5b602001915036819003821315613a58575f5ffd5b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761105957611059614097565b8181038181111561105957611059614097565b634e487b7160e01b5f52603260045260245ffd5b5f8235603e198336030181126140fd575f5ffd5b9190910192915050565b8284823760c09190911b6001600160c01b0319169101908152600801919050565b5f81518060208401855e5f93019283525090919050565b5f6122c78284614128565b5f6020828403121561415a575f5ffd5b813564ffffffffff811681146122c7575f5ffd5b8082018082111561105957611059614097565b838582375f8482015f8152838582375f93019283525090949350505050565b5f602082840312156141b0575f5ffd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b608081525f6141f260808301888a6141b7565b82810360208401526142048188613b8f565b905082810360408401526142198186886141b7565b915050826060830152979650505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261424f5761424f61422d565b500490565b6001600160401b03828116828216039081111561105957611059614097565b5f8235605e198336030181126140fd575f5ffd5b5f62ffffff82168061429b5761429b614097565b5f190192915050565b6001600160401b03818116838216019081111561105957611059614097565b600781810b9083900b01677fffffffffffffff8113677fffffffffffffff198212171561105957611059614097565b5f60208284031215614302575f5ffd5b81516122c781613977565b8051602080830151919081101561399e575f1960209190910360031b1b16919050565b5f61433b8285614128565b6001600160801b03199390931683525050601001919050565b5f6001820161436557614365614097565b5060010190565b6001600160f81b03199390931683526001600160a81b031991909116600183015260601b6bffffffffffffffffffffffff1916600c82015260200190565b600782810b9082900b03677fffffffffffffff198112677fffffffffffffff8213171561105957611059614097565b5f816143e7576143e7614097565b505f190190565b5f8160070b677fffffffffffffff19810361440b5761440b614097565b5f0392915050565b8082025f8212600160ff1b8414161561442e5761442e614097565b818105831482151761105957611059614097565b5f64ffffffffff8316806144585761445861422d565b8064ffffffffff84160491505092915050565b5f826144795761447961422d565b500690565b5f64ffffffffff8316806144945761449461422d565b8064ffffffffff84160691505092915050565b64ffffffffff8181168382160290811690818114613ce357613ce361409756fea26469706673582212208723ec7239bbcbb9f0710189c0b9c447283d7ef2fe07154c88871e345bc5dda864736f6c634300081b0033", +>>>>>>> bf33205d (chore: bindings) } // EigenPodABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/EigenPodStorage/binding.go b/pkg/bindings/EigenPodStorage/binding.go index ad1649bb69..a881e083cb 100644 --- a/pkg/bindings/EigenPodStorage/binding.go +++ b/pkg/bindings/EigenPodStorage/binding.go @@ -85,7 +85,7 @@ type IEigenPodTypesWithdrawalRequest struct { // EigenPodStorageMetaData contains all meta data concerning the EigenPodStorage contract. var EigenPodStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConsolidationRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"requestConsolidation\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.ConsolidationRequest[]\",\"components\":[{\"name\":\"srcPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"targetPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"requestWithdrawal\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.WithdrawalRequest[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amountGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"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\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCheckpointTwiceInSingleBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointAlreadyActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CredentialsAlreadyVerified\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeQueryFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ForkTimestampZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFunds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PredeployFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RefundFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConsolidationRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"requestConsolidation\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.ConsolidationRequest[]\",\"components\":[{\"name\":\"srcPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"targetPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"requestWithdrawal\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.WithdrawalRequest[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amountGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"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\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCheckpointTwiceInSingleBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointAlreadyActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CredentialsAlreadyVerified\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeQueryFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ForkTimestampZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFunds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PredeployFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]", } // EigenPodStorageABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IAllocationManager/binding.go b/pkg/bindings/IAllocationManager/binding.go index df8fd37f7f..fc15fe034e 100644 --- a/pkg/bindings/IAllocationManager/binding.go +++ b/pkg/bindings/IAllocationManager/binding.go @@ -80,7 +80,7 @@ type OperatorSet struct { // IAllocationManagerMetaData contains all meta data concerning the IAllocationManager contract. var IAllocationManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRedistributingOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]},{\"name\":\"redistributionRecipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRedistributionRecipient\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RedistributionAddressSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"redistributionRecipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonexistentAVSMetadata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"addStrategiesToOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearDeallocationQueue\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"numToClear\",\"type\":\"uint16[]\",\"internalType\":\"uint16[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"createRedistributingOperatorSets\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.CreateSetParams[]\",\"components\":[{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}]},{\"name\":\"redistributionRecipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deregisterFromOperatorSets\",\"inputs\":[{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.DeregisterParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatableMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocatedStrategies\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocation\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.Allocation\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"isSet\",\"type\":\"bool\",\"internalType\":\"bool\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getAllocations\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getEncumberedMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitude\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudes\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMaxMagnitudesAtBlock\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"blockNumber\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMemberCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMembers\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getMinimumSlashableStake\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"operators\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"futureBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"slashableStake\",\"type\":\"uint256[][]\",\"internalType\":\"uint256[][]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getOperatorSetCount\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRedistributionRecipient\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getRegisteredSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"operatorSets\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSlashCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesInOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.Allocation[]\",\"components\":[{\"name\":\"currentMagnitude\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"pendingDiff\",\"type\":\"int128\",\"internalType\":\"int128\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isMemberOfOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorRedistributable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isOperatorSlashable\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isRedistributingOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"modifyAllocations\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple[]\",\"internalType\":\"structIAllocationManagerTypes.AllocateParams[]\",\"components\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"newMagnitudes\",\"type\":\"uint64[]\",\"internalType\":\"uint64[]\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registerForOperatorSets\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.RegisterParams\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetIds\",\"type\":\"uint32[]\",\"internalType\":\"uint32[]\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromOperatorSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAVSRegistrar\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"internalType\":\"contractIAVSRegistrar\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setAllocationDelay\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashOperator\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"params\",\"type\":\"tuple\",\"internalType\":\"structIAllocationManagerTypes.SlashingParams\",\"components\":[{\"name\":\"operator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"operatorSetId\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"strategies\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadsToSlash\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"internalType\":\"string\"}]}],\"outputs\":[{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateAVSMetadataURI\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"metadataURI\",\"type\":\"string\",\"internalType\":\"string\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"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\":\"AVSRegistrarSet\",\"inputs\":[{\"name\":\"avs\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"registrar\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIAVSRegistrar\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationDelaySet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"delay\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"AllocationUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"magnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"effectBlock\",\"type\":\"uint32\",\"indexed\":false,\"internalType\":\"uint32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EncumberedMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"encumberedMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"MaxMagnitudeUpdated\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"maxMagnitude\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorAddedToOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSetCreated\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OperatorSlashed\",\"inputs\":[{\"name\":\"operator\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategies\",\"type\":\"address[]\",\"indexed\":false,\"internalType\":\"contractIStrategy[]\"},{\"name\":\"wadSlashed\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"description\",\"type\":\"string\",\"indexed\":false,\"internalType\":\"string\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RedistributionAddressSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"redistributionRecipient\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyAddedToOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"StrategyRemovedFromOperatorSet\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AlreadyMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAVSRegistrar\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidRedistributionRecipient\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStrategy\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWadToSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ModificationAlreadyPending\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NonexistentAVSMetadata\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotMemberOfSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OperatorNotSlashable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameMagnitude\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategiesMustBeInAscendingOrder\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotInOperatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UninitializedAllocationDelay\",\"inputs\":[]}]", } // IAllocationManagerABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IEigenPod/binding.go b/pkg/bindings/IEigenPod/binding.go index 80b32b2000..1f10ba2088 100644 --- a/pkg/bindings/IEigenPod/binding.go +++ b/pkg/bindings/IEigenPod/binding.go @@ -85,7 +85,7 @@ type IEigenPodTypesWithdrawalRequest struct { // IEigenPodMetaData contains all meta data concerning the IEigenPod contract. var IEigenPodMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConsolidationRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"requestConsolidation\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.ConsolidationRequest[]\",\"components\":[{\"name\":\"srcPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"targetPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"requestWithdrawal\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.WithdrawalRequest[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amountGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"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\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCheckpointTwiceInSingleBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointAlreadyActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CredentialsAlreadyVerified\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeQueryFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ForkTimestampZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFunds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PredeployFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"RefundFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"activeValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkpointBalanceExitedGwei\",\"inputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.Checkpoint\",\"components\":[{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proofsRemaining\",\"type\":\"uint24\",\"internalType\":\"uint24\"},{\"name\":\"podBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"balanceDeltasGwei\",\"type\":\"int64\",\"internalType\":\"int64\"},{\"name\":\"prevBeaconBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"currentCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eigenPodManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIEigenPodManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getConsolidationRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getParentBlockRoot\",\"inputs\":[{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawalRequestFee\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"lastCheckpointTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"podOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proofSubmitter\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"requestConsolidation\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.ConsolidationRequest[]\",\"components\":[{\"name\":\"srcPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"targetPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"requestWithdrawal\",\"inputs\":[{\"name\":\"requests\",\"type\":\"tuple[]\",\"internalType\":\"structIEigenPodTypes.WithdrawalRequest[]\",\"components\":[{\"name\":\"pubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"amountGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"setProofSubmitter\",\"inputs\":[{\"name\":\"newProofSubmitter\",\"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\":\"startCheckpoint\",\"inputs\":[{\"name\":\"revertIfNoBalance\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorPubkeyHashToInfo\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorPubkeyToInfo\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structIEigenPodTypes.ValidatorInfo\",\"components\":[{\"name\":\"validatorIndex\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"restakedBalanceGwei\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"lastCheckpointedAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"validatorPubkey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"validatorStatus\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIEigenPodTypes.VALIDATOR_STATUS\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifyCheckpointProofs\",\"inputs\":[{\"name\":\"balanceContainerProof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.BalanceContainerProof\",\"components\":[{\"name\":\"balanceContainerRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"proofs\",\"type\":\"tuple[]\",\"internalType\":\"structBeaconChainProofs.BalanceProof[]\",\"components\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"balanceRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyStaleBalance\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"proof\",\"type\":\"tuple\",\"internalType\":\"structBeaconChainProofs.ValidatorProof\",\"components\":[{\"name\":\"validatorFields\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"proof\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifyWithdrawalCredentials\",\"inputs\":[{\"name\":\"beaconTimestamp\",\"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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawRestakedBeaconChainETH\",\"inputs\":[{\"name\":\"recipient\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawableRestakedExecutionLayerGwei\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"CheckpointCreated\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"beaconBlockRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorCount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"CheckpointFinalized\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"totalShareDeltaWei\",\"type\":\"int256\",\"indexed\":false,\"internalType\":\"int256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ConsolidationRequested\",\"inputs\":[{\"name\":\"sourcePubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"targetPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EigenPodStaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ExitRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"NonBeaconChainETHReceived\",\"inputs\":[{\"name\":\"amountReceived\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ProofSubmitterUpdated\",\"inputs\":[{\"name\":\"prevProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newProofSubmitter\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"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\":\"SwitchToCompoundingRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorBalanceUpdated\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"},{\"name\":\"balanceTimestamp\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"newValidatorBalanceGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCheckpointed\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRestaked\",\"inputs\":[{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorWithdrawn\",\"inputs\":[{\"name\":\"checkpointTimestamp\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"pubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"WithdrawalRequested\",\"inputs\":[{\"name\":\"validatorPubkeyHash\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"withdrawalAmountGwei\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BeaconTimestampTooFarInPast\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCheckpointTwiceInSingleBlock\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CheckpointAlreadyActive\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CredentialsAlreadyVerified\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CurrentlyPaused\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FeeQueryFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ForkTimestampZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InputArrayLengthMismatch\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientFunds\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientWithdrawableBalance\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidEIP4788Response\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPubKeyLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MsgValueNot32ETH\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoActiveCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NoBalanceToCheckpoint\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwner\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyEigenPodOwnerOrProofSubmitter\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"PredeployFailed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"TimestampOutOfRange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorInactiveOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIsExitingBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotActiveInPod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotSlashedOnBeaconChain\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"WithdrawalCredentialsNotForEigenPod\",\"inputs\":[]}]", } // IEigenPodABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/IStrategyManager/binding.go b/pkg/bindings/IStrategyManager/binding.go index 7aea3950cd..d6c5a138ff 100644 --- a/pkg/bindings/IStrategyManager/binding.go +++ b/pkg/bindings/IStrategyManager/binding.go @@ -37,7 +37,7 @@ type OperatorSet struct { // IStrategyManagerMetaData contains all meta data concerning the IStrategyManager contract. var IStrategyManagerMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableSharesByStrategy\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"depositShares\",\"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\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesWithBurnableShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesDecreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesIncreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"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\":\"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\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableSharesByStrategy\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"depositShares\",\"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\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"getPendingOperatorSets\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingSlashIds\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesWithBurnableShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"user\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyListLength\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"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\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesDecreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesIncreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"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\":\"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\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", } // IStrategyManagerABI is the input ABI used to generate the binding from. @@ -405,6 +405,68 @@ func (_IStrategyManager *IStrategyManagerCallerSession) GetDeposits(staker commo return _IStrategyManager.Contract.GetDeposits(&_IStrategyManager.CallOpts, staker) } +// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08. +// +// Solidity: function getPendingOperatorSets() view returns((address,uint32)[]) +func (_IStrategyManager *IStrategyManagerCaller) GetPendingOperatorSets(opts *bind.CallOpts) ([]OperatorSet, error) { + var out []interface{} + err := _IStrategyManager.contract.Call(opts, &out, "getPendingOperatorSets") + + if err != nil { + return *new([]OperatorSet), err + } + + out0 := *abi.ConvertType(out[0], new([]OperatorSet)).(*[]OperatorSet) + + return out0, err + +} + +// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08. +// +// Solidity: function getPendingOperatorSets() view returns((address,uint32)[]) +func (_IStrategyManager *IStrategyManagerSession) GetPendingOperatorSets() ([]OperatorSet, error) { + return _IStrategyManager.Contract.GetPendingOperatorSets(&_IStrategyManager.CallOpts) +} + +// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08. +// +// Solidity: function getPendingOperatorSets() view returns((address,uint32)[]) +func (_IStrategyManager *IStrategyManagerCallerSession) GetPendingOperatorSets() ([]OperatorSet, error) { + return _IStrategyManager.Contract.GetPendingOperatorSets(&_IStrategyManager.CallOpts) +} + +// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564. +// +// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[]) +func (_IStrategyManager *IStrategyManagerCaller) GetPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([]*big.Int, error) { + var out []interface{} + err := _IStrategyManager.contract.Call(opts, &out, "getPendingSlashIds", operatorSet) + + if err != nil { + return *new([]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int) + + return out0, err + +} + +// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564. +// +// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[]) +func (_IStrategyManager *IStrategyManagerSession) GetPendingSlashIds(operatorSet OperatorSet) ([]*big.Int, error) { + return _IStrategyManager.Contract.GetPendingSlashIds(&_IStrategyManager.CallOpts, operatorSet) +} + +// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564. +// +// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[]) +func (_IStrategyManager *IStrategyManagerCallerSession) GetPendingSlashIds(operatorSet OperatorSet) ([]*big.Int, error) { + return _IStrategyManager.Contract.GetPendingSlashIds(&_IStrategyManager.CallOpts, operatorSet) +} + // GetStakerStrategyList is a free data retrieval call binding the contract method 0xde44acb6. // // Solidity: function getStakerStrategyList(address staker) view returns(address[]) diff --git a/pkg/bindings/SlashingLib/binding.go b/pkg/bindings/SlashingLib/binding.go index 034dbedd8e..e9592ac7b3 100644 --- a/pkg/bindings/SlashingLib/binding.go +++ b/pkg/bindings/SlashingLib/binding.go @@ -31,8 +31,8 @@ var ( // SlashingLibMetaData contains all meta data concerning the SlashingLib contract. var SlashingLibMetaData = &bind.MetaData{ - ABI: "[]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220d77008d9dc6da6ba630ed26ce2ebd7807290484c37fdedbda5498da750ed331d64736f6c634300081b0033", + ABI: "[{\"type\":\"error\",\"name\":\"InvalidDepositScalingFactor\",\"inputs\":[]}]", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea2646970667358221220f8853b77cf1aa8562466cfac5db1fbb16b20cdd8e6b3539b8a027a4ac100b19c64736f6c634300081b0033", } // SlashingLibABI is the input ABI used to generate the binding from. diff --git a/pkg/bindings/Snapshots/binding.go b/pkg/bindings/Snapshots/binding.go index 0dd226245c..2c83ccf968 100644 --- a/pkg/bindings/Snapshots/binding.go +++ b/pkg/bindings/Snapshots/binding.go @@ -32,7 +32,7 @@ var ( // SnapshotsMetaData contains all meta data concerning the Snapshots contract. var SnapshotsMetaData = &bind.MetaData{ ABI: "[{\"type\":\"error\",\"name\":\"InvalidSnapshotOrdering\",\"inputs\":[]}]", - Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea264697066735822122011e44772e5e048ac18ac13f93173c40fd58d4a63972e68327428ad094846230b64736f6c634300081b0033", + Bin: "0x60556032600b8282823980515f1a607314602657634e487b7160e01b5f525f60045260245ffd5b305f52607381538281f3fe730000000000000000000000000000000000000000301460806040525f5ffdfea26469706673582212200f8449cd6e3f11592ff53a455658ec6ffa3974fd1f0bde17cbd335fc7096fdb264736f6c634300081b0033", } // SnapshotsABI 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 13ed53bee9..c30de0499b 100644 --- a/pkg/bindings/StrategyManager/binding.go +++ b/pkg/bindings/StrategyManager/binding.go @@ -50,7 +50,7 @@ var StrategyManagerABI = StrategyManagerMetaData.ABI var StrategyManagerBin = StrategyManagerMetaData.Bin // DeployStrategyManager deploys a new Ethereum contract, binding an instance of StrategyManager to it. -func DeployStrategyManager(auth *bind.TransactOpts, backend bind.ContractBackend, _delegation common.Address, _slashEscrowFactory common.Address, _pauserRegistry common.Address, _version string) (common.Address, *types.Transaction, *StrategyManager, error) { +func DeployStrategyManager(auth *bind.TransactOpts, backend bind.ContractBackend, _allocationManager common.Address, _delegation common.Address, _pauserRegistry common.Address, _version string) (common.Address, *types.Transaction, *StrategyManager, error) { parsed, err := StrategyManagerMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -59,7 +59,7 @@ func DeployStrategyManager(auth *bind.TransactOpts, backend bind.ContractBackend return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(StrategyManagerBin), backend, _delegation, _slashEscrowFactory, _pauserRegistry, _version) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(StrategyManagerBin), backend, _allocationManager, _delegation, _pauserRegistry, _version) if err != nil { return common.Address{}, nil, nil, err } @@ -270,6 +270,37 @@ func (_StrategyManager *StrategyManagerCallerSession) DEPOSITTYPEHASH() ([32]byt return _StrategyManager.Contract.DEPOSITTYPEHASH(&_StrategyManager.CallOpts) } +// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7. +// +// Solidity: function allocationManager() view returns(address) +func (_StrategyManager *StrategyManagerCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _StrategyManager.contract.Call(opts, &out, "allocationManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7. +// +// Solidity: function allocationManager() view returns(address) +func (_StrategyManager *StrategyManagerSession) AllocationManager() (common.Address, error) { + return _StrategyManager.Contract.AllocationManager(&_StrategyManager.CallOpts) +} + +// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7. +// +// Solidity: function allocationManager() view returns(address) +func (_StrategyManager *StrategyManagerCallerSession) AllocationManager() (common.Address, error) { + return _StrategyManager.Contract.AllocationManager(&_StrategyManager.CallOpts) +} + // CalculateStrategyDepositDigestHash is a free data retrieval call binding the contract method 0x9ac01d61. // // Solidity: function calculateStrategyDepositDigestHash(address staker, address strategy, address token, uint256 amount, uint256 nonce, uint256 expiry) view returns(bytes32) @@ -520,6 +551,68 @@ func (_StrategyManager *StrategyManagerCallerSession) GetDeposits(staker common. return _StrategyManager.Contract.GetDeposits(&_StrategyManager.CallOpts, staker) } +// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08. +// +// Solidity: function getPendingOperatorSets() view returns((address,uint32)[]) +func (_StrategyManager *StrategyManagerCaller) GetPendingOperatorSets(opts *bind.CallOpts) ([]OperatorSet, error) { + var out []interface{} + err := _StrategyManager.contract.Call(opts, &out, "getPendingOperatorSets") + + if err != nil { + return *new([]OperatorSet), err + } + + out0 := *abi.ConvertType(out[0], new([]OperatorSet)).(*[]OperatorSet) + + return out0, err + +} + +// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08. +// +// Solidity: function getPendingOperatorSets() view returns((address,uint32)[]) +func (_StrategyManager *StrategyManagerSession) GetPendingOperatorSets() ([]OperatorSet, error) { + return _StrategyManager.Contract.GetPendingOperatorSets(&_StrategyManager.CallOpts) +} + +// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08. +// +// Solidity: function getPendingOperatorSets() view returns((address,uint32)[]) +func (_StrategyManager *StrategyManagerCallerSession) GetPendingOperatorSets() ([]OperatorSet, error) { + return _StrategyManager.Contract.GetPendingOperatorSets(&_StrategyManager.CallOpts) +} + +// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564. +// +// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[]) +func (_StrategyManager *StrategyManagerCaller) GetPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([]*big.Int, error) { + var out []interface{} + err := _StrategyManager.contract.Call(opts, &out, "getPendingSlashIds", operatorSet) + + if err != nil { + return *new([]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int) + + return out0, err + +} + +// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564. +// +// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[]) +func (_StrategyManager *StrategyManagerSession) GetPendingSlashIds(operatorSet OperatorSet) ([]*big.Int, error) { + return _StrategyManager.Contract.GetPendingSlashIds(&_StrategyManager.CallOpts, operatorSet) +} + +// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564. +// +// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[]) +func (_StrategyManager *StrategyManagerCallerSession) GetPendingSlashIds(operatorSet OperatorSet) ([]*big.Int, error) { + return _StrategyManager.Contract.GetPendingSlashIds(&_StrategyManager.CallOpts, operatorSet) +} + // GetStakerStrategyList is a free data retrieval call binding the contract method 0xde44acb6. // // Solidity: function getStakerStrategyList(address staker) view returns(address[]) @@ -738,37 +831,6 @@ func (_StrategyManager *StrategyManagerCallerSession) PauserRegistry() (common.A return _StrategyManager.Contract.PauserRegistry(&_StrategyManager.CallOpts) } -// SlashEscrowFactory is a free data retrieval call binding the contract method 0x5b84087f. -// -// Solidity: function slashEscrowFactory() view returns(address) -func (_StrategyManager *StrategyManagerCaller) SlashEscrowFactory(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _StrategyManager.contract.Call(opts, &out, "slashEscrowFactory") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// SlashEscrowFactory is a free data retrieval call binding the contract method 0x5b84087f. -// -// Solidity: function slashEscrowFactory() view returns(address) -func (_StrategyManager *StrategyManagerSession) SlashEscrowFactory() (common.Address, error) { - return _StrategyManager.Contract.SlashEscrowFactory(&_StrategyManager.CallOpts) -} - -// SlashEscrowFactory is a free data retrieval call binding the contract method 0x5b84087f. -// -// Solidity: function slashEscrowFactory() view returns(address) -func (_StrategyManager *StrategyManagerCallerSession) SlashEscrowFactory() (common.Address, error) { - return _StrategyManager.Contract.SlashEscrowFactory(&_StrategyManager.CallOpts) -} - // StakerDepositShares is a free data retrieval call binding the contract method 0xfe243a17. // // Solidity: function stakerDepositShares(address staker, address strategy) view returns(uint256 shares) diff --git a/pkg/bindings/StrategyManagerStorage/binding.go b/pkg/bindings/StrategyManagerStorage/binding.go index a3f6963fe2..552f06e830 100644 --- a/pkg/bindings/StrategyManagerStorage/binding.go +++ b/pkg/bindings/StrategyManagerStorage/binding.go @@ -37,7 +37,7 @@ type OperatorSet struct { // StrategyManagerStorageMetaData contains all meta data concerning the StrategyManagerStorage contract. var StrategyManagerStorageMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableSharesByStrategy\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"depositShares\",\"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\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesWithBurnableShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slashEscrowFactory\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractISlashEscrowFactory\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"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\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesDecreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesIncreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"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\":\"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\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", + ABI: "[{\"type\":\"function\",\"name\":\"DEFAULT_BURN_ADDRESS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DEPOSIT_TYPEHASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"addStrategiesToDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allocationManager\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIAllocationManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burnShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"calculateStrategyDepositDigestHash\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"clearBurnOrRedistributableSharesByStrategy\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"depositShares\",\"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\":\"depositShares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableCount\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getBurnableShares\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"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\":\"getPendingOperatorSets\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"tuple[]\",\"internalType\":\"structOperatorSet[]\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingSlashIds\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStrategiesWithBurnableShares\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBurnOrRedistributableShares\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"addedSharesToBurn\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialPausedStatus\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"signer\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"removeDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"depositSharesToRemove\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"removeStrategiesFromDepositWhitelist\",\"inputs\":[{\"name\":\"strategiesToRemoveFromWhitelist\",\"type\":\"address[]\",\"internalType\":\"contractIStrategy[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setStrategyWhitelister\",\"inputs\":[{\"name\":\"newStrategyWhitelister\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"stakerDepositShares\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"stakerStrategyList\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"strategies\",\"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\":\"strategyIsWhitelistedForDeposit\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"}],\"outputs\":[{\"name\":\"whitelisted\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"strategyWhitelister\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdrawSharesAsTokens\",\"inputs\":[{\"name\":\"staker\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"strategy\",\"type\":\"address\",\"internalType\":\"contractIStrategy\"},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"shares\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesDecreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnOrRedistributableSharesIncreased\",\"inputs\":[{\"name\":\"operatorSet\",\"type\":\"tuple\",\"indexed\":false,\"internalType\":\"structOperatorSet\",\"components\":[{\"name\":\"avs\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"id\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"name\":\"slashId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"BurnableSharesDecreased\",\"inputs\":[{\"name\":\"strategy\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"contractIStrategy\"},{\"name\":\"shares\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Deposit\",\"inputs\":[{\"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\":\"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\":\"error\",\"name\":\"MaxStrategiesExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyDelegationManager\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyStrategyWhitelister\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountTooHigh\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SharesAmountZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StakerAddressZero\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyAlreadyInSlash\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotFound\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StrategyNotWhitelisted\",\"inputs\":[]}]", } // StrategyManagerStorageABI is the input ABI used to generate the binding from. @@ -248,6 +248,37 @@ func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) DEPOSITTYPEH return _StrategyManagerStorage.Contract.DEPOSITTYPEHASH(&_StrategyManagerStorage.CallOpts) } +// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7. +// +// Solidity: function allocationManager() view returns(address) +func (_StrategyManagerStorage *StrategyManagerStorageCaller) AllocationManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _StrategyManagerStorage.contract.Call(opts, &out, "allocationManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7. +// +// Solidity: function allocationManager() view returns(address) +func (_StrategyManagerStorage *StrategyManagerStorageSession) AllocationManager() (common.Address, error) { + return _StrategyManagerStorage.Contract.AllocationManager(&_StrategyManagerStorage.CallOpts) +} + +// AllocationManager is a free data retrieval call binding the contract method 0xca8aa7c7. +// +// Solidity: function allocationManager() view returns(address) +func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) AllocationManager() (common.Address, error) { + return _StrategyManagerStorage.Contract.AllocationManager(&_StrategyManagerStorage.CallOpts) +} + // CalculateStrategyDepositDigestHash is a free data retrieval call binding the contract method 0x9ac01d61. // // Solidity: function calculateStrategyDepositDigestHash(address staker, address strategy, address token, uint256 amount, uint256 nonce, uint256 expiry) view returns(bytes32) @@ -467,6 +498,68 @@ func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) GetDeposits( return _StrategyManagerStorage.Contract.GetDeposits(&_StrategyManagerStorage.CallOpts, staker) } +// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08. +// +// Solidity: function getPendingOperatorSets() view returns((address,uint32)[]) +func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetPendingOperatorSets(opts *bind.CallOpts) ([]OperatorSet, error) { + var out []interface{} + err := _StrategyManagerStorage.contract.Call(opts, &out, "getPendingOperatorSets") + + if err != nil { + return *new([]OperatorSet), err + } + + out0 := *abi.ConvertType(out[0], new([]OperatorSet)).(*[]OperatorSet) + + return out0, err + +} + +// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08. +// +// Solidity: function getPendingOperatorSets() view returns((address,uint32)[]) +func (_StrategyManagerStorage *StrategyManagerStorageSession) GetPendingOperatorSets() ([]OperatorSet, error) { + return _StrategyManagerStorage.Contract.GetPendingOperatorSets(&_StrategyManagerStorage.CallOpts) +} + +// GetPendingOperatorSets is a free data retrieval call binding the contract method 0x3f292b08. +// +// Solidity: function getPendingOperatorSets() view returns((address,uint32)[]) +func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) GetPendingOperatorSets() ([]OperatorSet, error) { + return _StrategyManagerStorage.Contract.GetPendingOperatorSets(&_StrategyManagerStorage.CallOpts) +} + +// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564. +// +// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[]) +func (_StrategyManagerStorage *StrategyManagerStorageCaller) GetPendingSlashIds(opts *bind.CallOpts, operatorSet OperatorSet) ([]*big.Int, error) { + var out []interface{} + err := _StrategyManagerStorage.contract.Call(opts, &out, "getPendingSlashIds", operatorSet) + + if err != nil { + return *new([]*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new([]*big.Int)).(*[]*big.Int) + + return out0, err + +} + +// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564. +// +// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[]) +func (_StrategyManagerStorage *StrategyManagerStorageSession) GetPendingSlashIds(operatorSet OperatorSet) ([]*big.Int, error) { + return _StrategyManagerStorage.Contract.GetPendingSlashIds(&_StrategyManagerStorage.CallOpts, operatorSet) +} + +// GetPendingSlashIds is a free data retrieval call binding the contract method 0x7def1564. +// +// Solidity: function getPendingSlashIds((address,uint32) operatorSet) view returns(uint256[]) +func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) GetPendingSlashIds(operatorSet OperatorSet) ([]*big.Int, error) { + return _StrategyManagerStorage.Contract.GetPendingSlashIds(&_StrategyManagerStorage.CallOpts, operatorSet) +} + // GetStakerStrategyList is a free data retrieval call binding the contract method 0xde44acb6. // // Solidity: function getStakerStrategyList(address staker) view returns(address[]) @@ -561,37 +654,6 @@ func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) Nonces(signe return _StrategyManagerStorage.Contract.Nonces(&_StrategyManagerStorage.CallOpts, signer) } -// SlashEscrowFactory is a free data retrieval call binding the contract method 0x5b84087f. -// -// Solidity: function slashEscrowFactory() view returns(address) -func (_StrategyManagerStorage *StrategyManagerStorageCaller) SlashEscrowFactory(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _StrategyManagerStorage.contract.Call(opts, &out, "slashEscrowFactory") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// SlashEscrowFactory is a free data retrieval call binding the contract method 0x5b84087f. -// -// Solidity: function slashEscrowFactory() view returns(address) -func (_StrategyManagerStorage *StrategyManagerStorageSession) SlashEscrowFactory() (common.Address, error) { - return _StrategyManagerStorage.Contract.SlashEscrowFactory(&_StrategyManagerStorage.CallOpts) -} - -// SlashEscrowFactory is a free data retrieval call binding the contract method 0x5b84087f. -// -// Solidity: function slashEscrowFactory() view returns(address) -func (_StrategyManagerStorage *StrategyManagerStorageCallerSession) SlashEscrowFactory() (common.Address, error) { - return _StrategyManagerStorage.Contract.SlashEscrowFactory(&_StrategyManagerStorage.CallOpts) -} - // StakerDepositShares is a free data retrieval call binding the contract method 0xfe243a17. // // Solidity: function stakerDepositShares(address staker, address strategy) view returns(uint256 shares) diff --git a/script/configs/local/deploy_from_scratch.slashing.anvil.config.json b/script/configs/local/deploy_from_scratch.slashing.anvil.config.json index 4ee617819a..b557f8ab74 100644 --- a/script/configs/local/deploy_from_scratch.slashing.anvil.config.json +++ b/script/configs/local/deploy_from_scratch.slashing.anvil.config.json @@ -57,6 +57,11 @@ "OPERATOR_SET_GENESIS_REWARDS_TIMESTAMP": 1720656000, "OPERATOR_SET_MAX_RETROACTIVE_LENGTH": 2592000 }, + "addresses": { + "token": { + "eigenStrategy": "0x0000000000000000000000000000000000000000" + } + }, "ethPOSDepositAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa", "semver": "v0.0.0" } \ No newline at end of file diff --git a/script/deploy/devnet/deploy_from_scratch.s.sol b/script/deploy/devnet/deploy_from_scratch.s.sol index 7df8146e49..f196d06e9c 100644 --- a/script/deploy/devnet/deploy_from_scratch.s.sol +++ b/script/deploy/devnet/deploy_from_scratch.s.sol @@ -14,11 +14,9 @@ import "../../../src/contracts/core/AVSDirectory.sol"; import "../../../src/contracts/core/RewardsCoordinator.sol"; import "../../../src/contracts/core/AllocationManager.sol"; import "../../../src/contracts/permissions/PermissionController.sol"; -import "../../../src/contracts/core/SlashEscrowFactory.sol"; import "../../../src/contracts/strategies/StrategyBaseTVLLimits.sol"; import "../../../src/contracts/strategies/StrategyFactory.sol"; import "../../../src/contracts/strategies/StrategyBase.sol"; -import "../../../src/contracts/core/SlashEscrow.sol"; import "../../../src/contracts/pods/EigenPod.sol"; import "../../../src/contracts/pods/EigenPodManager.sol"; @@ -64,8 +62,6 @@ contract DeployFromScratch is Script, Test { AllocationManager public allocationManager; PermissionController public permissionController; PermissionController public permissionControllerImplementation; - SlashEscrowFactory public slashEscrowFactory; - SlashEscrowFactory public slashEscrowFactoryImplementation; EmptyContract public emptyContract; @@ -73,6 +69,8 @@ contract DeployFromScratch is Script, Test { address operationsMultisig; address pauserMultisig; + IStrategy eigenStrategy; + // the ETH2 deposit contract -- if not on mainnet, we deploy a mock as stand-in IETHPOSDeposit public ethPOSDeposit; @@ -167,6 +165,8 @@ contract DeployFromScratch is Script, Test { operationsMultisig = stdJson.readAddress(config_data, ".multisig_addresses.operationsMultisig"); pauserMultisig = stdJson.readAddress(config_data, ".multisig_addresses.pauserMultisig"); + eigenStrategy = IStrategy(stdJson.readAddress(config_data, ".addresses.token.eigenStrategy")); + require(executorMultisig != address(0), "executorMultisig address not configured correctly!"); require(operationsMultisig != address(0), "operationsMultisig address not configured correctly!"); @@ -214,9 +214,6 @@ contract DeployFromScratch is Script, Test { permissionController = PermissionController( address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); - slashEscrowFactory = SlashEscrowFactory( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); // if on mainnet, use the ETH2 deposit contract address if (chainId == 1) ethPOSDeposit = IETHPOSDeposit(0x00000000219ab540356cBB839Cbe05303d7705Fa); @@ -238,7 +235,7 @@ contract DeployFromScratch is Script, Test { SEMVER ); - strategyManagerImplementation = new StrategyManager(delegation, slashEscrowFactory, eigenLayerPauserReg, SEMVER); + strategyManagerImplementation = new StrategyManager(allocationManager, delegation, eigenLayerPauserReg, SEMVER); avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg, SEMVER); eigenPodManagerImplementation = new EigenPodManager(ethPOSDeposit, eigenPodBeacon, delegation, eigenLayerPauserReg, SEMVER); @@ -259,6 +256,7 @@ contract DeployFromScratch is Script, Test { ); allocationManagerImplementation = new AllocationManager( delegation, + eigenStrategy, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, @@ -267,8 +265,6 @@ contract DeployFromScratch is Script, Test { ); permissionControllerImplementation = new PermissionController(SEMVER); strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg, SEMVER); - slashEscrowFactoryImplementation = - new SlashEscrowFactory(allocationManager, strategyManager, eigenLayerPauserReg, new SlashEscrow(), SEMVER); // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. { diff --git a/script/deploy/local/deploy_from_scratch.slashing.s.sol b/script/deploy/local/deploy_from_scratch.slashing.s.sol index cadbe4aace..49022cdef1 100644 --- a/script/deploy/local/deploy_from_scratch.slashing.s.sol +++ b/script/deploy/local/deploy_from_scratch.slashing.s.sol @@ -7,6 +7,7 @@ import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.so import "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol"; import "../../../src/contracts/interfaces/IETHPOSDeposit.sol"; +import "../../../src/contracts/strategies/EigenStrategy.sol"; import "../../../src/contracts/core/StrategyManager.sol"; import "../../../src/contracts/core/DelegationManager.sol"; @@ -14,8 +15,6 @@ import "../../../src/contracts/core/AVSDirectory.sol"; import "../../../src/contracts/core/RewardsCoordinator.sol"; import "../../../src/contracts/core/AllocationManager.sol"; import "../../../src/contracts/permissions/PermissionController.sol"; -import "../../../src/contracts/core/SlashEscrowFactory.sol"; -import "../../../src/contracts/core/SlashEscrow.sol"; import "../../../src/contracts/strategies/StrategyBaseTVLLimits.sol"; @@ -68,8 +67,6 @@ contract DeployFromScratch is Script, Test { AllocationManager public allocationManager; PermissionController public permissionControllerImplementation; PermissionController public permissionController; - SlashEscrowFactory public slashEscrowFactory; - SlashEscrowFactory public slashEscrowFactoryImplementation; EmptyContract public emptyContract; @@ -77,6 +74,8 @@ contract DeployFromScratch is Script, Test { address operationsMultisig; address pauserMultisig; + IStrategy eigenStrategy; + string SEMVER; // the ETH2 deposit contract -- if not on mainnet, we deploy a mock as stand-in @@ -174,6 +173,7 @@ contract DeployFromScratch is Script, Test { executorMultisig = stdJson.readAddress(config_data, ".multisig_addresses.executorMultisig"); operationsMultisig = stdJson.readAddress(config_data, ".multisig_addresses.operationsMultisig"); pauserMultisig = stdJson.readAddress(config_data, ".multisig_addresses.pauserMultisig"); + // load token list bytes memory strategyConfigsRaw = stdJson.parseRaw(config_data, ".strategies"); strategyConfigs = abi.decode(strategyConfigsRaw, (StrategyConfig[])); @@ -222,9 +222,8 @@ contract DeployFromScratch is Script, Test { permissionController = PermissionController( address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) ); - slashEscrowFactory = SlashEscrowFactory( - address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), "")) - ); + + eigenStrategy = IStrategy(new EigenStrategy(strategyManager, eigenLayerPauserReg, SEMVER)); // if on mainnet, use the ETH2 deposit contract address if (chainId == 1) ethPOSDeposit = IETHPOSDeposit(0x00000000219ab540356cBB839Cbe05303d7705Fa); @@ -245,7 +244,7 @@ contract DeployFromScratch is Script, Test { MIN_WITHDRAWAL_DELAY, SEMVER ); - strategyManagerImplementation = new StrategyManager(delegation, slashEscrowFactory, eigenLayerPauserReg, SEMVER); + strategyManagerImplementation = new StrategyManager(allocationManager, delegation, eigenLayerPauserReg, SEMVER); avsDirectoryImplementation = new AVSDirectory(delegation, eigenLayerPauserReg, SEMVER); eigenPodManagerImplementation = new EigenPodManager(ethPOSDeposit, eigenPodBeacon, delegation, eigenLayerPauserReg, SEMVER); @@ -266,6 +265,7 @@ contract DeployFromScratch is Script, Test { ); allocationManagerImplementation = new AllocationManager( delegation, + eigenStrategy, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, @@ -273,8 +273,6 @@ contract DeployFromScratch is Script, Test { SEMVER ); permissionControllerImplementation = new PermissionController(SEMVER); - slashEscrowFactoryImplementation = - new SlashEscrowFactory(allocationManager, strategyManager, eigenLayerPauserReg, new SlashEscrow(), SEMVER); // Third, upgrade the proxy contracts to use the correct implementation contracts and initialize them. { diff --git a/script/releases/Env.sol b/script/releases/Env.sol index 75dad851ff..b38532747f 100644 --- a/script/releases/Env.sol +++ b/script/releases/Env.sol @@ -15,10 +15,6 @@ import "src/contracts/core/RewardsCoordinator.sol"; import "src/contracts/interfaces/IRewardsCoordinator.sol"; import "src/contracts/core/StrategyManager.sol"; -/// slashEscrow/ -import "src/contracts/core/SlashEscrow.sol"; -import "src/contracts/core/SlashEscrowFactory.sol"; - /// permissions/ import "src/contracts/permissions/PauserRegistry.sol"; import "src/contracts/permissions/PermissionController.sol"; @@ -96,10 +92,6 @@ library Env { return _envAddress("proxyAdmin"); } - function slashEscrowProxyAdmin() internal view returns (address) { - return _envAddress("slashEscrowProxyAdmin"); - } - function ethPOS() internal view returns (IETHPOSDeposit) { return IETHPOSDeposit(_envAddress("ethPOS")); } @@ -330,27 +322,6 @@ library Env { return StrategyFactory(_deployedImpl(type(StrategyFactory).name)); } - /** - * slashEscrow/ - */ - function slashEscrow( - DeployedImpl - ) internal view returns (SlashEscrow) { - return SlashEscrow(_deployedImpl(type(SlashEscrow).name)); - } - - function slashEscrowFactory( - DeployedProxy - ) internal view returns (SlashEscrowFactory) { - return SlashEscrowFactory(_deployedProxy(type(SlashEscrowFactory).name)); - } - - function slashEscrowFactory( - DeployedImpl - ) internal view returns (SlashEscrowFactory) { - return SlashEscrowFactory(_deployedImpl(type(SlashEscrowFactory).name)); - } - /** * token/ */ @@ -381,6 +352,14 @@ library Env { /** * Helpers */ + function isSourceChain() internal view returns (bool) { + return _envBool("SOURCE_CHAIN"); + } + + function isDestinationChain() internal view returns (bool) { + return _envBool("DESTINATION_CHAIN"); + } + function _deployedInstance(string memory name, uint256 idx) private view returns (address) { return ZEnvHelpers.state().deployedInstance(name, idx); } @@ -439,6 +418,12 @@ library Env { return ZEnvHelpers.state().envU16(key); } + function _envBool( + string memory key + ) private view returns (bool) { + return ZEnvHelpers.state().envBool(key); + } + address internal constant VM_ADDRESS = address(uint160(uint256(keccak256("hevm cheat code")))); Vm internal constant vm = Vm(VM_ADDRESS); diff --git a/script/releases/v1.6.0-moocow-and-elip5/1-deployContracts.s.sol b/script/releases/v1.6.0-moocow-and-elip5/1-deployContracts.s.sol index 7bf53e7049..a1fc0f62f3 100644 --- a/script/releases/v1.6.0-moocow-and-elip5/1-deployContracts.s.sol +++ b/script/releases/v1.6.0-moocow-and-elip5/1-deployContracts.s.sol @@ -18,7 +18,6 @@ contract Deploy is EOADeployer { function _runAsEOA() internal override { vm.startBroadcast(); - // We are upgrading 2 contracts: EigenPod and the Eigen token deployImpl({ name: type(EigenPod).name, @@ -133,15 +132,15 @@ contract Deploy is EOADeployer { return ProxyAdmin(Env.proxyAdmin()).getProxyAdmin(ITransparentUpgradeableProxy(proxy)); } - function _assertTrue(bool b, string memory err) private pure { + function _assertTrue(bool b, string memory err) internal pure { assertTrue(b, err); } - function _assertFalse(bool b, string memory err) private pure { + function _assertFalse(bool b, string memory err) internal pure { assertFalse(b, err); } - function _strEq(string memory a, string memory b) private pure returns (bool) { + function _strEq(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } diff --git a/script/releases/v1.6.0-moocow-and-elip5/2-queueUpgrade.s.sol b/script/releases/v1.6.0-moocow-and-elip5/2-queueUpgrade.s.sol index 83c814f5e7..bdc0f1bcf6 100644 --- a/script/releases/v1.6.0-moocow-and-elip5/2-queueUpgrade.s.sol +++ b/script/releases/v1.6.0-moocow-and-elip5/2-queueUpgrade.s.sol @@ -5,7 +5,7 @@ import {Deploy} from "./1-deployContracts.s.sol"; import "../Env.sol"; import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol"; -import "zeus-templates/utils/Encode.sol"; +import {MultisigCall, Encode} from "zeus-templates/utils/Encode.sol"; import {TimelockController} from "@openzeppelin/contracts/governance/TimelockController.sol"; diff --git a/script/releases/v1.6.0-moocow-and-elip5/3-executeUpgrade.s.sol b/script/releases/v1.6.0-moocow-and-elip5/3-executeUpgrade.s.sol index e126a6397b..15b54f98a7 100644 --- a/script/releases/v1.6.0-moocow-and-elip5/3-executeUpgrade.s.sol +++ b/script/releases/v1.6.0-moocow-and-elip5/3-executeUpgrade.s.sol @@ -3,94 +3,316 @@ pragma solidity ^0.8.12; import "../Env.sol"; import {QueueUpgrade} from "./2-queueUpgrade.s.sol"; +import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol"; +import "zeus-templates/utils/Encode.sol"; -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; - +/// @notice Executes the upgrade for redistribution v1.5.0 contract Execute is QueueUpgrade { using Env for *; + using Encode for *; function _runAsMultisig() internal override prank(Env.protocolCouncilMultisig()) { - bytes memory calldata_to_executor = _getCalldataToExecutor(); - + bytes memory calldata_to_executor_v1_5_queue = _getCalldataToExecutor_v1_5_queue(); TimelockController timelock = Env.timelockController(); - timelock.execute({ - target: Env.executorMultisig(), - value: 0, - payload: calldata_to_executor, - predecessor: 0, - salt: 0 + + if (_isMainnet()) { + timelock.execute({ + target: Env.executorMultisig(), + value: 0, + payload: calldata_to_executor_v1_5_queue, + predecessor: 0, + salt: 0 + }); + } + } + + /// @dev Get the calldata to be sent from the timelock to the executor + /// Copied over from v1.5.0 release script + function _getCalldataToExecutor_v1_5_queue() internal returns (bytes memory) { + MultisigCall[] storage executorCalls = Encode.newMultisigCalls().append({ + to: Env.proxyAdmin(), + data: Encode.proxyAdmin.upgrade({ + proxy: address(Env.proxy.delegationManager()), + impl: address(Env.impl.delegationManager()) + }) + }).append({ + to: Env.proxyAdmin(), + data: Encode.proxyAdmin.upgrade({ + proxy: address(Env.proxy.allocationManager()), + impl: address(Env.impl.allocationManager()) + }) + }).append({ + to: Env.proxyAdmin(), + data: Encode.proxyAdmin.upgrade({ + proxy: address(Env.proxy.strategyManager()), + impl: address(Env.impl.strategyManager()) + }) + }).append({ + to: Env.proxyAdmin(), + data: Encode.proxyAdmin.upgrade({ + proxy: address(Env.proxy.eigenPodManager()), + impl: address(Env.impl.eigenPodManager()) + }) + }).append({ + to: Env.proxyAdmin(), + data: Encode.proxyAdmin.upgrade({ + proxy: address(Env.proxy.eigenStrategy()), + impl: address(Env.impl.eigenStrategy()) + }) + }).append({ + to: address(Env.beacon.strategyBase()), + data: Encode.upgradeableBeacon.upgradeTo({newImpl: address(Env.impl.strategyBase())}) + }); + + // Add call to upgrade each pre-longtail strategy instance + uint256 count = Env.instance.strategyBaseTVLLimits_Count(); + for (uint256 i = 0; i < count; i++) { + address proxyInstance = address(Env.instance.strategyBaseTVLLimits(i)); + + executorCalls.append({ + to: Env.proxyAdmin(), + data: Encode.proxyAdmin.upgrade({proxy: proxyInstance, impl: address(Env.impl.strategyBaseTVLLimits())}) + }); + } + + return Encode.gnosisSafe.execTransaction({ + from: address(Env.timelockController()), + to: Env.multiSendCallOnly(), + op: Encode.Operation.DelegateCall, + data: Encode.multiSend(executorCalls) }); } function testScript() public virtual override { - runAsEOA(); + if (!_isMainnet()) { + return; + } TimelockController timelock = Env.timelockController(); - bytes memory calldata_to_executor = _getCalldataToExecutor(); - bytes32 txHash = timelock.hashOperation({ + bytes memory calldata_to_executor_v1_5_queue = _getCalldataToExecutor_v1_5_queue(); + bytes32 txHash_v1_5 = timelock.hashOperation({ target: Env.executorMultisig(), value: 0, - data: calldata_to_executor, + data: calldata_to_executor_v1_5_queue, predecessor: 0, salt: 0 }); + // 1 - Deploy. The contracts have been deployed in the redistro upgrade script - assertFalse(timelock.isOperationPending(txHash), "Transaction should NOT be queued."); + /// 2 - Queue. The contracts have been deployed in the redistribution upgrade script. + /// At the time of writing, the operation IS ready + assertEq(timelock.isOperationReady(txHash_v1_5), true, "v1.5 txn should be executable."); - // 1- run queueing logic - QueueUpgrade._runAsMultisig(); - _unsafeResetHasPranked(); // reset hasPranked so we can use it again + // 3 - execute + execute(); + assertTrue(timelock.isOperationDone(txHash_v1_5), "v1.5 txn should be complete."); - assertTrue(timelock.isOperationPending(txHash), "Transaction should be queued."); - assertFalse(timelock.isOperationReady(txHash), "Transaction should NOT be ready for execution."); - assertFalse(timelock.isOperationDone(txHash), "Transaction should NOT be complete."); + // 4. Validate + _validateNewImplAddresses_v1_5({areMatching: true}); + _validateProxyAdmins_v1_5(); + _validateProxyConstructors_v1_5(); + _validateProxiesInitialized_v1_5(); + } - // 2- warp past delay - vm.warp(block.timestamp + timelock.getMinDelay()); // 1 tick after ETA - assertEq(timelock.isOperationReady(txHash), true, "Transaction should be executable."); + /// @dev Validate that the `Env.impl` addresses are updated to be distinct from what the proxy + /// admin reports as the current implementation address. + /// + /// Note: The upgrade script can call this with `areMatching == true` to check that these impl + /// addresses _are_ matches. + /// Copied over from v1.5.0 release script + function _validateNewImplAddresses_v1_5( + bool areMatching + ) internal view { + function (bool, string memory) internal pure assertion = areMatching ? _assertTrue : _assertFalse; - // 3- execute - execute(); + // AllocationManager + assertion( + _getProxyImpl(address(Env.proxy.allocationManager())) == address(Env.impl.allocationManager()), + "allocationManager impl failed" + ); + + // DelegationManager + assertion( + _getProxyImpl(address(Env.proxy.delegationManager())) == address(Env.impl.delegationManager()), + "delegationManager impl failed" + ); + + // StrategyManager + assertion( + _getProxyImpl(address(Env.proxy.strategyManager())) == address(Env.impl.strategyManager()), + "strategyManager impl failed" + ); + + // EigenPodManager + assertion( + _getProxyImpl(address(Env.proxy.eigenPodManager())) == address(Env.impl.eigenPodManager()), + "eigenPodManager impl failed" + ); - assertTrue(timelock.isOperationDone(txHash), "Transaction should be complete."); + // Strategies + assertion( + _getProxyImpl(address(Env.proxy.eigenStrategy())) == address(Env.impl.eigenStrategy()), + "eigenStrategy impl failed" + ); - _validateNewImplAddresses({areMatching: true}); - _validateProxyAdmins(); - _validateProxyConstructors(); - _validateProxiesInitialized(); + assertion( + Env.beacon.strategyBase().implementation() == address(Env.impl.strategyBase()), "strategyBase impl failed" + ); + + uint256 count = Env.instance.strategyBaseTVLLimits_Count(); + for (uint256 i = 0; i < count; i++) { + assertion( + _getProxyImpl(address(Env.instance.strategyBaseTVLLimits(i))) + == address(Env.impl.strategyBaseTVLLimits()), + "strategyBaseTVLLimits impl failed" + ); + } + } + + /// @dev Ensure each deployed TUP/beacon is owned by the proxyAdmin/executorMultisig + /// Copied over from v1.5.0 release script + function _validateProxyAdmins_v1_5() internal view { + address pa = Env.proxyAdmin(); + + // AllocationManager + assertTrue( + _getProxyAdmin(address(Env.proxy.allocationManager())) == pa, "allocationManager proxyAdmin incorrect" + ); + + // DelegationManager + assertTrue( + _getProxyAdmin(address(Env.proxy.delegationManager())) == pa, "delegationManager proxyAdmin incorrect" + ); + + // StrategyManager + assertTrue(_getProxyAdmin(address(Env.proxy.strategyManager())) == pa, "strategyManager proxyAdmin incorrect"); + + // EigenPodManager + assertTrue(_getProxyAdmin(address(Env.proxy.eigenPodManager())) == pa, "eigenPodManager proxyAdmin incorrect"); + + // Strategies + assertTrue(_getProxyAdmin(address(Env.proxy.eigenStrategy())) == pa, "eigenStrategy proxyAdmin incorrect"); + + assertTrue(Env.beacon.strategyBase().owner() == Env.executorMultisig(), "strategyBase beacon owner incorrect"); + + uint256 count = Env.instance.strategyBaseTVLLimits_Count(); + for (uint256 i = 0; i < count; i++) { + assertTrue( + _getProxyAdmin(address(Env.instance.strategyBaseTVLLimits(i))) == pa, + "strategyBaseTVLLimits proxyAdmin incorrect" + ); + } } /// @dev Mirrors the checks done in 1-deployContracts, but now we check each contract's /// proxy, as the upgrade should mean that each proxy can see these methods/immutables - function _validateProxyConstructors() internal view { - { - UpgradeableBeacon eigenPodBeacon = Env.beacon.eigenPod(); - assertTrue(eigenPodBeacon.implementation() == address(Env.impl.eigenPod()), "eigenPodBeacon.impl invalid"); - - /// EigenPod - EigenPod eigenPod = Env.impl.eigenPod(); - assertTrue(eigenPod.ethPOS() == Env.ethPOS(), "ep.ethPOS invalid"); - assertTrue(eigenPod.eigenPodManager() == Env.proxy.eigenPodManager(), "ep.epm invalid"); - assertEq(eigenPod.version(), Env.deployVersion(), "ep.version failed"); - } + /// Copied over from v1.5.0 release script + function _validateProxyConstructors_v1_5() internal view { + AllocationManager allocationManager = Env.proxy.allocationManager(); + assertTrue(allocationManager.delegation() == Env.proxy.delegationManager(), "alm.dm invalid"); + assertTrue(allocationManager.eigenStrategy() == Env.proxy.eigenStrategy(), "alm.es invalid"); + assertTrue(allocationManager.pauserRegistry() == Env.impl.pauserRegistry(), "alm.pR invalid"); + assertTrue(allocationManager.permissionController() == Env.proxy.permissionController(), "alm.pc invalid"); + assertTrue(allocationManager.DEALLOCATION_DELAY() == Env.MIN_WITHDRAWAL_DELAY(), "alm.deallocDelay invalid"); + assertTrue( + allocationManager.ALLOCATION_CONFIGURATION_DELAY() == Env.ALLOCATION_CONFIGURATION_DELAY(), + "alm.configDelay invalid" + ); + + DelegationManager delegation = Env.proxy.delegationManager(); + assertTrue(delegation.strategyManager() == Env.proxy.strategyManager(), "dm.sm invalid"); + assertTrue(delegation.eigenPodManager() == Env.proxy.eigenPodManager(), "dm.epm invalid"); + assertTrue(delegation.allocationManager() == Env.proxy.allocationManager(), "dm.alm invalid"); + assertTrue(delegation.pauserRegistry() == Env.impl.pauserRegistry(), "dm.pR invalid"); + assertTrue(delegation.permissionController() == Env.proxy.permissionController(), "dm.pc invalid"); + assertTrue(delegation.minWithdrawalDelayBlocks() == Env.MIN_WITHDRAWAL_DELAY(), "dm.withdrawalDelay invalid"); - { - /// Eigen - Eigen eigen = Eigen(address(Env.proxy.eigen())); - assertTrue(address(eigen.bEIGEN()) == address(Env.proxy.beigen()), "eigen.beigen invalid"); - assertEq(eigen.version(), Env.deployVersion(), "eigen.version failed"); + StrategyManager strategyManager = Env.proxy.strategyManager(); + assertTrue(strategyManager.delegation() == Env.proxy.delegationManager(), "sm.dm invalid"); + assertTrue(strategyManager.pauserRegistry() == Env.impl.pauserRegistry(), "sm.pR invalid"); + + EigenPodManager eigenPodManager = Env.proxy.eigenPodManager(); + assertTrue(eigenPodManager.ethPOS() == Env.ethPOS(), "epm.ethPOS invalid"); + assertTrue(eigenPodManager.eigenPodBeacon() == Env.beacon.eigenPod(), "epm.epBeacon invalid"); + assertTrue(eigenPodManager.delegationManager() == Env.proxy.delegationManager(), "epm.dm invalid"); + assertTrue(eigenPodManager.pauserRegistry() == Env.impl.pauserRegistry(), "epm.pR invalid"); + + /// strategies/ + EigenStrategy eigenStrategy = Env.proxy.eigenStrategy(); + assertTrue(eigenStrategy.strategyManager() == Env.proxy.strategyManager(), "eigStrat.sm invalid"); + assertTrue(eigenStrategy.pauserRegistry() == Env.impl.pauserRegistry(), "eigStrat.pR invalid"); + + UpgradeableBeacon strategyBeacon = Env.beacon.strategyBase(); + assertTrue(strategyBeacon.implementation() == address(Env.impl.strategyBase()), "strategyBeacon.impl invalid"); + + uint256 count = Env.instance.strategyBaseTVLLimits_Count(); + for (uint256 i = 0; i < count; i++) { + StrategyBaseTVLLimits strategy = Env.instance.strategyBaseTVLLimits(i); + + assertTrue(strategy.strategyManager() == Env.proxy.strategyManager(), "sFact.sm invalid"); + assertTrue(strategy.pauserRegistry() == Env.impl.pauserRegistry(), "sFact.pR invalid"); } } /// @dev Call initialize on all proxies to ensure they are initialized /// Additionally, validate initialization variables - function _validateProxiesInitialized() internal { + /// Copied over from v1.5.0 release script + function _validateProxiesInitialized_v1_5() internal { bytes memory errInit = "Initializable: contract is already initialized"; - /// Eigen - Eigen eigen = Eigen(address(Env.proxy.eigen())); + AllocationManager allocationManager = Env.proxy.allocationManager(); + vm.expectRevert(errInit); + allocationManager.initialize(0); + assertTrue(allocationManager.paused() == 0, "alm.paused invalid"); + + DelegationManager delegation = Env.proxy.delegationManager(); vm.expectRevert(errInit); - eigen.initialize(address(0), new address[](0), new uint256[](0), new uint256[](0)); + delegation.initialize(0); + assertTrue(delegation.paused() == 0, "dm.paused invalid"); + + StrategyManager strategyManager = Env.proxy.strategyManager(); + vm.expectRevert(errInit); + strategyManager.initialize(address(0), address(0), 0); + assertTrue(strategyManager.owner() == Env.executorMultisig(), "sm.owner invalid"); + assertTrue(strategyManager.paused() == 0, "sm.paused invalid"); + assertTrue( + strategyManager.strategyWhitelister() == address(Env.proxy.strategyFactory()), "sm.whitelister invalid" + ); + + EigenPodManager eigenPodManager = Env.proxy.eigenPodManager(); + vm.expectRevert(errInit); + eigenPodManager.initialize(address(0), 0); + assertTrue(eigenPodManager.owner() == Env.executorMultisig(), "epm.owner invalid"); + // For sepolia, eigenpodmanager is paused + if (block.chainid != 11_155_111) { + assertTrue(eigenPodManager.paused() == 0, "epm.paused invalid"); + } else { + assertTrue(eigenPodManager.paused() == 487, "epm.paused invalid"); + } + + EigenStrategy eigenStrategy = Env.proxy.eigenStrategy(); + vm.expectRevert(errInit); + eigenStrategy.initialize(IEigen(address(0)), IBackingEigen(address(0))); + assertTrue(eigenStrategy.paused() == 0, "eigenStrat.paused invalid"); + assertTrue(address(eigenStrategy.EIGEN()) == address(Env.proxy.eigen()), "eigenStrat.EIGEN invalid"); + assertTrue(eigenStrategy.underlyingToken() == Env.proxy.beigen(), "eigenStrat.underlying invalid"); + + // StrategyBase proxies are initialized when deployed by factory + + uint256 count = Env.instance.strategyBaseTVLLimits_Count(); + for (uint256 i = 0; i < count; i++) { + StrategyBaseTVLLimits strategy = Env.instance.strategyBaseTVLLimits(i); + + emit log_named_address("strat", address(strategy)); + + vm.expectRevert(errInit); + strategy.initialize(0, 0, IERC20(address(0))); + assertTrue(strategy.maxPerDeposit() == type(uint256).max, "stratTVLLim.maxPerDeposit invalid"); + assertTrue(strategy.maxTotalDeposits() == type(uint256).max, "stratTVLLim.maxPerDeposit invalid"); + } + } + + function _isMainnet() internal view returns (bool) { + return _strEq(Env.env(), "mainnet"); } } diff --git a/script/releases/v1.6.0-moocow-and-elip5/4-executeMoocow.s.sol b/script/releases/v1.6.0-moocow-and-elip5/4-executeMoocow.s.sol new file mode 100644 index 0000000000..1098bef5c7 --- /dev/null +++ b/script/releases/v1.6.0-moocow-and-elip5/4-executeMoocow.s.sol @@ -0,0 +1,98 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.12; + +import "../Env.sol"; +import {QueueUpgrade} from "./2-queueUpgrade.s.sol"; +import {MultisigBuilder} from "zeus-templates/templates/MultisigBuilder.sol"; +import "zeus-templates/utils/Encode.sol"; + +/// @notice Executes the Moocow upgrade +contract Execute is QueueUpgrade { + using Env for *; + using Encode for *; + + function _runAsMultisig() internal override prank(Env.protocolCouncilMultisig()) { + bytes memory calldata_to_executor_v1_6_queue = _getCalldataToExecutor(); + TimelockController timelock = Env.timelockController(); + + timelock.execute({ + target: Env.executorMultisig(), + value: 0, + payload: calldata_to_executor_v1_6_queue, + predecessor: 0, + salt: 0 + }); + } + + function testScript() public virtual override { + runAsEOA(); + + TimelockController timelock = Env.timelockController(); + + bytes memory calldata_to_executor = _getCalldataToExecutor(); + bytes32 txHash = timelock.hashOperation({ + target: Env.executorMultisig(), + value: 0, + data: calldata_to_executor, + predecessor: 0, + salt: 0 + }); + assertFalse(timelock.isOperationPending(txHash), "Transaction should NOT be queued."); + + // 1- run queueing logic + QueueUpgrade._runAsMultisig(); + _unsafeResetHasPranked(); // reset hasPranked so we can use it again + + assertTrue(timelock.isOperationPending(txHash), "Transaction should be queued."); + assertFalse(timelock.isOperationReady(txHash), "Transaction should NOT be ready for execution."); + assertFalse(timelock.isOperationDone(txHash), "Transaction should NOT be complete."); + + // 2- warp past delay + vm.warp(block.timestamp + timelock.getMinDelay()); // 1 tick after ETA + assertEq(timelock.isOperationReady(txHash), true, "Transaction should be executable."); + + // 3- execute + execute(); + + assertTrue(timelock.isOperationDone(txHash), "Transaction should be complete."); + + // 4 - Validate + _validateNewImplAddresses({areMatching: true}); + _validateProxyAdmins(); + _validateProxyConstructors(); + _validateProxiesInitialized(); + } + + /// @dev Mirrors the checks done in 1-deployContracts, but now we check each contract's + /// proxy, as the upgrade should mean that each proxy can see these methods/immutables + function _validateProxyConstructors() internal view { + { + UpgradeableBeacon eigenPodBeacon = Env.beacon.eigenPod(); + assertTrue(eigenPodBeacon.implementation() == address(Env.impl.eigenPod()), "eigenPodBeacon.impl invalid"); + + /// EigenPod + EigenPod eigenPod = Env.impl.eigenPod(); + assertTrue(eigenPod.ethPOS() == Env.ethPOS(), "ep.ethPOS invalid"); + assertTrue(eigenPod.eigenPodManager() == Env.proxy.eigenPodManager(), "ep.epm invalid"); + assertEq(eigenPod.version(), Env.deployVersion(), "ep.version failed"); + } + + { + /// Eigen + Eigen eigen = Eigen(address(Env.proxy.eigen())); + assertTrue(address(eigen.bEIGEN()) == address(Env.proxy.beigen()), "eigen.beigen invalid"); + assertEq(eigen.version(), Env.deployVersion(), "eigen.version failed"); + } + } + + /// @dev Call initialize on all proxies to ensure they are initialized + /// Additionally, validate initialization variables + function _validateProxiesInitialized() internal { + bytes memory errInit = "Initializable: contract is already initialized"; + + /// Eigen + Eigen eigen = Eigen(address(Env.proxy.eigen())); + vm.expectRevert(errInit); + eigen.initialize(address(0), new address[](0), new uint256[](0), new uint256[](0)); + } +} diff --git a/script/releases/v1.6.0-moocow-and-elip5/upgrade.json b/script/releases/v1.6.0-moocow-and-elip5/upgrade.json index a3414186c4..791dc96d35 100644 --- a/script/releases/v1.6.0-moocow-and-elip5/upgrade.json +++ b/script/releases/v1.6.0-moocow-and-elip5/upgrade.json @@ -14,6 +14,10 @@ { "type": "multisig", "filename": "3-executeUpgrade.s.sol" + }, + { + "type": "multisig", + "filename": "4-executeMoocow.s.sol" } ] } \ No newline at end of file diff --git a/script/utils/ExistingDeploymentParser.sol b/script/utils/ExistingDeploymentParser.sol index 929f10dba9..5d46763f7e 100644 --- a/script/utils/ExistingDeploymentParser.sol +++ b/script/utils/ExistingDeploymentParser.sol @@ -11,8 +11,6 @@ import "../../src/contracts/core/AVSDirectory.sol"; import "../../src/contracts/core/RewardsCoordinator.sol"; import "../../src/contracts/core/AllocationManager.sol"; import "../../src/contracts/permissions/PermissionController.sol"; -import "../../src/contracts/core/SlashEscrowFactory.sol"; -import "../../src/contracts/core/SlashEscrow.sol"; import "../../src/contracts/strategies/StrategyFactory.sol"; import "../../src/contracts/strategies/StrategyBase.sol"; @@ -137,10 +135,6 @@ contract ExistingDeploymentParser is Script, Logger { StrategyBase public baseStrategyImplementation; StrategyBase public strategyFactoryBeaconImplementation; - /// @dev SlashEscrowFactory - SlashEscrowFactory public slashEscrowFactory; - SlashEscrowFactory public slashEscrowFactoryImplementation; - // Token ProxyAdmin public tokenProxyAdmin; IEigen public EIGEN; diff --git a/src/contracts/core/AllocationManager.sol b/src/contracts/core/AllocationManager.sol index 18e66a0ff8..44aedf268b 100644 --- a/src/contracts/core/AllocationManager.sol +++ b/src/contracts/core/AllocationManager.sol @@ -38,13 +38,14 @@ contract AllocationManager is */ constructor( IDelegationManager _delegation, + IStrategy _eigenStrategy, IPauserRegistry _pauserRegistry, IPermissionController _permissionController, uint32 _DEALLOCATION_DELAY, uint32 _ALLOCATION_CONFIGURATION_DELAY, string memory _version ) - AllocationManagerStorage(_delegation, _DEALLOCATION_DELAY, _ALLOCATION_CONFIGURATION_DELAY) + AllocationManagerStorage(_delegation, _eigenStrategy, _DEALLOCATION_DELAY, _ALLOCATION_CONFIGURATION_DELAY) Pausable(_pauserRegistry) PermissionControllerMixin(_permissionController) SemVerMixin(_version) @@ -275,8 +276,10 @@ contract AllocationManager is require(params.length == redistributionRecipients.length, InputArrayLengthMismatch()); require(_avsRegisteredMetadata[avs], NonexistentAVSMetadata()); for (uint256 i = 0; i < params.length; i++) { - require(redistributionRecipients[i] != address(0), InputAddressZero()); - _createOperatorSet(avs, params[i], redistributionRecipients[i]); + address recipient = redistributionRecipients[i]; + require(recipient != address(0), InputAddressZero()); + require(recipient != DEFAULT_BURN_ADDRESS, InvalidRedistributionRecipient()); + _createOperatorSet(avs, params[i], recipient); } } @@ -288,6 +291,7 @@ contract AllocationManager is ) external checkCanCall(avs) { OperatorSet memory operatorSet = OperatorSet(avs, operatorSetId); require(_operatorSets[avs].contains(operatorSet.id), InvalidOperatorSet()); + for (uint256 i = 0; i < strategies.length; i++) { _addStrategyToOperatorSet( operatorSet, strategies[i], isRedistributingOperatorSet(OperatorSet(avs, operatorSetId)) @@ -421,9 +425,9 @@ contract AllocationManager is IStrategy strategy, bool isRedistributing ) internal { - // We do not currently support redistributing beaconchain ETH. + // We do not currently support redistributing beaconchain ETH or EIGEN. if (isRedistributing) { - require(strategy != BEACONCHAIN_ETH_STRAT, InvalidStrategy()); + require(strategy != BEACONCHAIN_ETH_STRAT && strategy != eigenStrategy, InvalidStrategy()); } require(_operatorSetStrategies[operatorSet.key()].add(address(strategy)), StrategyAlreadyInOperatorSet()); diff --git a/src/contracts/core/AllocationManagerStorage.sol b/src/contracts/core/AllocationManagerStorage.sol index ee23ef0adc..c87c6f1bb5 100644 --- a/src/contracts/core/AllocationManagerStorage.sol +++ b/src/contracts/core/AllocationManagerStorage.sol @@ -33,6 +33,10 @@ abstract contract AllocationManagerStorage is IAllocationManager { /// @notice The DelegationManager contract for EigenLayer IDelegationManager public immutable delegation; + /// @notice The Eigen strategy contract + /// @dev Cannot be added to redistributing operator sets + IStrategy public immutable eigenStrategy; + /// @notice Delay before deallocations are clearable and can be added back into freeMagnitude /// In this window, deallocations still remain slashable by the operatorSet they were allocated to. uint32 public immutable DEALLOCATION_DELAY; @@ -111,8 +115,14 @@ abstract contract AllocationManagerStorage is IAllocationManager { // Construction - constructor(IDelegationManager _delegation, uint32 _DEALLOCATION_DELAY, uint32 _ALLOCATION_CONFIGURATION_DELAY) { + constructor( + IDelegationManager _delegation, + IStrategy _eigenStrategy, + uint32 _DEALLOCATION_DELAY, + uint32 _ALLOCATION_CONFIGURATION_DELAY + ) { delegation = _delegation; + eigenStrategy = _eigenStrategy; DEALLOCATION_DELAY = _DEALLOCATION_DELAY; ALLOCATION_CONFIGURATION_DELAY = _ALLOCATION_CONFIGURATION_DELAY; } diff --git a/src/contracts/core/SlashEscrow.sol b/src/contracts/core/SlashEscrow.sol deleted file mode 100644 index e85877228e..0000000000 --- a/src/contracts/core/SlashEscrow.sol +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "@openzeppelin-upgrades/contracts/proxy/ClonesUpgradeable.sol"; -import "../interfaces/ISlashEscrow.sol"; -import "../interfaces/ISlashEscrowFactory.sol"; - -contract SlashEscrow is ISlashEscrow { - using OperatorSetLib for *; - using SafeERC20 for IERC20; - - /// @inheritdoc ISlashEscrow - function releaseTokens( - ISlashEscrowFactory slashEscrowFactory, - ISlashEscrow slashEscrowImplementation, - OperatorSet calldata operatorSet, - uint256 slashId, - address recipient, - IStrategy strategy - ) external { - // Assert that the deployment parameters are valid by validating against the address of this proxy. - require( - verifyDeploymentParameters(slashEscrowFactory, slashEscrowImplementation, operatorSet, slashId), - InvalidDeploymentParameters() - ); - - // Assert that the caller is the slash escrow factory. - require(msg.sender == address(slashEscrowFactory), OnlySlashEscrowFactory()); - - // Burn or redistribute the underlying tokens. - IERC20 underlyingToken = strategy.underlyingToken(); - underlyingToken.safeTransfer(recipient, underlyingToken.balanceOf(address(this))); - } - - /// @inheritdoc ISlashEscrow - function verifyDeploymentParameters( - ISlashEscrowFactory slashEscrowFactory, - ISlashEscrow slashEscrowImplementation, - OperatorSet calldata operatorSet, - uint256 slashId - ) public view returns (bool) { - return ClonesUpgradeable.predictDeterministicAddress( - address(slashEscrowImplementation), - keccak256(abi.encodePacked(operatorSet.key(), slashId)), - address(slashEscrowFactory) - ) == address(this); - } -} diff --git a/src/contracts/core/SlashEscrowFactory.sol b/src/contracts/core/SlashEscrowFactory.sol deleted file mode 100644 index 1d5b1e4d3f..0000000000 --- a/src/contracts/core/SlashEscrowFactory.sol +++ /dev/null @@ -1,484 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; -import "@openzeppelin-upgrades/contracts/proxy/ClonesUpgradeable.sol"; -import "@openzeppelin-upgrades/contracts/proxy/utils/Initializable.sol"; -import "@openzeppelin-upgrades/contracts/access/OwnableUpgradeable.sol"; -import "../permissions/Pausable.sol"; -import "../mixins/SemVerMixin.sol"; -import "./SlashEscrowFactoryStorage.sol"; - -contract SlashEscrowFactory is Initializable, SlashEscrowFactoryStorage, OwnableUpgradeable, Pausable, SemVerMixin { - using SafeERC20 for IERC20; - using OperatorSetLib for *; - using EnumerableSet for *; - using ClonesUpgradeable for address; - - modifier onlyStrategyManager() { - require(msg.sender == address(strategyManager), OnlyStrategyManager()); - _; - } - - /** - * - * INITIALIZATION - * - */ - constructor( - IAllocationManager _allocationManager, - IStrategyManager _strategyManager, - IPauserRegistry _pauserRegistry, - ISlashEscrow _slashEscrowImplementation, - string memory _version - ) - SlashEscrowFactoryStorage(_allocationManager, _strategyManager, _slashEscrowImplementation) - Pausable(_pauserRegistry) - SemVerMixin(_version) - { - _disableInitializers(); - } - - /// @inheritdoc ISlashEscrowFactory - function initialize( - address initialOwner, - uint256 initialPausedStatus, - uint32 initialGlobalDelayBlocks - ) external initializer { - _transferOwnership(initialOwner); - _setPausedStatus(initialPausedStatus); - _setGlobalEscrowDelay(initialGlobalDelayBlocks); - } - - /** - * - * ACTIONS - * - */ - - /// @inheritdoc ISlashEscrowFactory - function initiateSlashEscrow( - OperatorSet calldata operatorSet, - uint256 slashId, - IStrategy strategy - ) external onlyStrategyManager { - // Create storage pointers for readability. - EnumerableSet.UintSet storage pendingSlashIds = _pendingSlashIds[operatorSet.key()]; - EnumerableSet.AddressSet storage pendingStrategiesForSlashId = - _pendingStrategiesForSlashId[operatorSet.key()][slashId]; - - // Note: Since this function can be called multiple times for the same operatorSet/slashId, we check - // if the slash escrow is already deployed. If it is not, we deploy it and update the pending mappings. - if (!isDeployedSlashEscrow(operatorSet, slashId)) { - // Deploy the `SlashEscrow`. - _deploySlashEscrow(operatorSet, slashId); - - // Update the pending mappings - _pendingOperatorSets.add(operatorSet.key()); - pendingSlashIds.add(slashId); - - // Set the start block for the slash ID. - _slashIdToStartBlock[operatorSet.key()][slashId] = uint32(block.number); - } - - // Add the strategy to the pending strategies for the slash ID. - pendingStrategiesForSlashId.add(address(strategy)); - - // Emit the start escrow event. We can use the block.number here because all strategies - // in a given operatorSet/slashId will have their escrow initiated in the same transaction. - emit StartEscrow(operatorSet, slashId, strategy, uint32(block.number)); - } - - /// @inheritdoc ISlashEscrowFactory - function releaseSlashEscrow( - OperatorSet calldata operatorSet, - uint256 slashId - ) external onlyWhenNotPaused(PAUSED_RELEASE_ESCROW) { - address redistributionRecipient = allocationManager.getRedistributionRecipient(operatorSet); - - _checkReleaseSlashEscrow(operatorSet, slashId, redistributionRecipient); - - // Calling `clearBurnOrRedistributableShares` will transfer the underlying tokens to the `SlashEscrow`. - // NOTE: While `clearBurnOrRedistributableShares` may have already been called, we call it again to ensure that the - // underlying tokens are actually in escrow before processing and removing storage (which would otherwise prevent - // the tokens from being released). - strategyManager.clearBurnOrRedistributableShares(operatorSet, slashId); - - // Process the slash escrow for each strategy. - address[] memory strategies = _pendingStrategiesForSlashId[operatorSet.key()][slashId].values(); - for (uint256 i = 0; i < strategies.length; ++i) { - _processSlashEscrowByStrategy({ - operatorSet: operatorSet, - slashId: slashId, - slashEscrow: getSlashEscrow(operatorSet, slashId), - redistributionRecipient: redistributionRecipient, - strategy: IStrategy(strategies[i]) - }); - } - - // Update the slash escrow storage. - _updateSlashEscrowStorage(operatorSet, slashId); - } - - /// @inheritdoc ISlashEscrowFactory - function releaseSlashEscrowByStrategy( - OperatorSet calldata operatorSet, - uint256 slashId, - IStrategy strategy - ) external virtual onlyWhenNotPaused(PAUSED_RELEASE_ESCROW) { - address redistributionRecipient = allocationManager.getRedistributionRecipient(operatorSet); - - _checkReleaseSlashEscrow(operatorSet, slashId, redistributionRecipient); - - // Calling `clearBurnOrRedistributableSharesByStrategy` will transfer the underlying tokens to the `SlashEscrow`. - // NOTE: While the strategy may have already been cleared, we call it again to ensure that the - // underlying tokens are actually in escrow before processing and removing storage (which would otherwise prevent - // the tokens from being released). - strategyManager.clearBurnOrRedistributableSharesByStrategy(operatorSet, slashId, strategy); - - // Release the slashEscrow. - _processSlashEscrowByStrategy({ - operatorSet: operatorSet, - slashId: slashId, - slashEscrow: getSlashEscrow(operatorSet, slashId), - redistributionRecipient: redistributionRecipient, - strategy: strategy - }); - - // Update the slash escrow storage. - _updateSlashEscrowStorage(operatorSet, slashId); - } - - /** - * - * PAUSER/UNPAUSER ACTIONS - * - */ - - /// @inheritdoc ISlashEscrowFactory - function pauseEscrow(OperatorSet calldata operatorSet, uint256 slashId) external virtual onlyPauser { - require(!_paused[operatorSet.key()][slashId], IPausable.InvalidNewPausedStatus()); - _paused[operatorSet.key()][slashId] = true; - emit EscrowPaused(operatorSet, slashId); - } - - /// @inheritdoc ISlashEscrowFactory - function unpauseEscrow(OperatorSet calldata operatorSet, uint256 slashId) external virtual onlyUnpauser { - require(_paused[operatorSet.key()][slashId], IPausable.InvalidNewPausedStatus()); - _paused[operatorSet.key()][slashId] = false; - emit EscrowUnpaused(operatorSet, slashId); - } - - /** - * - * OWNER ACTIONS - * - */ - - /// @inheritdoc ISlashEscrowFactory - function setGlobalEscrowDelay( - uint32 delay - ) external onlyOwner { - _setGlobalEscrowDelay(delay); - } - - /// @inheritdoc ISlashEscrowFactory - function setStrategyEscrowDelay(IStrategy strategy, uint32 delay) external onlyOwner { - _strategyEscrowDelayBlocks[address(strategy)] = delay; - emit StrategyEscrowDelaySet(strategy, delay); - } - - /** - * - * HELPERS - * - */ - - /// @notice Checks that the slash escrow can be released. - function _checkReleaseSlashEscrow( - OperatorSet calldata operatorSet, - uint256 slashId, - address redistributionRecipient - ) internal view { - // If the redistribution recipient is not the default burn address... - if (redistributionRecipient != DEFAULT_BURN_ADDRESS) { - require(msg.sender == redistributionRecipient, OnlyRedistributionRecipient()); - } - - // Assert that the slash ID is not paused - require(!isEscrowPaused(operatorSet, slashId), IPausable.CurrentlyPaused()); - - // Assert that the escrow delay has elapsed - // `getEscrowCompleteBlock` returns the block number at which the escrow can be released, so - // we require that the current block number is greater than OR equal to the complete block. - require(block.number >= getEscrowCompleteBlock(operatorSet, slashId), EscrowDelayNotElapsed()); - } - - /// @notice Processes the slash escrow for a single strategy. - function _processSlashEscrowByStrategy( - OperatorSet calldata operatorSet, - uint256 slashId, - ISlashEscrow slashEscrow, - address redistributionRecipient, - IStrategy strategy - ) internal { - // Create storage pointer for readability. - EnumerableSet.AddressSet storage pendingStrategiesForSlashId = - _pendingStrategiesForSlashId[operatorSet.key()][slashId]; - - // Burn or redistribute the underlying tokens for the strategy. - slashEscrow.releaseTokens({ - slashEscrowFactory: ISlashEscrowFactory(address(this)), - slashEscrowImplementation: slashEscrowImplementation, - operatorSet: operatorSet, - slashId: slashId, - recipient: redistributionRecipient, - strategy: strategy - }); - - // Remove the strategy and underlying amount from the pending strategies escrow map. - pendingStrategiesForSlashId.remove(address(strategy)); - emit EscrowComplete(operatorSet, slashId, strategy, redistributionRecipient); - } - - function _updateSlashEscrowStorage(OperatorSet calldata operatorSet, uint256 slashId) internal { - // Create storage pointers for readability. - EnumerableSet.Bytes32Set storage pendingOperatorSets = _pendingOperatorSets; - EnumerableSet.UintSet storage pendingSlashIds = _pendingSlashIds[operatorSet.key()]; - uint256 totalPendingForSlashId = _pendingStrategiesForSlashId[operatorSet.key()][slashId].length(); - - // If there are no more strategies to process, remove the slash ID from the pending slash IDs set. - if (totalPendingForSlashId == 0) { - pendingSlashIds.remove(slashId); - - // Delete the start block for the slash ID. - delete _slashIdToStartBlock[operatorSet.key()][slashId]; - - // If there are no more slash IDs for the operator set, remove the operator set from the pending operator sets set. - if (pendingSlashIds.length() == 0) { - pendingOperatorSets.remove(operatorSet.key()); - } - } - } - - /// @notice Sets the global escrow delay. - function _setGlobalEscrowDelay( - uint32 delay - ) internal { - _globalEscrowDelayBlocks = delay; - emit GlobalEscrowDelaySet(delay); - } - - /** - * @notice Deploys a `SlashEscrow` - * @param operatorSet The operator set whose slash escrow is being deployed. - * @param slashId The slash ID of the slash escrow that is being deployed. - * @dev The slash escrow is deployed in `initiateSlashEscrow` - */ - function _deploySlashEscrow(OperatorSet calldata operatorSet, uint256 slashId) internal { - address(slashEscrowImplementation).cloneDeterministic(computeSlashEscrowSalt(operatorSet, slashId)); - } - - /** - * - * GETTERS - * - */ - - /// @inheritdoc ISlashEscrowFactory - function getPendingOperatorSets() public view returns (OperatorSet[] memory operatorSets) { - bytes32[] memory operatorSetKeys = _pendingOperatorSets.values(); - - operatorSets = new OperatorSet[](operatorSetKeys.length); - - for (uint256 i = 0; i < operatorSetKeys.length; ++i) { - operatorSets[i] = operatorSetKeys[i].decode(); - } - - return operatorSets; - } - - /// @inheritdoc ISlashEscrowFactory - function getTotalPendingOperatorSets() external view returns (uint256) { - return _pendingOperatorSets.length(); - } - - /// @inheritdoc ISlashEscrowFactory - function isPendingOperatorSet( - OperatorSet calldata operatorSet - ) external view returns (bool) { - return _pendingOperatorSets.contains(operatorSet.key()); - } - - /// @inheritdoc ISlashEscrowFactory - function getPendingSlashIds( - OperatorSet memory operatorSet - ) public view returns (uint256[] memory) { - return _pendingSlashIds[operatorSet.key()].values(); - } - - /// @inheritdoc ISlashEscrowFactory - function getTotalPendingSlashIds( - OperatorSet calldata operatorSet - ) external view returns (uint256) { - return _pendingSlashIds[operatorSet.key()].length(); - } - - /// @inheritdoc ISlashEscrowFactory - function getPendingEscrows() - external - view - returns ( - OperatorSet[] memory operatorSets, - bool[] memory isRedistributing, - uint256[][] memory slashIds, - uint32[][] memory completeBlocks - ) - { - operatorSets = getPendingOperatorSets(); - isRedistributing = new bool[](operatorSets.length); - slashIds = new uint256[][](operatorSets.length); - completeBlocks = new uint32[][](operatorSets.length); - - // Populate all arrays. - for (uint256 i = 0; i < operatorSets.length; i++) { - // Get whether the operator set is redistributing. - isRedistributing[i] = allocationManager.isRedistributingOperatorSet(operatorSets[i]); - - // Get the pending slash IDs for the operator set. - slashIds[i] = getPendingSlashIds(operatorSets[i]); - - // For each slashId, get the complete block. - completeBlocks[i] = new uint32[](slashIds[i].length); - for (uint256 j = 0; j < slashIds[i].length; j++) { - completeBlocks[i][j] = getEscrowCompleteBlock(operatorSets[i], slashIds[i][j]); - } - } - } - - /// @inheritdoc ISlashEscrowFactory - function isPendingSlashId(OperatorSet calldata operatorSet, uint256 slashId) external view returns (bool) { - return _pendingSlashIds[operatorSet.key()].contains(slashId); - } - - /// @inheritdoc ISlashEscrowFactory - function getPendingStrategiesForSlashId( - OperatorSet memory operatorSet, - uint256 slashId - ) public view returns (IStrategy[] memory strategies) { - EnumerableSet.AddressSet storage pendingStrategiesForSlashId = - _pendingStrategiesForSlashId[operatorSet.key()][slashId]; - - uint256 length = pendingStrategiesForSlashId.length(); - - strategies = new IStrategy[](length); - - for (uint256 i = 0; i < length; ++i) { - address strategy = pendingStrategiesForSlashId.at(i); - - strategies[i] = IStrategy(strategy); - } - } - - /// @inheritdoc ISlashEscrowFactory - function getPendingStrategiesForSlashIds( - OperatorSet memory operatorSet - ) public view returns (IStrategy[][] memory strategies) { - EnumerableSet.UintSet storage pendingSlashIds = _pendingSlashIds[operatorSet.key()]; - - uint256 length = pendingSlashIds.length(); - - strategies = new IStrategy[][](length); - - for (uint256 i = 0; i < length; ++i) { - strategies[i] = getPendingStrategiesForSlashId(operatorSet, pendingSlashIds.at(i)); - } - } - - /// @inheritdoc ISlashEscrowFactory - function getTotalPendingStrategiesForSlashId( - OperatorSet calldata operatorSet, - uint256 slashId - ) external view returns (uint256) { - return _pendingStrategiesForSlashId[operatorSet.key()][slashId].length(); - } - - /// @inheritdoc ISlashEscrowFactory - function getPendingUnderlyingAmountForStrategy( - OperatorSet calldata operatorSet, - uint256 slashId, - IStrategy strategy - ) external view returns (uint256) { - return strategy.underlyingToken().balanceOf(address(getSlashEscrow(operatorSet, slashId))); - } - - /// @inheritdoc ISlashEscrowFactory - function isEscrowPaused(OperatorSet calldata operatorSet, uint256 slashId) public view returns (bool) { - return _paused[operatorSet.key()][slashId] || paused(PAUSED_RELEASE_ESCROW); - } - - /// @inheritdoc ISlashEscrowFactory - function getEscrowStartBlock(OperatorSet memory operatorSet, uint256 slashId) public view returns (uint256) { - return _slashIdToStartBlock[operatorSet.key()][slashId]; - } - - /// @inheritdoc ISlashEscrowFactory - function getEscrowCompleteBlock(OperatorSet memory operatorSet, uint256 slashId) public view returns (uint32) { - IStrategy[] memory strategies = getPendingStrategiesForSlashId(operatorSet, slashId); - - // Loop through all strategies and return the max delay - uint32 maxStrategyDelay; - for (uint256 i = 0; i < strategies.length; ++i) { - uint32 delay = getStrategyEscrowDelay(IStrategy(address(strategies[i]))); - if (delay > maxStrategyDelay) { - maxStrategyDelay = delay; - } - } - - // The escrow can be released once the max strategy delay has elapsed. - return uint32(getEscrowStartBlock(operatorSet, slashId) + maxStrategyDelay + 1); - } - - /// @inheritdoc ISlashEscrowFactory - function getStrategyEscrowDelay( - IStrategy strategy - ) public view returns (uint32) { - uint32 globalDelay = _globalEscrowDelayBlocks; - uint32 strategyDelay = _strategyEscrowDelayBlocks[address(strategy)]; - - // Return whichever delay is greater. - return strategyDelay > globalDelay ? strategyDelay : globalDelay; - } - - /// @inheritdoc ISlashEscrowFactory - function getGlobalEscrowDelay() external view returns (uint32) { - return _globalEscrowDelayBlocks; - } - - /// @inheritdoc ISlashEscrowFactory - function computeSlashEscrowSalt(OperatorSet calldata operatorSet, uint256 slashId) public pure returns (bytes32) { - return keccak256(abi.encodePacked(operatorSet.key(), slashId)); - } - - /// @inheritdoc ISlashEscrowFactory - function isDeployedSlashEscrow(OperatorSet calldata operatorSet, uint256 slashId) public view returns (bool) { - return isDeployedSlashEscrow(getSlashEscrow(operatorSet, slashId)); - } - - /// @inheritdoc ISlashEscrowFactory - function isDeployedSlashEscrow( - ISlashEscrow slashEscrow - ) public view returns (bool) { - return address(slashEscrow).code.length != 0; - } - - /// @inheritdoc ISlashEscrowFactory - function getSlashEscrow(OperatorSet calldata operatorSet, uint256 slashId) public view returns (ISlashEscrow) { - return ISlashEscrow( - address(slashEscrowImplementation).predictDeterministicAddress({ - salt: computeSlashEscrowSalt(operatorSet, slashId), - deployer: address(this) - }) - ); - } -} diff --git a/src/contracts/core/SlashEscrowFactoryStorage.sol b/src/contracts/core/SlashEscrowFactoryStorage.sol deleted file mode 100644 index 947dff988c..0000000000 --- a/src/contracts/core/SlashEscrowFactoryStorage.sol +++ /dev/null @@ -1,75 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; -import "../interfaces/ISlashEscrowFactory.sol"; -import "../interfaces/IAllocationManager.sol"; -import "../interfaces/IStrategyManager.sol"; -import "../interfaces/IStrategy.sol"; -import "../interfaces/ISlashEscrow.sol"; - -abstract contract SlashEscrowFactoryStorage is ISlashEscrowFactory { - // Constants - - /// @dev The default burn address for slashed funds. - address internal constant DEFAULT_BURN_ADDRESS = 0x00000000000000000000000000000000000E16E4; - - /// @notice The pause status for the `releaseSlashEscrow` function. - /// @dev Allows all escrow outflows to be temporarily halted. - uint8 internal constant PAUSED_RELEASE_ESCROW = 0; - - // Immutable Storage - - /// @notice Returns the EigenLayer `AllocationManager` address. - IAllocationManager public immutable allocationManager; - - /// @notice Returns the EigenLayer `StrategyManager` address. - IStrategyManager public immutable strategyManager; - - /// @notice Returns the implementation contract for the slash escrow. - /// @dev This value should not be changed on future upgrades. - ISlashEscrow public immutable slashEscrowImplementation; - - // Mutable Storage - - /// @dev Returns a list of operator sets that have pending slash IDs. - EnumerableSet.Bytes32Set internal _pendingOperatorSets; - - /// @dev Returns a list of pending slash IDs for a given operator set. - mapping(bytes32 operatorSetKey => EnumerableSet.UintSet) internal _pendingSlashIds; - - /// @dev Returns an enumerable mapping of strategies to their underlying amounts for a given slash ID. - mapping(bytes32 operatorSetKey => mapping(uint256 slashId => EnumerableSet.AddressSet)) internal - _pendingStrategiesForSlashId; - - /// @dev Returns the start block for a given slash ID. - mapping(bytes32 operatorSetKey => mapping(uint256 slashId => uint32 startBlock)) internal _slashIdToStartBlock; - - /// @notice Returns the paused status for a given operator set and slash ID. - mapping(bytes32 operatorSetKey => mapping(uint256 slashId => bool paused)) internal _paused; - - /// @dev Returns the global escrow delay for all strategies. - uint32 internal _globalEscrowDelayBlocks; - - /// @dev Returns the escrow delay for a given strategy. - mapping(address strategy => uint32 delay) internal _strategyEscrowDelayBlocks; - - // Constructor - - constructor( - IAllocationManager _allocationManager, - IStrategyManager _strategyManager, - ISlashEscrow _slashEscrowImplementation - ) { - allocationManager = _allocationManager; - strategyManager = _strategyManager; - slashEscrowImplementation = _slashEscrowImplementation; - } - - /** - * @dev This empty reserved space is put in place to allow future versions to add new - * variables without shifting down storage in the inheritance chain. - * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps - */ - uint256[42] private __gap; -} diff --git a/src/contracts/core/StrategyManager.sol b/src/contracts/core/StrategyManager.sol index 5ef6416b36..02f6717ea7 100644 --- a/src/contracts/core/StrategyManager.sol +++ b/src/contracts/core/StrategyManager.sol @@ -28,9 +28,12 @@ contract StrategyManager is StrategyManagerStorage, SignatureUtilsMixin { + using OperatorSetLib for *; using SlashingLib for *; using SafeERC20 for IERC20; using EnumerableMap for EnumerableMap.AddressToUintMap; + using EnumerableSet for EnumerableSet.Bytes32Set; + using EnumerableSet for EnumerableSet.UintSet; modifier onlyStrategyWhitelister() { require(msg.sender == strategyWhitelister, OnlyStrategyWhitelister()); @@ -53,15 +56,11 @@ contract StrategyManager is * @param _delegation The delegation contract of EigenLayer. */ constructor( + IAllocationManager _allocationManager, IDelegationManager _delegation, - ISlashEscrowFactory _slashEscrowFactory, IPauserRegistry _pauserRegistry, string memory _version - ) - StrategyManagerStorage(_delegation, _slashEscrowFactory) - Pausable(_pauserRegistry) - SignatureUtilsMixin(_version) - { + ) StrategyManagerStorage(_allocationManager, _delegation) Pausable(_pauserRegistry) SignatureUtilsMixin(_version) { _disableInitializers(); } @@ -162,8 +161,10 @@ contract StrategyManager is // Add the shares to the operator set's burn or redistributable shares. require(burnOrRedistributableShares.set(address(strategy), sharesToBurn), StrategyAlreadyInSlash()); - // Notify the `SlashEscrowFactory` contract that it received underlying tokens to burn or redistribute. - slashEscrowFactory.initiateSlashEscrow(operatorSet, slashId, strategy); + // NOTE: Duplicate operator sets and slash ids will not revert, but will not be added. + _pendingOperatorSets.add(operatorSet.key()); + _pendingSlashIds[operatorSet.key()].add(slashId); + emit BurnOrRedistributableSharesIncreased(operatorSet, slashId, strategy, sharesToBurn); } @@ -179,7 +180,12 @@ contract StrategyManager is // Note: We don't need to iterate backwards since we're indexing into the `EnumerableMap` directly. for (uint256 i = 0; i < length; ++i) { - amounts[i] = clearBurnOrRedistributableSharesByStrategy(operatorSet, slashId, IStrategy(strategies[i])); + amounts[i] = _clearBurnOrRedistributableShares({ + operatorSet: operatorSet, + slashId: slashId, + strategy: IStrategy(strategies[i]), + recipient: allocationManager.getRedistributionRecipient(operatorSet) + }); } return amounts; @@ -190,27 +196,13 @@ contract StrategyManager is OperatorSet calldata operatorSet, uint256 slashId, IStrategy strategy - ) public returns (uint256) { - EnumerableMap.AddressToUintMap storage burnOrRedistributableShares = - _burnOrRedistributableShares[operatorSet.key()][slashId]; - - (, uint256 sharesToRemove) = burnOrRedistributableShares.tryGet(address(strategy)); - burnOrRedistributableShares.remove(address(strategy)); - - uint256 amountOut; - if (sharesToRemove != 0) { - // Withdraw the shares to the slash escrow. - amountOut = IStrategy(strategy).withdraw({ - recipient: address(slashEscrowFactory.getSlashEscrow(operatorSet, slashId)), - token: IStrategy(strategy).underlyingToken(), - amountShares: sharesToRemove - }); - - // Emit an event to notify the that burnable shares have been decreased. - emit BurnOrRedistributableSharesDecreased(operatorSet, slashId, strategy, sharesToRemove); - } - - return amountOut; + ) external nonReentrant returns (uint256) { + return _clearBurnOrRedistributableShares({ + operatorSet: operatorSet, + slashId: slashId, + strategy: strategy, + recipient: allocationManager.getRedistributionRecipient(operatorSet) + }); } /// @inheritdoc IStrategyManager @@ -387,6 +379,54 @@ contract StrategyManager is stakerStrategyList[staker].pop(); } + /** + * @notice Clears burn/redistributable shares and sends underlying tokens to recipient. + * @param operatorSet The operator set to clear the shares for. + * @param slashId The slash id to clear the shares for. + * @param strategy The strategy to clear the shares for. + * @param recipient The recipient to withdraw the shares to. + */ + function _clearBurnOrRedistributableShares( + OperatorSet calldata operatorSet, + uint256 slashId, + IStrategy strategy, + address recipient + ) internal returns (uint256) { + EnumerableMap.AddressToUintMap storage burnOrRedistributableShares = + _burnOrRedistributableShares[operatorSet.key()][slashId]; + + (, uint256 sharesToRemove) = burnOrRedistributableShares.tryGet(address(strategy)); + burnOrRedistributableShares.remove(address(strategy)); + + uint256 amountOut; + if (sharesToRemove != 0) { + // Withdraw the shares to the burn address. + amountOut = IStrategy(strategy).withdraw({ + recipient: recipient, + token: IStrategy(strategy).underlyingToken(), + amountShares: sharesToRemove + }); + + // Emit an event to notify the that burnable shares have been decreased. + emit BurnOrRedistributableSharesDecreased(operatorSet, slashId, strategy, sharesToRemove); + } + + uint256 remainingStrategies = burnOrRedistributableShares.keys().length; + + // If there are no more strategies to burn or redistribute... + if (remainingStrategies == 0) { + // Remove the slash id from the pending slash ids. + _pendingSlashIds[operatorSet.key()].remove(slashId); + + // If there are no more pending slash ids for this operator set, remove the operator set from the pending operator sets. + if (_pendingSlashIds[operatorSet.key()].length() == 0) { + _pendingOperatorSets.remove(operatorSet.key()); + } + } + + return amountOut; + } + /** * @notice Internal function for modifying the `strategyWhitelister`. Used inside of the `setStrategyWhitelister` and `initialize` functions. * @param newStrategyWhitelister The new address for the `strategyWhitelister` to take. @@ -513,4 +553,21 @@ contract StrategyManager is return (strategies, shares); } + + /// @inheritdoc IStrategyManager + function getPendingOperatorSets() external view returns (OperatorSet[] memory) { + uint256 totalEntries = _pendingOperatorSets.length(); + OperatorSet[] memory operatorSets = new OperatorSet[](totalEntries); + for (uint256 i = 0; i < totalEntries; i++) { + operatorSets[i] = _pendingOperatorSets.at(i).decode(); + } + return operatorSets; + } + + /// @inheritdoc IStrategyManager + function getPendingSlashIds( + OperatorSet calldata operatorSet + ) external view returns (uint256[] memory) { + return _pendingSlashIds[operatorSet.key()].values(); + } } diff --git a/src/contracts/core/StrategyManagerStorage.sol b/src/contracts/core/StrategyManagerStorage.sol index 04ba533ebf..bbedfc2bce 100644 --- a/src/contracts/core/StrategyManagerStorage.sol +++ b/src/contracts/core/StrategyManagerStorage.sol @@ -2,11 +2,12 @@ pragma solidity ^0.8.27; import "@openzeppelin/contracts/utils/structs/EnumerableMap.sol"; +import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; +import "../interfaces/IAllocationManager.sol"; import "../interfaces/IAVSDirectory.sol"; import "../interfaces/IDelegationManager.sol"; import "../interfaces/IEigenPodManager.sol"; -import "../interfaces/ISlashEscrowFactory.sol"; import "../interfaces/IStrategy.sol"; import "../interfaces/IStrategyManager.sol"; @@ -34,9 +35,9 @@ abstract contract StrategyManagerStorage is IStrategyManager { // Immutables - IDelegationManager public immutable delegation; + IAllocationManager public immutable allocationManager; - ISlashEscrowFactory public immutable slashEscrowFactory; + IDelegationManager public immutable delegation; // Mutatables @@ -82,14 +83,20 @@ abstract contract StrategyManagerStorage is IStrategyManager { mapping(bytes32 operatorSetKey => mapping(uint256 slashId => EnumerableMap.AddressToUintMap)) internal _burnOrRedistributableShares; + /// @notice Returns a list of operator sets who have pending burn or redistributable shares. + EnumerableSet.Bytes32Set internal _pendingOperatorSets; + + /// @notice Returns a list of slash ids for each operator set who have pending burn or redistributable shares. + mapping(bytes32 operatorSetKey => EnumerableSet.UintSet) internal _pendingSlashIds; + // Construction /** * @param _delegation The delegation contract of EigenLayer. */ - constructor(IDelegationManager _delegation, ISlashEscrowFactory _slashEscrowFactory) { + constructor(IAllocationManager _allocationManager, IDelegationManager _delegation) { + allocationManager = _allocationManager; delegation = _delegation; - slashEscrowFactory = _slashEscrowFactory; } /** @@ -97,5 +104,5 @@ abstract contract StrategyManagerStorage is IStrategyManager { * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[35] private __gap; + uint256[32] private __gap; } diff --git a/src/contracts/interfaces/IAllocationManager.sol b/src/contracts/interfaces/IAllocationManager.sol index 0a08c63145..83264c84de 100644 --- a/src/contracts/interfaces/IAllocationManager.sol +++ b/src/contracts/interfaces/IAllocationManager.sol @@ -19,6 +19,8 @@ interface IAllocationManagerErrors { error InvalidAVSRegistrar(); /// @dev Thrown when an invalid strategy is provided. error InvalidStrategy(); + /// @dev Thrown when an invalid redistribution recipient is provided. + error InvalidRedistributionRecipient(); /// Caller diff --git a/src/contracts/interfaces/ISlashEscrow.sol b/src/contracts/interfaces/ISlashEscrow.sol deleted file mode 100644 index f3088b7ebd..0000000000 --- a/src/contracts/interfaces/ISlashEscrow.sol +++ /dev/null @@ -1,52 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import "../interfaces/ISlashEscrowFactory.sol"; -import "../libraries/OperatorSetLib.sol"; -import "../interfaces/IStrategy.sol"; - -interface ISlashEscrow { - /// @notice Thrown when the provided deployment parameters do not create this contract's address. - error InvalidDeploymentParameters(); - - /// @notice Thrown when the caller is not the slash escrow factory. - error OnlySlashEscrowFactory(); - - /** - * @notice Burns or redistributes the underlying tokens of the strategies. - * @param slashEscrowFactory The factory contract that created the slash escrow. - * @param slashEscrowImplementation The implementation contract that was used to create the slash escrow. - * @param operatorSet The operator set that was used to create the slash escrow. - * @param slashId The slash ID that was used to create the slash escrow. - * @param recipient The recipient of the underlying tokens. - * @param strategy The strategy that was used to create the slash escrow. - */ - function releaseTokens( - ISlashEscrowFactory slashEscrowFactory, - ISlashEscrow slashEscrowImplementation, - OperatorSet calldata operatorSet, - uint256 slashId, - address recipient, - IStrategy strategy - ) external; - - /** - * @notice Verifies the deployment parameters of the slash escrow. - * @param slashEscrowFactory The factory contract that created the slash escrow. - * @param slashEscrowImplementation The implementation contract that was used to create the slash escrow. - * @param operatorSet The operator set that was used to create the slash escrow. - * @param slashId The slash ID that was used to create the slash escrow. - * @return True if the provided parameters create this contract's address, false otherwise. - * @dev Uses ClonesUpgradeable.predictDeterministicAddress() to compute the expected address from the parameters. - * - Compares the computed address against this contract's address to validate parameter integrity. - * - Provides a stateless validation mechanism for releaseTokens() inputs. - * - Security relies on the cryptographic properties of CREATE2 address derivation. - * - Attack vector would require finding a hash collision in the CREATE2 address computation. - */ - function verifyDeploymentParameters( - ISlashEscrowFactory slashEscrowFactory, - ISlashEscrow slashEscrowImplementation, - OperatorSet calldata operatorSet, - uint256 slashId - ) external view returns (bool); -} diff --git a/src/contracts/interfaces/ISlashEscrowFactory.sol b/src/contracts/interfaces/ISlashEscrowFactory.sol deleted file mode 100644 index 33cd36a4f5..0000000000 --- a/src/contracts/interfaces/ISlashEscrowFactory.sol +++ /dev/null @@ -1,298 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity >=0.5.0; - -import "../interfaces/IStrategy.sol"; -import "../libraries/OperatorSetLib.sol"; -import "../interfaces/ISlashEscrow.sol"; - -interface ISlashEscrowFactoryErrors { - /// @notice Thrown when a caller is not the strategy manager. - error OnlyStrategyManager(); - - /// @notice Thrown when a caller is not the redistribution recipient. - error OnlyRedistributionRecipient(); - - /// @notice Thrown when a escrow is not mature. - error EscrowNotMature(); - - /// @notice Thrown when the escrow delay has not elapsed. - error EscrowDelayNotElapsed(); -} - -interface ISlashEscrowFactoryEvents { - /// @notice Emitted when a escrow is initiated. - event StartEscrow(OperatorSet operatorSet, uint256 slashId, IStrategy strategy, uint32 startBlock); - - /// @notice Emitted when a escrow is released. - event EscrowComplete(OperatorSet operatorSet, uint256 slashId, IStrategy strategy, address recipient); - - /// @notice Emitted when a escrow is paused. - event EscrowPaused(OperatorSet operatorSet, uint256 slashId); - - /// @notice Emitted when a escrow is unpaused. - event EscrowUnpaused(OperatorSet operatorSet, uint256 slashId); - - /// @notice Emitted when a global escrow delay is set. - event GlobalEscrowDelaySet(uint32 delay); - - /// @notice Emitted when a escrow delay is set. - event StrategyEscrowDelaySet(IStrategy strategy, uint32 delay); -} - -interface ISlashEscrowFactory is ISlashEscrowFactoryErrors, ISlashEscrowFactoryEvents { - /** - * @notice Initializes the initial owner and paused status. - * @param initialOwner The initial owner of the router. - * @param initialPausedStatus The initial paused status of the router. - * @param initialGlobalDelayBlocks The initial global escrow delay. - */ - function initialize(address initialOwner, uint256 initialPausedStatus, uint32 initialGlobalDelayBlocks) external; - - /** - * @notice Initiates a slash escrow. - * @param operatorSet The operator set whose escrow is being locked up. - * @param slashId The slash ID of the escrow that is being locked up. - * @param strategy The strategy that whose underlying tokens are being redistributed. - * @dev This function can be called multiple times for a given `operatorSet` and `slashId`. - */ - function initiateSlashEscrow(OperatorSet calldata operatorSet, uint256 slashId, IStrategy strategy) external; - - /** - * @notice Releases an escrow by transferring tokens from the `SlashEscrow` to the operator set's redistribution recipient. - * @param operatorSet The operator set whose escrow is being released. - * @param slashId The slash ID of the escrow that is being released. - * @dev The caller must be the escrow recipient, unless the escrow recipient - * is the default burn address in which case anyone can call. - * @dev The slash escrow is released once the delay for ALL strategies has elapsed. - */ - function releaseSlashEscrow(OperatorSet calldata operatorSet, uint256 slashId) external; - - /** - * @notice Releases an escrow for a single strategy in a slash. - * @param operatorSet The operator set whose escrow is being released. - * @param slashId The slash ID of the escrow that is being released. - * @param strategy The strategy whose escrow is being released. - * @dev The caller must be the redistribution recipient, unless the redistribution recipient - * is the default burn address in which case anyone can call. - * @dev The slash escrow is released once the delay for ALL strategies has elapsed. - */ - function releaseSlashEscrowByStrategy( - OperatorSet calldata operatorSet, - uint256 slashId, - IStrategy strategy - ) external; - - /** - * @notice Pauses a escrow. - * @param operatorSet The operator set whose escrow is being paused. - * @param slashId The slash ID of the escrow that is being paused. - */ - function pauseEscrow(OperatorSet calldata operatorSet, uint256 slashId) external; - - /** - * @notice Unpauses a escrow. - * @param operatorSet The operator set whose escrow is being unpaused. - * @param slashId The slash ID of the escrow that is being unpaused. - */ - function unpauseEscrow(OperatorSet calldata operatorSet, uint256 slashId) external; - - /** - * @notice Sets the delay for the escrow of a strategies underlying token. - * @dev The largest of all strategy delays or global delay will be used. - * @param strategy The strategy whose escrow delay is being set. - * @param delay The delay for the escrow. - */ - function setStrategyEscrowDelay(IStrategy strategy, uint32 delay) external; - - /** - * @notice Sets a global delay applicable to all strategies. - * @param delay The delay for the escrow. - */ - function setGlobalEscrowDelay( - uint32 delay - ) external; - - /** - * @notice Returns the operator sets that have pending escrows. - * @return operatorSets The operator sets that have pending escrows. - */ - function getPendingOperatorSets() external view returns (OperatorSet[] memory operatorSets); - - /** - * @notice Returns the total number of operator sets with pending escrows. - * @return The total number of operator sets with pending escrows. - */ - function getTotalPendingOperatorSets() external view returns (uint256); - - /** - * @notice Returns whether an operator set has pending escrows. - * @param operatorSet The operator set whose pending escrows are being queried. - * @return Whether the operator set has pending escrows. - */ - function isPendingOperatorSet( - OperatorSet calldata operatorSet - ) external view returns (bool); - - /** - * @notice Returns the pending slash IDs for an operator set. - * @param operatorSet The operator set whose pending slash IDs are being queried. - */ - function getPendingSlashIds( - OperatorSet calldata operatorSet - ) external view returns (uint256[] memory); - - /** - * @notice Returns the pending escrows and their release blocks. - * @return operatorSets The pending operator sets. - * @return isRedistributing Whether the operator set is redistributing. - * @return slashIds The pending slash IDs for each operator set. Indexed by operator set. - * @return completeBlocks The block at which a slashID can be released. Indexed by [operatorSet][slashId] - */ - function getPendingEscrows() - external - view - returns ( - OperatorSet[] memory operatorSets, - bool[] memory isRedistributing, - uint256[][] memory slashIds, - uint32[][] memory completeBlocks - ); - - /** - * @notice Returns the total number of slash IDs for an operator set. - * @param operatorSet The operator set whose total slash IDs are being queried. - * @return The total number of slash IDs for the operator set. - */ - function getTotalPendingSlashIds( - OperatorSet calldata operatorSet - ) external view returns (uint256); - - /** - * @notice Returns whether a slash ID is pending for an operator set. - * @param operatorSet The operator set whose pending slash IDs are being queried. - * @param slashId The slash ID of the slash that is being queried. - * @return Whether the slash ID is pending for the operator set. - */ - function isPendingSlashId(OperatorSet calldata operatorSet, uint256 slashId) external view returns (bool); - - /** - * @notice Returns the pending strategies for a slash ID for an operator set. - * @dev This is a variant that returns the pending strategies for a slash ID for an operator set. - * @param operatorSet The operator set whose pending strategies are being queried. - * @param slashId The slash ID of the strategies that are being queried. - * @return strategies The strategies that are pending strategies. - */ - function getPendingStrategiesForSlashId( - OperatorSet calldata operatorSet, - uint256 slashId - ) external view returns (IStrategy[] memory strategies); - - /** - * @notice Returns all pending strategies for all slash IDs for an operator set. - * @dev This is a variant that returns all pending strategies for all slash IDs for an operator set. - * @param operatorSet The operator set whose pending strategies are being queried. - * @return strategies The strategies that are pending strategies. - */ - function getPendingStrategiesForSlashIds( - OperatorSet calldata operatorSet - ) external view returns (IStrategy[][] memory strategies); - - /** - * @notice Returns the number of pending strategies for a slash ID for an operator set. - * @param operatorSet The operator set whose pending strategies are being queried. - * @param slashId The slash ID of the strategies that are being queried. - * @return The number of pending strategies. - */ - function getTotalPendingStrategiesForSlashId( - OperatorSet calldata operatorSet, - uint256 slashId - ) external view returns (uint256); - - /** - * @notice Returns the pending underlying amount for a strategy for an operator set and slash ID. - * @param operatorSet The operator set whose pending underlying amount is being queried. - * @param slashId The slash ID of the escrow that is being queried. - * @param strategy The strategy whose pending underlying amount is being queried. - * @return The pending underlying amount. - */ - function getPendingUnderlyingAmountForStrategy( - OperatorSet calldata operatorSet, - uint256 slashId, - IStrategy strategy - ) external view returns (uint256); - - /** - * @notice Returns the paused status of a escrow. - * @param operatorSet The operator set whose escrow is being queried. - * @param slashId The slash ID of the escrow that is being queried. - * @return The paused status of the escrow. - */ - function isEscrowPaused(OperatorSet calldata operatorSet, uint256 slashId) external view returns (bool); - - /** - * @notice Returns the start block for a slash ID. - * @param operatorSet The operator set whose start block is being queried. - * @param slashId The slash ID of the start block that is being queried. - * @return The start block. - */ - function getEscrowStartBlock(OperatorSet calldata operatorSet, uint256 slashId) external view returns (uint256); - - /** - * @notice Returns the block at which the escrow can be released. - * @param operatorSet The operator set whose start block is being queried. - * @param slashId The slash ID of the start block that is being queried. - * @return The block at which the escrow can be released. - */ - function getEscrowCompleteBlock(OperatorSet calldata operatorSet, uint256 slashId) external view returns (uint32); - - /** - * @notice Returns the escrow delay for a strategy. - * @param strategy The strategy whose escrow delay is being queried. - * @return The escrow delay. - */ - function getStrategyEscrowDelay( - IStrategy strategy - ) external view returns (uint32); - - /** - * @notice Returns the global escrow delay. - * @return The global escrow delay. - */ - function getGlobalEscrowDelay() external view returns (uint32); - - /** - * @notice Returns the salt for a slash escrow. - * @param operatorSet The operator set whose slash escrow is being queried. - * @param slashId The slash ID of the slash escrow that is being queried. - * @return The salt for the slash escrow. - */ - function computeSlashEscrowSalt( - OperatorSet calldata operatorSet, - uint256 slashId - ) external pure returns (bytes32); - - /** - * @notice Returns whether a slash escrow is deployed or not. - * @param operatorSet The operator set whose slash escrow is being queried. - * @param slashId The slash ID of the slash escrow that is being queried. - * @return Whether the slash escrow is deployed. - */ - function isDeployedSlashEscrow(OperatorSet calldata operatorSet, uint256 slashId) external view returns (bool); - - /** - * @notice Returns whether a slash escrow is deployed. - * @param slashEscrow The slash escrow that is being queried. - * @return Whether the slash escrow is deployed. - */ - function isDeployedSlashEscrow( - ISlashEscrow slashEscrow - ) external view returns (bool); - - /** - * @notice Returns the slash escrow for an operator set and slash ID. - * @param operatorSet The operator set whose slash escrow is being queried. - * @param slashId The slash ID of the slash escrow that is being queried. - * @return The slash escrow. - */ - function getSlashEscrow(OperatorSet calldata operatorSet, uint256 slashId) external view returns (ISlashEscrow); -} diff --git a/src/contracts/interfaces/IStrategyManager.sol b/src/contracts/interfaces/IStrategyManager.sol index e5f8e3d3be..15f0c098f0 100644 --- a/src/contracts/interfaces/IStrategyManager.sol +++ b/src/contracts/interfaces/IStrategyManager.sol @@ -51,7 +51,7 @@ interface IStrategyManagerEvents { OperatorSet operatorSet, uint256 slashId, IStrategy strategy, uint256 shares ); - /// @notice Emitted when shares marked for burning or redistribution are decreased and transferred to the `SlashEscrow` + /// @notice Emitted when shares marked for burning or redistribution are decreased and transferred to the operator set's redistribution recipient event BurnOrRedistributableSharesDecreased( OperatorSet operatorSet, uint256 slashId, IStrategy strategy, uint256 shares ); @@ -136,10 +136,11 @@ interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IS ) external; /** - * @notice Removes burned shares from storage and transfers the underlying tokens for the slashId to the slash escrow. + * @notice Removes burned shares from storage and transfers the underlying tokens for the slashId to the redistribution recipient. + * @dev Reentrancy is checked in the `clearBurnOrRedistributableSharesByStrategy` function. * @param operatorSet The operator set to burn shares in. * @param slashId The slash ID to burn shares in. - * @return The amounts of tokens transferred to the slash escrow for each strategy + * @return The amounts of tokens transferred to the redistribution recipient for each strategy */ function clearBurnOrRedistributableShares( OperatorSet calldata operatorSet, @@ -147,11 +148,11 @@ interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IS ) external returns (uint256[] memory); /** - * @notice Removes a single strategy's shares from storage and transfers the underlying tokens for the slashId to the slash escrow. + * @notice Removes a single strategy's shares from storage and transfers the underlying tokens for the slashId to the redistribution recipient. * @param operatorSet The operator set to burn shares in. * @param slashId The slash ID to burn shares in. * @param strategy The strategy to burn shares in. - * @return The amount of tokens transferred to the slash escrow for the strategy. + * @return The amount of tokens transferred to the redistribution recipient for the strategy. */ function clearBurnOrRedistributableSharesByStrategy( OperatorSet calldata operatorSet, @@ -160,7 +161,7 @@ interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IS ) external returns (uint256); /** - * @notice Returns the strategies and shares that have NOT been sent to escrow for a given slashId. + * @notice Returns the strategies and shares that have NOT been sent to the redistribution recipient for a given slashId. * @param operatorSet The operator set to burn or redistribute shares in. * @param slashId The slash ID to burn or redistribute shares in. * @return The strategies and shares for the given slashId. @@ -176,7 +177,7 @@ interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IS * @param slashId The slash ID to burn or redistribute shares in. * @param strategy The strategy to get the shares for. * @return The shares for the given strategy for the given slashId. - * @dev This function will return revert if the shares have already been sent to escrow. + * @dev This function will return revert if the shares have already been sent to the redistribution recipient. */ function getBurnOrRedistributableShares( OperatorSet calldata operatorSet, @@ -185,7 +186,7 @@ interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IS ) external view returns (uint256); /** - * @notice Returns the number of strategies that have NOT been sent to escrow for a given slashId. + * @notice Returns the number of strategies that have NOT been sent to the redistribution recipient for a given slashId. * @param operatorSet The operator set to burn or redistribute shares in. * @param slashId The slash ID to burn or redistribute shares in. * @return The number of strategies for the given slashId. @@ -284,4 +285,20 @@ interface IStrategyManager is IStrategyManagerErrors, IStrategyManagerEvents, IS uint256 nonce, uint256 expiry ) external view returns (bytes32); + + /** + * @notice Returns the operator sets that have pending burn or redistributable shares. + * @return The operator sets that have pending burn or redistributable shares. + */ + function getPendingOperatorSets() external view returns (OperatorSet[] memory); + + /** + * @notice Returns the slash IDs that are pending to be burned or redistributed. + * @dev This function will return revert if the operator set has no pending burn or redistributable shares. + * @param operatorSet The operator set to get the pending slash IDs for. + * @return The slash IDs that are pending to be burned or redistributed. + */ + function getPendingSlashIds( + OperatorSet calldata operatorSet + ) external view returns (uint256[] memory); } diff --git a/src/contracts/libraries/SlashingLib.sol b/src/contracts/libraries/SlashingLib.sol index f608480f08..24b512ed87 100644 --- a/src/contracts/libraries/SlashingLib.sol +++ b/src/contracts/libraries/SlashingLib.sol @@ -36,6 +36,9 @@ library SlashingLib { using SlashingLib for uint256; using SafeCastUpgradeable for uint256; + /// @dev Thrown if an updated deposit scaling factor is 0 to avoid underflow. + error InvalidDepositScalingFactor(); + // WAD MATH function mulWad(uint256 x, uint256 y) internal pure returns (uint256) { @@ -135,6 +138,9 @@ library SlashingLib { .divWad(slashingFactor); dsf._scalingFactor = newDepositScalingFactor; + + // Avoid potential underflow. + require(newDepositScalingFactor != 0, InvalidDepositScalingFactor()); } /// @dev Reset the staker's DSF for a strategy by setting it to 0. This is the same diff --git a/src/test/harnesses/AllocationManagerHarness.sol b/src/test/harnesses/AllocationManagerHarness.sol index aec2fbd85b..6b5430d320 100644 --- a/src/test/harnesses/AllocationManagerHarness.sol +++ b/src/test/harnesses/AllocationManagerHarness.sol @@ -10,6 +10,7 @@ contract AllocationManagerHarness is AllocationManager { constructor( IDelegationManager _delegation, + IStrategy _eigenStrategy, IPauserRegistry _pauserRegistry, IPermissionController _permissionController, uint32 _DEALLOCATION_DELAY, @@ -17,11 +18,12 @@ contract AllocationManagerHarness is AllocationManager { ) AllocationManager( _delegation, + _eigenStrategy, _pauserRegistry, _permissionController, _DEALLOCATION_DELAY, _ALLOCATION_CONFIGURATION_DELAY, - TestConstants.TEST_VERSION + "9.9.9" ) {} diff --git a/src/test/integration/IntegrationBase.t.sol b/src/test/integration/IntegrationBase.t.sol index 8e0716bfe6..60253e6649 100644 --- a/src/test/integration/IntegrationBase.t.sol +++ b/src/test/integration/IntegrationBase.t.sol @@ -1417,26 +1417,6 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { uint slashedAtLeast = prevShares[i] - curShares[i]; // Not factoring in slashable shares in queue here, because that gets more complex (TODO) assertTrue(curBurnable >= (prevBurnable + slashedAtLeast), err); - - // TODO: Improve this check in the future, it's not very optimized. - // In the future, we can simply use a flag to communicate whether the operator set is redistributable. - if (curShares[i] == prevShares[i]) continue; - bool flag = false; - for (uint j = 0; j < params.strategies.length; j++) { - if (params.strategies[j] == BEACONCHAIN_ETH_STRAT) flag = true; - } - if (flag) continue; - - assertTrue(_getIsPendingOperatorSet(operatorSet), "operator set should be pending"); - - assertTrue(_getIsPendingSlashId(operatorSet, slashId), "slash id should be pending"); - assertFalse(_getPrevIsPendingSlashId(operatorSet, slashId), "slash id should not be pending"); - - assertEq(_getEscrowStartBlock(operatorSet, slashId), block.number, "escrow start block should be current block"); - assertEq(_getPrevEscrowStartBlock(operatorSet, slashId), 0, "escrow start block should be 0"); - - assertTrue(_getIsDeployedSlashEscrow(operatorSet, slashId), "escrow should be deployed"); - assertFalse(_getPrevIsDeployedSlashEscrow(operatorSet, slashId), "escrow should not be deployed"); } } @@ -2584,10 +2564,6 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { cheats.roll(latest + 1); } - function _rollBlocksForCompleteSlashEscrow() internal { - cheats.roll(block.number + INITIAL_GLOBAL_DELAY_BLOCKS + 1); - } - /// @dev Uses timewarp modifier to get the operator set strategy allocations at the last snapshot. function _getPrevAllocations(User operator, OperatorSet memory operatorSet, IStrategy[] memory strategies) internal @@ -2782,38 +2758,6 @@ abstract contract IntegrationBase is IntegrationDeployer, TypeImporter { : strategyManager.getBurnOrRedistributableShares(operatorSet, slashId, strategy); } - function _getPrevIsPendingOperatorSet(OperatorSet memory operatorSet) internal timewarp returns (bool) { - return _getIsPendingOperatorSet(operatorSet); - } - - function _getIsPendingOperatorSet(OperatorSet memory operatorSet) internal view returns (bool) { - return slashEscrowFactory.isPendingOperatorSet(operatorSet); - } - - function _getPrevIsPendingSlashId(OperatorSet memory operatorSet, uint slashId) internal timewarp returns (bool) { - return _getIsPendingSlashId(operatorSet, slashId); - } - - function _getIsPendingSlashId(OperatorSet memory operatorSet, uint slashId) internal view returns (bool) { - return slashEscrowFactory.isPendingSlashId(operatorSet, slashId); - } - - function _getPrevEscrowStartBlock(OperatorSet memory operatorSet, uint slashId) internal timewarp returns (uint) { - return _getEscrowStartBlock(operatorSet, slashId); - } - - function _getEscrowStartBlock(OperatorSet memory operatorSet, uint slashId) internal view returns (uint) { - return slashEscrowFactory.getEscrowStartBlock(operatorSet, slashId); - } - - function _getPrevIsDeployedSlashEscrow(OperatorSet memory operatorSet, uint slashId) internal timewarp returns (bool) { - return _getIsDeployedSlashEscrow(operatorSet, slashId); - } - - function _getIsDeployedSlashEscrow(OperatorSet memory operatorSet, uint slashId) internal view returns (bool) { - return slashEscrowFactory.isDeployedSlashEscrow(operatorSet, slashId); - } - function _getPrevSlashableSharesInQueue(User operator, IStrategy[] memory strategies) internal timewarp returns (uint[] memory) { return _getSlashableSharesInQueue(operator, strategies); } diff --git a/src/test/integration/IntegrationChecks.t.sol b/src/test/integration/IntegrationChecks.t.sol index 5c71f600db..c9ed0b08b1 100644 --- a/src/test/integration/IntegrationChecks.t.sol +++ b/src/test/integration/IntegrationChecks.t.sol @@ -1108,36 +1108,6 @@ contract IntegrationCheckUtils is IntegrationBase { ); } - function check_releaseSlashEscrow_State( - OperatorSet memory operatorSet, - uint slashId, - IStrategy[] memory strategies, - uint[] memory initTokenBalances, - address redistributionRecipient - ) internal { - assert_HasUnderlyingTokenBalances( - User(payable(redistributionRecipient)), - strategies, - initTokenBalances, - "redistribution recipient should have underlying token balances" - ); - - assertFalse(_getIsPendingSlashId(operatorSet, slashId), "slash id should not be pending"); - assertEq(_getEscrowStartBlock(operatorSet, slashId), 0, "escrow start block should be deleted after"); - assertTrue(_getIsDeployedSlashEscrow(operatorSet, slashId), "escrow should be deployed after"); - } - - function check_releaseSlashEscrow_State_NoneRemaining( - OperatorSet memory operatorSet, - uint slashId, - IStrategy[] memory strategies, - uint[] memory initTokenBalances, - address redistributionRecipient - ) internal { - check_releaseSlashEscrow_State(operatorSet, slashId, strategies, initTokenBalances, redistributionRecipient); - assertFalse(_getIsPendingOperatorSet(operatorSet), "operator set should not be pending"); - } - /** * * DUAL SLASHING CHECKS diff --git a/src/test/integration/IntegrationDeployer.t.sol b/src/test/integration/IntegrationDeployer.t.sol index f46a3b6a06..8ac2e30368 100644 --- a/src/test/integration/IntegrationDeployer.t.sol +++ b/src/test/integration/IntegrationDeployer.t.sol @@ -280,50 +280,59 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { // First, deploy the new contracts as empty contracts emptyContract = new EmptyContract(); - - slashEscrowFactory = - SlashEscrowFactory(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); - // Deploy new implementation contracts and upgrade all proxies to point to them + _deployProxies(); // deploy proxies (if undeployed) _deployImplementations(); _upgradeProxies(); - - // Initialize the newly-deployed proxy - slashEscrowFactory.initialize({ - initialOwner: communityMultisig, - initialPausedStatus: 0, - initialGlobalDelayBlocks: INITIAL_GLOBAL_DELAY_BLOCKS - }); - cheats.stopPrank(); } function _deployProxies() public { - delegationManager = - DelegationManager(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); - strategyManager = - StrategyManager(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); - eigenPodManager = - EigenPodManager(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); - rewardsCoordinator = - RewardsCoordinator(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); - avsDirectory = AVSDirectory(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); - strategyFactory = - StrategyFactory(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); - allocationManager = - AllocationManager(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); - permissionController = - PermissionController(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); - slashEscrowFactory = - SlashEscrowFactory(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); - eigenPodBeacon = new UpgradeableBeacon(address(emptyContract)); - strategyBeacon = new UpgradeableBeacon(address(emptyContract)); + if (address(delegationManager) == address(0)) { + delegationManager = + DelegationManager(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); + } + if (address(strategyManager) == address(0)) { + strategyManager = + StrategyManager(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); + } + if (address(eigenPodManager) == address(0)) { + eigenPodManager = + EigenPodManager(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); + } + if (address(rewardsCoordinator) == address(0)) { + rewardsCoordinator = + RewardsCoordinator(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); + } + if (address(avsDirectory) == address(0)) { + avsDirectory = AVSDirectory(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); + } + if (address(strategyFactory) == address(0)) { + strategyFactory = + StrategyFactory(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); + } + if (address(allocationManager) == address(0)) { + allocationManager = + AllocationManager(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); + } + if (address(permissionController) == address(0)) { + permissionController = + PermissionController(address(new TransparentUpgradeableProxy(address(emptyContract), address(eigenLayerProxyAdmin), ""))); + } + if (address(eigenPodBeacon) == address(0)) eigenPodBeacon = new UpgradeableBeacon(address(emptyContract)); + if (address(strategyBeacon) == address(0)) strategyBeacon = new UpgradeableBeacon(address(emptyContract)); } /// Deploy an implementation contract for each contract in the system function _deployImplementations() public { allocationManagerImplementation = new AllocationManager( - delegationManager, eigenLayerPauserReg, permissionController, DEALLOCATION_DELAY, ALLOCATION_CONFIGURATION_DELAY, version + delegationManager, + eigenStrategy, + eigenLayerPauserReg, + permissionController, + DEALLOCATION_DELAY, + ALLOCATION_CONFIGURATION_DELAY, + version ); permissionControllerImplementation = new PermissionController(version); delegationManagerImplementation = new DelegationManager( @@ -335,7 +344,7 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { DELEGATION_MANAGER_MIN_WITHDRAWAL_DELAY_BLOCKS, version ); - strategyManagerImplementation = new StrategyManager(delegationManager, slashEscrowFactory, eigenLayerPauserReg, version); + strategyManagerImplementation = new StrategyManager(allocationManager, delegationManager, eigenLayerPauserReg, version); rewardsCoordinatorImplementation = new RewardsCoordinator( IRewardsCoordinatorTypes.RewardsCoordinatorConstructorParams({ delegationManager: delegationManager, @@ -355,8 +364,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { eigenPodManagerImplementation = new EigenPodManager(DEPOSIT_CONTRACT, eigenPodBeacon, delegationManager, eigenLayerPauserReg, "9.9.9"); strategyFactoryImplementation = new StrategyFactory(strategyManager, eigenLayerPauserReg, "9.9.9"); - slashEscrowFactoryImplementation = - new SlashEscrowFactory(allocationManager, strategyManager, eigenLayerPauserReg, new SlashEscrow(), "9.9.9"); // Beacon implementations eigenPodImplementation = new EigenPod(DEPOSIT_CONTRACT, eigenPodManager, "v9.9.9"); @@ -405,11 +412,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { ITransparentUpgradeableProxy(payable(address(strategyFactory))), address(strategyFactoryImplementation) ); - // SlashEscrowFactory - eigenLayerProxyAdmin.upgrade( - ITransparentUpgradeableProxy(payable(address(slashEscrowFactory))), address(slashEscrowFactoryImplementation) - ); - // EigenPod beacon eigenPodBeacon.upgradeTo(address(eigenPodImplementation)); @@ -441,12 +443,6 @@ abstract contract IntegrationDeployer is ExistingDeploymentParser { allocationManager.initialize({initialPausedStatus: 0}); strategyFactory.initialize({_initialOwner: executorMultisig, _initialPausedStatus: 0, _strategyBeacon: strategyBeacon}); - - slashEscrowFactory.initialize({ - initialOwner: communityMultisig, - initialPausedStatus: 0, - initialGlobalDelayBlocks: INITIAL_GLOBAL_DELAY_BLOCKS - }); } /// @dev Deploy a strategy and its underlying token, push to global lists of tokens/strategies, and whitelist diff --git a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Escrow.t.sol b/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Escrow.t.sol deleted file mode 100644 index c4ec84a933..0000000000 --- a/src/test/integration/tests/Deposit_Delegate_Allocate_Slash_Escrow.t.sol +++ /dev/null @@ -1,379 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import "src/test/integration/IntegrationChecks.t.sol"; -import "src/test/integration/users/User.t.sol"; -import {console} from "forge-std/console.sol"; - -contract Integration_Deposit_Delegate_Allocate_Slash_Escrow is IntegrationCheckUtils { - using ArrayLib for *; - - AVS avs; - User staker; - User operator; - OperatorSet operatorSet; - AllocateParams allocateParams; - SlashingParams slashParams; - uint slashId; - IStrategy[] strategies; - IERC20[] tokens; - uint[] initTokenBalances; - uint[] initDepositShares; - address payable redistributionRecipient; - bool isRedistributing; - - function _init() internal virtual override { - _configAssetTypes(HOLDS_LST); - - (staker, strategies, initTokenBalances) = _newRandomStaker(); - operator = _newRandomOperator_NoAssets(); - (avs,) = _newRandomAVS(); - - isRedistributing = cheats.randomBool(); - - if (isRedistributing) { - redistributionRecipient = payable(cheats.randomAddress()); - cheats.label(redistributionRecipient, "redistributionRecipient"); - operatorSet = avs.createRedistributingOperatorSet(strategies, redistributionRecipient); - } else { - operatorSet = avs.createOperatorSet(strategies); - redistributionRecipient = payable(allocationManager.getRedistributionRecipient(operatorSet)); // burn address - } - - tokens = _getUnderlyingTokens(strategies); - - // 1) Register operator for operator set. - operator.registerForOperatorSet(operatorSet); - check_Registration_State_NoAllocation(operator, operatorSet, strategies); - - // 2) Deposit Into Strategies - initDepositShares = _calculateExpectedShares(strategies, initTokenBalances); - staker.depositIntoEigenlayer(strategies, initTokenBalances); - - // 3) Delegate to operator - staker.delegateTo(operator); - check_Delegation_State(staker, operator, strategies, initDepositShares); - - // 4) Operator allocates to operator set. - allocateParams = _genAllocation_AllAvailable(operator, operatorSet); - operator.modifyAllocations(allocateParams); - check_Base_IncrAlloc_State(operator, allocateParams); - - // 5) Roll forward to complete allocation. - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - - // 6) Operator is full slashed. - slashParams = _genSlashing_Full(operator, operatorSet); - (slashId,) = avs.slashOperator(slashParams); - check_Base_Slashing_State(operator, allocateParams, slashParams, slashId); - - // Roll forward to the escrow delay. - _rollBlocksForCompleteSlashEscrow(); - } - - function _shuffleStrategiesAndBalances() internal { - // Reorder strategies and initTokenBalances - for (uint i = 0; i < strategies.length; i++) { - uint randomIndex = cheats.randomUint(0, strategies.length - 1); - IStrategy tempStrategy = strategies[i]; - strategies[i] = strategies[randomIndex]; - strategies[randomIndex] = tempStrategy; - - uint tempBalance = initTokenBalances[i]; - initTokenBalances[i] = initTokenBalances[randomIndex]; - initTokenBalances[randomIndex] = tempBalance; - } - } - - function testFuzz_fullSlash_releaseAll(uint24 _random) public rand(_random) { - // 7) Release escrow, expect success. - cheats.prank(redistributionRecipient); - slashEscrowFactory.releaseSlashEscrow({operatorSet: operatorSet, slashId: 1}); - check_releaseSlashEscrow_State_NoneRemaining(operatorSet, slashId, strategies, initTokenBalances, redistributionRecipient); - } - - function testFuzz_fullSlash_releaseAllByStrategy(uint24 _random) public rand(_random) { - // Randomize the order of strategies and initTokenBalances. - _shuffleStrategiesAndBalances(); - - // 7) Release escrow, expect success. - for (uint i = 0; i < strategies.length; i++) { - cheats.prank(redistributionRecipient); - slashEscrowFactory.releaseSlashEscrowByStrategy({operatorSet: operatorSet, slashId: 1, strategy: strategies[i]}); - } - check_releaseSlashEscrow_State_NoneRemaining(operatorSet, slashId, strategies, initTokenBalances, redistributionRecipient); - } - - function testFuzz_fullSlash_clearAll_releaseAll(uint24 _random) public rand(_random) { - // 7) Clear burnable shares (transfers tokens to escrow). - avs.clearBurnOrRedistributableShares(operatorSet, slashId); - assert_HasUnderlyingTokenBalances( - User(payable(address(slashEscrowFactory.getSlashEscrow(operatorSet, slashId)))), - strategies, - initTokenBalances, - "slash escrow should have underlying token balances" - ); - for (uint i = 0; i < strategies.length; i++) { - assertEq( - strategyManager.getBurnOrRedistributableShares(operatorSet, slashId, strategies[i]), 0, "no burnable shares should remain" - ); - } - - // 8) Release escrow, expect success. - cheats.prank(redistributionRecipient); - slashEscrowFactory.releaseSlashEscrow({operatorSet: operatorSet, slashId: 1}); - check_releaseSlashEscrow_State_NoneRemaining(operatorSet, slashId, strategies, initTokenBalances, redistributionRecipient); - } - - function testFuzz_fullSlash_clearAll_releaseByStrategy(uint24 _random) public rand(_random) { - avs.clearBurnOrRedistributableShares(operatorSet, slashId); - assert_HasUnderlyingTokenBalances( - User(payable(address(slashEscrowFactory.getSlashEscrow(operatorSet, slashId)))), - strategies, - initTokenBalances, - "slash escrow should have underlying token balances" - ); - for (uint i = 0; i < strategies.length; i++) { - assertEq( - strategyManager.getBurnOrRedistributableShares(operatorSet, slashId, strategies[i]), 0, "no burnable shares should remain" - ); - } - - // Randomize the order of strategies and initTokenBalances. - _shuffleStrategiesAndBalances(); - - // 8) Release escrow, expect success. - for (uint i = 0; i < strategies.length; i++) { - cheats.prank(redistributionRecipient); - slashEscrowFactory.releaseSlashEscrowByStrategy({operatorSet: operatorSet, slashId: 1, strategy: strategies[i]}); - } - - check_releaseSlashEscrow_State_NoneRemaining(operatorSet, slashId, strategies, initTokenBalances, redistributionRecipient); - } - - function testFuzz_fullSlash_clearByStrategy_releaseAll(uint24 _random) public rand(_random) { - // Randomize the order of strategies and initTokenBalances. - _shuffleStrategiesAndBalances(); - - // 7) Clear burnable shares (transfers tokens to escrow). - for (uint i = 0; i < strategies.length; i++) { - avs.clearBurnOrRedistributableSharesByStrategy(operatorSet, slashId, strategies[i]); - assert_HasUnderlyingTokenBalance( - User(payable(address(slashEscrowFactory.getSlashEscrow(operatorSet, slashId)))), - strategies[i], - initTokenBalances[i], - "slash escrow should have underlying token balance" - ); - assertEq( - strategyManager.getBurnOrRedistributableShares(operatorSet, slashId, strategies[i]), 0, "no burnable shares should remain" - ); - } - - // 8) Release escrow, expect success. - cheats.prank(redistributionRecipient); - slashEscrowFactory.releaseSlashEscrow({operatorSet: operatorSet, slashId: 1}); - check_releaseSlashEscrow_State_NoneRemaining(operatorSet, slashId, strategies, initTokenBalances, redistributionRecipient); - } - - function testFuzz_fullSlash_clearByStrategy_releaseByStrategy(uint24 _random) public rand(_random) { - // Randomize the order of strategies and initTokenBalances. - _shuffleStrategiesAndBalances(); - - // 7) Clear burnable shares (transfers tokens to escrow). - for (uint i = 0; i < strategies.length; i++) { - avs.clearBurnOrRedistributableSharesByStrategy(operatorSet, slashId, strategies[i]); - assert_HasUnderlyingTokenBalance( - User(payable(address(slashEscrowFactory.getSlashEscrow(operatorSet, slashId)))), - strategies[i], - initTokenBalances[i], - "slash escrow should have underlying token balance" - ); - assertEq( - strategyManager.getBurnOrRedistributableShares(operatorSet, slashId, strategies[i]), 0, "no burnable shares should remain" - ); - } - - // 8) Release escrow, expect success. - for (uint i = 0; i < strategies.length; i++) { - cheats.prank(redistributionRecipient); - slashEscrowFactory.releaseSlashEscrowByStrategy({operatorSet: operatorSet, slashId: 1, strategy: strategies[i]}); - } - - check_releaseSlashEscrow_State_NoneRemaining(operatorSet, slashId, strategies, initTokenBalances, redistributionRecipient); - } -} - -contract Integration_Deposit_Delegate_Allocate_SlashOnlySomeStrategies_Escrow is IntegrationCheckUtils { - using ArrayLib for *; - - AVS avs; - User staker; - User operator; - OperatorSet operatorSet; - AllocateParams allocateParams; - SlashingParams slashParams; - uint slashId; - IStrategy[] strategies; - IERC20[] tokens; - uint[] initTokenBalances; - uint[] initDepositShares; - address payable redistributionRecipient; - bool isRedistributing; - - function testFuzz_fullSlash_clearByStrategy_releaseByStrategy(uint24 _random) public rand(_random) { - _configAssetTypes(HOLDS_LST); - - (staker, strategies, initTokenBalances) = _newRandomStaker(); - operator = _newRandomOperator_NoAssets(); - (avs,) = _newRandomAVS(); - - cheats.assume(strategies.length >= 2); - - // Modify the length of the array in memory (thus ignoring remaining elements). - assembly { - sstore(strategies.slot, 2) - } - - if (isRedistributing) { - redistributionRecipient = payable(cheats.randomAddress()); - cheats.label(redistributionRecipient, "redistributionRecipient"); - operatorSet = avs.createRedistributingOperatorSet(strategies, redistributionRecipient); - } else { - operatorSet = avs.createOperatorSet(strategies); - redistributionRecipient = payable(allocationManager.getRedistributionRecipient(operatorSet)); // burn address - } - tokens = _getUnderlyingTokens(strategies); - - // 1) Register operator for operator set. - operator.registerForOperatorSet(operatorSet); - check_Registration_State_NoAllocation(operator, operatorSet, strategies); - - // 2) Deposit Into Strategies - initDepositShares = _calculateExpectedShares(strategies, initTokenBalances); - staker.depositIntoEigenlayer(strategies, initTokenBalances); - - // 3) Delegate to operator - staker.delegateTo(operator); - check_Delegation_State(staker, operator, strategies, initDepositShares); - - // 4) Operator allocates to operator set. - allocateParams = _genAllocation_AllAvailable(operator, operatorSet); - operator.modifyAllocations(allocateParams); - check_Base_IncrAlloc_State(operator, allocateParams); - - // 5) Roll forward to complete allocation. - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - - // 6) Operator is full slashed. - slashParams = _genSlashing_SingleStrategy(operator, operatorSet, strategies[0]); - (slashId,) = avs.slashOperator(slashParams); - check_Base_Slashing_State(operator, allocateParams, slashParams, slashId); - - // Roll forward to the escrow delay. - _rollBlocksForCompleteSlashEscrow(); - - // 7) Clear burnable shares (transfers tokens to escrow). - avs.clearBurnOrRedistributableSharesByStrategy(operatorSet, slashId, strategies[0]); - assert_HasUnderlyingTokenBalances( - User(payable(address(slashEscrowFactory.getSlashEscrow(operatorSet, slashId)))), - strategies[0].toArray(), - initTokenBalances, - "slash escrow should have underlying token balances" - ); - assertEq(strategyManager.getBurnOrRedistributableShares(operatorSet, slashId, strategies[0]), 0, "no burnable shares should remain"); - - // 8) Release escrow, expect success. - cheats.prank(redistributionRecipient); - slashEscrowFactory.releaseSlashEscrowByStrategy({operatorSet: operatorSet, slashId: 1, strategy: strategies[0]}); - check_releaseSlashEscrow_State_NoneRemaining( - operatorSet, slashId, strategies[0].toArray(), initTokenBalances[0].toArrayU256(), redistributionRecipient - ); - assertEq(slashEscrowFactory.getTotalPendingSlashIds(operatorSet), 0, "no pending slash ids should remain"); - } -} - -contract Integration_Deposit_Delegate_Allocate_Slash_Escrow_Timing is IntegrationCheckUtils { - using ArrayLib for *; - - AVS avs; - User staker; - User operator; - OperatorSet operatorSet; - AllocateParams allocateParams; - SlashingParams slashParams; - uint slashId; - IStrategy[] strategies; - IERC20[] tokens; - uint[] initTokenBalances; - uint[] initDepositShares; - address payable redistributionRecipient; - bool isRedistributing; - - function _init() internal virtual override { - _configAssetTypes(HOLDS_LST); - - (staker, strategies, initTokenBalances) = _newRandomStaker(); - operator = _newRandomOperator_NoAssets(); - (avs,) = _newRandomAVS(); - - if (isRedistributing) { - redistributionRecipient = payable(cheats.randomAddress()); - cheats.label(redistributionRecipient, "redistributionRecipient"); - operatorSet = avs.createRedistributingOperatorSet(strategies, redistributionRecipient); - } else { - operatorSet = avs.createOperatorSet(strategies); - redistributionRecipient = payable(allocationManager.getRedistributionRecipient(operatorSet)); // burn address - } - tokens = _getUnderlyingTokens(strategies); - - // 1) Register operator for operator set. - operator.registerForOperatorSet(operatorSet); - check_Registration_State_NoAllocation(operator, operatorSet, strategies); - - // 2) Deposit Into Strategies - initDepositShares = _calculateExpectedShares(strategies, initTokenBalances); - staker.depositIntoEigenlayer(strategies, initTokenBalances); - - // 3) Delegate to operator - staker.delegateTo(operator); - check_Delegation_State(staker, operator, strategies, initDepositShares); - - // 4) Operator allocates to operator set. - allocateParams = _genAllocation_AllAvailable(operator, operatorSet); - operator.modifyAllocations(allocateParams); - check_Base_IncrAlloc_State(operator, allocateParams); - - // 5) Roll forward to complete allocation. - _rollBlocksForCompleteAllocation(operator, operatorSet, strategies); - } - - function testFuzz_fullSlash_EscrowTiming_RightBeforeFails(uint24 _random) public rand(_random) { - // 6) Operator is full slashed. - slashParams = _genSlashing_Full(operator, operatorSet); - (slashId,) = avs.slashOperator(slashParams); - check_Base_Slashing_State(operator, allocateParams, slashParams, slashId); - - // Roll forward to just before the escrow delay. - cheats.roll(block.number + INITIAL_GLOBAL_DELAY_BLOCKS); - - // Attempt to release escrow before delay has elapsed, expect revert. - cheats.prank(redistributionRecipient); - cheats.expectRevert(ISlashEscrowFactoryErrors.EscrowDelayNotElapsed.selector); - slashEscrowFactory.releaseSlashEscrow({operatorSet: operatorSet, slashId: 1}); - } - - function testFuzz_fullSlash_EscrowTiming_RightAfterPasses(uint24 _random) public rand(_random) { - // 6) Operator is full slashed. - slashParams = _genSlashing_Full(operator, operatorSet); - (slashId,) = avs.slashOperator(slashParams); - check_Base_Slashing_State(operator, allocateParams, slashParams, slashId); - - // Roll forward to the escrow delay. - _rollBlocksForCompleteSlashEscrow(); - - // 7) Release escrow, expect success. - cheats.prank(redistributionRecipient); - slashEscrowFactory.releaseSlashEscrow({operatorSet: operatorSet, slashId: 1}); - check_releaseSlashEscrow_State_NoneRemaining(operatorSet, slashId, strategies, initTokenBalances, redistributionRecipient); - } -} diff --git a/src/test/integration/users/AVS.t.sol b/src/test/integration/users/AVS.t.sol index 2e987b57f6..d5bb1a6b11 100644 --- a/src/test/integration/users/AVS.t.sol +++ b/src/test/integration/users/AVS.t.sol @@ -6,7 +6,6 @@ import "forge-std/Test.sol"; import "src/contracts/interfaces/IAllocationManager.sol"; import "src/contracts/interfaces/IPermissionController.sol"; import "src/contracts/interfaces/IStrategyFactory.sol"; -import "src/contracts/interfaces/ISlashEscrowFactory.sol"; import "src/test/mocks/ERC20Mock.sol"; import "src/test/integration/users/User.t.sol"; @@ -23,7 +22,6 @@ interface IAVSDeployer { function strategyManager() external view returns (IStrategyManager); function strategyFactory() external view returns (IStrategyFactory); function permissionController() external view returns (IPermissionController); - function slashEscrowFactory() external view returns (ISlashEscrowFactory); function timeMachine() external view returns (TimeMachine); } @@ -39,7 +37,6 @@ contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar { IDelegationManager immutable delegationManager; IStrategyManager immutable strategyManager; IStrategyFactory immutable strategyFactory; - ISlashEscrowFactory immutable slashEscrowFactory; TimeMachine immutable timeMachine; string _NAME; @@ -52,7 +49,6 @@ contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar { delegationManager = deployer.delegationManager(); strategyManager = deployer.strategyManager(); strategyFactory = deployer.strategyFactory(); - slashEscrowFactory = deployer.slashEscrowFactory(); timeMachine = deployer.timeMachine(); _NAME = name; cheats.label(address(this), NAME_COLORED()); @@ -180,7 +176,6 @@ contract AVS is Logger, IAllocationManagerTypes, IAVSRegistrar { ) ); } - cheats.label(address(slashEscrowFactory.getSlashEscrow(OperatorSet(address(this), params.operatorSetId), slashId)), "slashEscrow"); _tryPrankAppointee_AllocationManager(IAllocationManager.slashOperator.selector); (slashId, shares) = allocationManager.slashOperator(address(this), params); print.gasUsed(); diff --git a/src/test/mocks/SlashEscrowFactoryMock.sol b/src/test/mocks/SlashEscrowFactoryMock.sol deleted file mode 100644 index 3823740e75..0000000000 --- a/src/test/mocks/SlashEscrowFactoryMock.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.9; - -import "forge-std/Test.sol"; -import "src/contracts/interfaces/IStrategy.sol"; -import "src/contracts/libraries/OperatorSetLib.sol"; - -contract SlashEscrowFactoryMock is Test { - receive() external payable {} - fallback() external payable {} - - function getSlashEscrow(OperatorSet calldata operatorSet, uint slashId) public view returns (address) { - // Hash the operatorSet and slashId to get a random address - return address(uint160(uint(keccak256(abi.encode(operatorSet, slashId))))); - } -} diff --git a/src/test/unit/AllocationManagerUnit.t.sol b/src/test/unit/AllocationManagerUnit.t.sol index b7134bebba..88ae92b95c 100644 --- a/src/test/unit/AllocationManagerUnit.t.sol +++ b/src/test/unit/AllocationManagerUnit.t.sol @@ -13,6 +13,8 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag /// Constants /// ----------------------------------------------------------------------- + address internal constant DEFAULT_BURN_ADDRESS = 0x00000000000000000000000000000000000E16E4; + /// NOTE: Raising these values directly increases cpu time for tests. uint internal constant FUZZ_MAX_ALLOCATIONS = 8; uint internal constant FUZZ_MAX_STRATS = 8; @@ -45,6 +47,7 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag IStrategy[] defaultStrategies; address defaultOperator = address(this); address defaultAVS = address(new MockAVSRegistrar()); + IStrategy eigenStrategy; /// ----------------------------------------------------------------------- /// Internal Storage Helpers @@ -57,6 +60,7 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag function setUp() public virtual override { EigenLayerUnitTestSetup.setUp(); + eigenStrategy = IStrategy(cheats.randomAddress()); _initializeAllocationManager(pauserRegistry, 0); tokenMock = new ERC20PresetFixedSupply("Mock Token", "MOCK", type(uint).max, address(this)); strategyMock = StrategyBase( @@ -95,6 +99,7 @@ contract AllocationManagerUnitTests is EigenLayerUnitTestSetup, IAllocationManag address( new AllocationManagerHarness( IDelegationManager(address(delegationManagerMock)), + eigenStrategy, _pauserRegistry, IPermissionController(address(permissionController)), DEALLOCATION_DELAY, @@ -3664,6 +3669,15 @@ contract AllocationManagerUnitTests_addStrategiesToOperatorSet is AllocationMana allocationManager.addStrategiesToOperatorSet(defaultAVS, defaultOperatorSet.id, defaultStrategies); } + function test_addStrategiesToOperatorSet_EigenStrategyInRedistributingSet() public { + OperatorSet memory operatorSet = OperatorSet(defaultAVS, 2); + _createRedistributingOperatorSet(operatorSet, defaultStrategies, cheats.randomAddress()); + + cheats.prank(defaultAVS); + cheats.expectRevert(InvalidStrategy.selector); + allocationManager.addStrategiesToOperatorSet(defaultAVS, operatorSet.id, IStrategy(address(eigenStrategy)).toArray()); + } + function test_addStrategiesToOperatorSet_BeaconChainStratInRedistributingSet() public { // Create a redistributing operator set CreateSetParams[] memory createSetParams = new CreateSetParams[](1); @@ -3745,8 +3759,6 @@ contract AllocationManagerUnitTests_removeStrategiesFromOperatorSet is Allocatio contract AllocationManagerUnitTests_createOperatorSets is AllocationManagerUnitTests { using ArrayLib for *; - address internal constant DEFAULT_BURN_ADDRESS = 0x00000000000000000000000000000000000E16E4; - function testRevert_createOperatorSets_InvalidOperatorSet() public { cheats.prank(defaultAVS); cheats.expectRevert(InvalidOperatorSet.selector); @@ -3813,6 +3825,16 @@ contract AllocationManagerUnitTests_createRedistributingOperatorSets is Allocati ); } + function testRevert_createRedistributingOperatorSets_EigenStrategyInRedistributingSet() public { + cheats.prank(defaultAVS); + cheats.expectRevert(InvalidStrategy.selector); + allocationManager.createRedistributingOperatorSets( + defaultAVS, + CreateSetParams(defaultOperatorSet.id + 1, IStrategy(address(eigenStrategy)).toArray()).toArray(), + address(this).toArray() + ); + } + function testRevert_createRedistributingOperatorSets_NonexistentAVSMetadata(Randomness r) public rand(r) { address avs = r.Address(); address redistributionRecipient = r.Address(); @@ -3838,6 +3860,21 @@ contract AllocationManagerUnitTests_createRedistributingOperatorSets is Allocati ); } + function testRevert_createRedistributingOperatorSets_InvalidRedistributionRecipient(Randomness r) public rand(r) { + address avs = r.Address(); + address[] memory redistributionRecipients = new address[](1); + redistributionRecipients[0] = DEFAULT_BURN_ADDRESS; + + cheats.prank(avs); + allocationManager.updateAVSMetadataURI(avs, "https://example.com"); + + cheats.prank(avs); + cheats.expectRevert(InvalidRedistributionRecipient.selector); + allocationManager.createRedistributingOperatorSets( + avs, CreateSetParams(defaultOperatorSet.id, defaultStrategies).toArray(), redistributionRecipients + ); + } + function testFuzz_createRedistributingOperatorSets_Correctness(Randomness r) public rand(r) { address avs = r.Address(); uint numOpSets = r.Uint256(1, FUZZ_MAX_OP_SETS); diff --git a/src/test/unit/SlashEscrowFactoryUnit.t.sol b/src/test/unit/SlashEscrowFactoryUnit.t.sol deleted file mode 100644 index 3643319a32..0000000000 --- a/src/test/unit/SlashEscrowFactoryUnit.t.sol +++ /dev/null @@ -1,955 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.27; - -import {MockERC20} from "src/test/mocks/MockERC20.sol"; -import "src/test/utils/EigenLayerUnitTestSetup.sol"; -import "src/contracts/core/SlashEscrowFactory.sol"; -import "src/contracts/core/SlashEscrow.sol"; - -contract SlashEscrowFactoryUnitTests is EigenLayerUnitTestSetup, ISlashEscrowFactoryEvents { - /// @notice default address for burning slashed shares and transferring underlying tokens - address public constant DEFAULT_BURN_ADDRESS = 0x00000000000000000000000000000000000E16E4; - - /// @dev Index for flag that pauses calling `releaseSlashEscrow` - uint8 constant PAUSED_RELEASE_ESCROW = 0; - - SlashEscrowFactory factory; - - OperatorSet defaultOperatorSet; - IStrategy defaultStrategy; - MockERC20 defaultToken; - uint defaultSlashId; - address defaultRedistributionRecipient; - address defaultOwner; - SlashEscrow slashEscrowImplementation; - uint32 defaultGlobalDelayBlocks = uint32(4 days / 12 seconds); - - function setUp() public virtual override { - EigenLayerUnitTestSetup.setUp(); - - defaultOperatorSet = OperatorSet(cheats.randomAddress(), 0); - defaultStrategy = IStrategy(cheats.randomAddress()); - defaultToken = new MockERC20(); - defaultSlashId = 1; - defaultRedistributionRecipient = address(cheats.randomAddress()); - defaultOwner = address(cheats.randomAddress()); - slashEscrowImplementation = new SlashEscrow(); - allocationManagerMock.setRedistributionRecipient(defaultOperatorSet, defaultRedistributionRecipient); - - factory = SlashEscrowFactory( - address( - new TransparentUpgradeableProxy( - address( - new SlashEscrowFactory( - IAllocationManager(address(allocationManagerMock)), - IStrategyManager(address(strategyManagerMock)), - IPauserRegistry(address(pauserRegistry)), - ISlashEscrow(address(slashEscrowImplementation)), - "1.0.0" - ) - ), - address(eigenLayerProxyAdmin), - abi.encodeWithSelector(SlashEscrowFactory.initialize.selector, defaultOwner, 0, uint32(defaultGlobalDelayBlocks)) - ) - ) - ); - } - - function _rollForwardDefaultEscrowDelay() internal { - cheats.roll(block.number + defaultGlobalDelayBlocks + 1); - } - - /// @dev Sets the return value for the next call to `strategy.underlyingToken()`. - function _mockStrategyUnderlyingTokenCall(IStrategy strategy, address underlyingToken) internal { - cheats.mockCall(address(strategy), abi.encodeWithSelector(IStrategy.underlyingToken.selector), abi.encode(underlyingToken)); - } - - /// @dev Returns the pending underlying amount for a given strategy and token. - function _getPendingUnderlyingAmountForStrategy(OperatorSet memory operatorSet, uint slashId, IStrategy strategy, MockERC20 token) - internal - returns (uint) - { - _mockStrategyUnderlyingTokenCall(strategy, address(token)); - return factory.getPendingUnderlyingAmountForStrategy(operatorSet, slashId, strategy); - } - - /// @dev Starts a escrow for a given strategy and token. - /// - Calls as the `StrategyManager`. - /// - Asserts that the `StartEscrow` event is emitted. - /// - Mocks the strategy sending the underlying token to the `SlashEscrow`. - function _initiateSlashEscrow(OperatorSet memory operatorSet, uint slashId, IStrategy strategy, MockERC20 token, uint underlyingAmount) - internal - { - cheats.prank(address(strategyManagerMock)); - cheats.expectEmit(true, true, true, true); - emit StartEscrow(operatorSet, slashId, strategy, uint32(block.number)); - factory.initiateSlashEscrow(operatorSet, slashId, strategy); - deal(address(token), address(factory.getSlashEscrow(operatorSet, slashId)), underlyingAmount); - } - - /// @dev Calls the `releaseSlashEscrow` function as the redistribution recipient. - /// - Asserts that the `Escrow` event is emitted - function _releaseSlashEscrow(OperatorSet memory operatorSet, uint slashId) internal { - (IStrategy[] memory strategies) = factory.getPendingStrategiesForSlashId(operatorSet, slashId); - - address redistributionRecipient = allocationManagerMock.getRedistributionRecipient(operatorSet); - - for (uint i = 0; i < strategies.length; i++) { - cheats.expectEmit(true, true, true, true); - emit EscrowComplete(operatorSet, slashId, strategies[i], redistributionRecipient); - } - - // If the redistribution recipient is any address - if (redistributionRecipient != DEFAULT_BURN_ADDRESS) cheats.prank(defaultRedistributionRecipient); - else cheats.prank(cheats.randomAddress()); - factory.releaseSlashEscrow(operatorSet, slashId); - } - - /// @dev Calls the `releaseSlashEscrow` function as the redistribution recipient. - /// - Asserts that the `Escrow` event is emitted - function _releaseSlashEscrowByStrategy(OperatorSet memory operatorSet, uint slashId, IStrategy strategy) internal { - address redistributionRecipient = allocationManagerMock.getRedistributionRecipient(operatorSet); - // If the redistribution recipient is any address - if (redistributionRecipient != DEFAULT_BURN_ADDRESS) cheats.prank(redistributionRecipient); - else cheats.prank(cheats.randomAddress()); - - cheats.expectEmit(true, true, true, true); - emit EscrowComplete(operatorSet, slashId, strategy, redistributionRecipient); - - factory.releaseSlashEscrowByStrategy(operatorSet, slashId, strategy); - - assertEq(factory.computeSlashEscrowSalt(operatorSet, slashId), keccak256(abi.encodePacked(operatorSet.key(), slashId))); - assertTrue(factory.isDeployedSlashEscrow(operatorSet, slashId)); - ISlashEscrow slashEscrow = factory.getSlashEscrow(operatorSet, slashId); - assertTrue(factory.isDeployedSlashEscrow(slashEscrow)); - assertTrue(slashEscrow.verifyDeploymentParameters(factory, slashEscrowImplementation, operatorSet, slashId)); - } - - /// @dev Asserts that the operator set and slash ID are pending, and that the strategy and underlying amount are in the pending escrows. - function _checkStartEscrows( - OperatorSet memory operatorSet, - uint slashId, - IStrategy strategy, - MockERC20 token, - uint expectedUnderlyingAmount, - uint expectedCount - ) internal { - // Assert that the operator set and slash ID are pending. - assertTrue(factory.isPendingOperatorSet(operatorSet)); - assertTrue(factory.isPendingSlashId(operatorSet, slashId)); - - OperatorSet[] memory pendingOperatorSets = factory.getPendingOperatorSets(); - uint[] memory pendingSlashIds = factory.getPendingSlashIds(operatorSet); - assertEq(pendingOperatorSets[pendingOperatorSets.length - 1].key(), operatorSet.key()); - assertEq(pendingSlashIds[pendingSlashIds.length - 1], slashId); - - // Assert that the underlying amount in escrow for the (operator set, slash ID, strategy) is correct. - assertEq(_getPendingUnderlyingAmountForStrategy(operatorSet, slashId, strategy, token), expectedUnderlyingAmount); - - // Assert that the number of pending escrows is correct. - (IStrategy[] memory strategies) = factory.getPendingStrategiesForSlashId(operatorSet, slashId); - - assertEq(strategies.length, expectedCount); - assertEq(factory.getTotalPendingStrategiesForSlashId(operatorSet, slashId), expectedCount); - - // Assert that the start block for the (operator set, slash ID) is correct. - assertEq(factory.getEscrowStartBlock(operatorSet, slashId), uint32(block.number)); - - // Assert that the escrow is deployed - assertEq(factory.computeSlashEscrowSalt(operatorSet, slashId), keccak256(abi.encodePacked(operatorSet.key(), slashId))); - assertTrue(factory.isDeployedSlashEscrow(operatorSet, slashId)); - ISlashEscrow slashEscrow = factory.getSlashEscrow(operatorSet, slashId); - assertTrue(factory.isDeployedSlashEscrow(slashEscrow)); - assertTrue(slashEscrow.verifyDeploymentParameters(factory, slashEscrowImplementation, operatorSet, slashId)); - } - - /// @dev Sets the redistribution recipient to the default burn address if `shouldBurn` is true. - function _setRedistributionRecipient(bool shouldBurn) internal { - if (shouldBurn) allocationManagerMock.setRedistributionRecipient(defaultOperatorSet, DEFAULT_BURN_ADDRESS); - } -} - -contract SlashEscrowFactoryUnitTests_initialize is SlashEscrowFactoryUnitTests { - function test_initialize() public { - assertEq(address(factory.allocationManager()), address(allocationManagerMock)); - assertEq(address(factory.strategyManager()), address(strategyManagerMock)); - assertEq(address(factory.pauserRegistry()), address(pauserRegistry)); - assertEq(address(factory.slashEscrowImplementation()), address(slashEscrowImplementation)); - assertEq(factory.getGlobalEscrowDelay(), defaultGlobalDelayBlocks); - assertEq(factory.paused(), 0); - } -} - -contract SlashEscrowFactoryUnitTests_initiateSlashEscrow is SlashEscrowFactoryUnitTests { - /// @dev Asserts only the `StrategyManager` can call `initiateSlashEscrow`. - function test_initiateSlashEscrow_onlyStrategyManager() public { - cheats.expectRevert(ISlashEscrowFactoryErrors.OnlyStrategyManager.selector); - factory.initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy); - } - - function testFuzz_initiateSlashEscrow_multipleStrategies(uint r) public { - // Initialize arrays to store test data for multiple strategies - uint numStrategies = bound(r, 2, 10); - // Set up each strategy with random data and start escrow - for (uint i = 0; i < numStrategies; i++) { - // Generate random strategy address and token - IStrategy strategy = IStrategy(cheats.randomAddress()); - MockERC20 token = new MockERC20(); - uint underlyingAmount = cheats.randomUint(); - - // Start escrow for this strategy - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, strategy, token, underlyingAmount); - // Verify the escrow was started correctly - _checkStartEscrows(defaultOperatorSet, defaultSlashId, strategy, token, underlyingAmount, i + 1); - } - } - - function test_initiateSlashEscrow_correctness(uint underlyingAmount) public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, underlyingAmount); - _checkStartEscrows(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, underlyingAmount, 1); - } -} - -contract SlashEscrowFactoryUnitTests_releaseSlashEscrow is SlashEscrowFactoryUnitTests { - /// @dev Asserts that the function reverts if the caller is not the redistribution recipient. - function testFuzz_releaseSlashEscrow_OnlyRedistributionRecipient(uint underlyingAmount) public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, underlyingAmount); - cheats.expectRevert(ISlashEscrowFactoryErrors.OnlyRedistributionRecipient.selector); - factory.releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - } - - function testFuzz_releaseSlashEscrow_globalPause(uint underlyingAmount) public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, underlyingAmount); - cheats.prank(pauser); - factory.pause(2 ** PAUSED_RELEASE_ESCROW); - cheats.prank(defaultRedistributionRecipient); - cheats.expectRevert(IPausable.CurrentlyPaused.selector); - factory.releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - } - - /// @dev Asserts that the function reverts if the redistribution is paused. - function testFuzz_releaseSlashEscrow_paused(uint underlyingAmount) public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, underlyingAmount); - cheats.prank(pauser); - factory.pauseEscrow(defaultOperatorSet, defaultSlashId); - cheats.prank(defaultRedistributionRecipient); - cheats.expectRevert(IPausable.CurrentlyPaused.selector); - factory.releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - } - - /// @dev Asserts that the function reverts if the operator set and slash ID do not exist. - /// NOTE: `releaseSlashEscrow` does not revert when a slash ID does not exist for an operator set. - function testFuzz_releaseSlashEscrow_nonexistentSlashIdForOperatorSet(uint underlyingAmount) public { - cheats.prank(defaultRedistributionRecipient); - factory.releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - assertFalse(factory.isPendingOperatorSet(defaultOperatorSet)); - assertFalse(factory.isPendingSlashId(defaultOperatorSet, defaultSlashId)); - } - - function testFuzz_releaseSlashEscrow_delayNotElapsed(uint underlyingAmount) public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, underlyingAmount); - cheats.roll(block.number + defaultGlobalDelayBlocks); - cheats.prank(defaultRedistributionRecipient); - cheats.expectRevert(ISlashEscrowFactoryErrors.EscrowDelayNotElapsed.selector); - factory.releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - } - - /// @dev Tests that multiple strategies can be burned or redistributed in a single call - function testFuzz_releaseSlashEscrow_multipleStrategies_sameDelay(uint r) public { - // Initialize arrays to store test data for multiple strategies - uint numStrategies = bound(r, 2, 10); - IStrategy[] memory strategies = new IStrategy[](numStrategies); - MockERC20[] memory tokens = new MockERC20[](numStrategies); - uint[] memory underlyingAmounts = new uint[](numStrategies); - - // // Randomly update the redistribution to be the default burn address - // _setRedistributionRecipient(r % 2 == 0); - - // Set up each strategy with random data and start escrow - for (uint i = 0; i < numStrategies; i++) { - // Generate random strategy address and token - strategies[i] = IStrategy(cheats.randomAddress()); - tokens[i] = new MockERC20(); - underlyingAmounts[i] = cheats.randomUint(); - - // Start escrow for this strategy - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i]); - // Verify the escrow was started correctly - _checkStartEscrows(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i], i + 1); - } - - // Advance time to allow escrow to occur - _rollForwardDefaultEscrowDelay(); - - // Set up mock calls for each strategy's underlying token - for (uint i = 0; i < numStrategies; i++) { - _mockStrategyUnderlyingTokenCall(strategies[i], address(tokens[i])); - } - - // Execute the escrow - _releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - - // Checks - - // Assert that the operator set and slash ID are no longer pending. - assertFalse(factory.isPendingOperatorSet(defaultOperatorSet)); - assertFalse(factory.isPendingSlashId(defaultOperatorSet, defaultSlashId)); - assertEq(factory.getTotalPendingOperatorSets(), 0); - assertEq(factory.getTotalPendingSlashIds(defaultOperatorSet), 0); - - // Assert that the strategies and underlying amounts are no longer in the pending escrows. - assertEq(factory.getTotalPendingStrategiesForSlashId(defaultOperatorSet, defaultSlashId), 0); - - // Assert that the underlying amounts are no longer set. - for (uint i = 0; i < numStrategies; i++) { - assertEq(_getPendingUnderlyingAmountForStrategy(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i]), 0); - } - - // Assert that the start block for the (operator set, slash ID) is no longer set. - assertEq(factory.getEscrowStartBlock(defaultOperatorSet, defaultSlashId), 0); - } - - /// @dev Tests that multiple strategies with different delays are processed correctly - function testFuzz_releaseSlashEscrow_multipleStrategies_differentDelays(uint r) public { - // Initialize arrays to store test data for multiple strategies - uint numStrategies = bound(r, 2, 10); - IStrategy[] memory strategies = new IStrategy[](numStrategies); - MockERC20[] memory tokens = new MockERC20[](numStrategies); - uint[] memory underlyingAmounts = new uint[](numStrategies); - uint32[] memory delays = new uint32[](numStrategies); - - // Randomly update the redistribution to be the default burn address - _setRedistributionRecipient(r % 2 == 0); - - // Set global delay less than all the strategy delays. - cheats.prank(defaultOwner); - factory.setGlobalEscrowDelay(0.5 days / 12 seconds); - - // Set up each strategy with random data and different delays - for (uint i = 0; i < numStrategies; i++) { - // Generate random strategy address and token - strategies[i] = IStrategy(cheats.randomAddress()); - tokens[i] = new MockERC20(); - underlyingAmounts[i] = cheats.randomUint(); - - // Set different delays for each strategy (increasing delays) - delays[i] = uint32((i + 1) * 1 days / 12 seconds); // 1 day, 2 days, 3 days, etc. - - // Set the strategy-specific delay - cheats.prank(defaultOwner); - factory.setStrategyEscrowDelay(strategies[i], delays[i]); - - // Start escrow for this strategy - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i]); - // Verify the escrow was started correctly - _checkStartEscrows(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i], i + 1); - } - - // Assert that we cannot release the slash escrow until the delay has elapsed for ALL strategies - cheats.roll(block.number + 1 days / 12 seconds * numStrategies); - cheats.prank(defaultRedistributionRecipient); - cheats.expectRevert(ISlashEscrowFactoryErrors.EscrowDelayNotElapsed.selector); - factory.releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - - // Roll forward to the next block - cheats.roll(block.number + 1); - - // Set up mock calls for each strategy's underlying token - for (uint i = 0; i < numStrategies; i++) { - _mockStrategyUnderlyingTokenCall(strategies[i], address(tokens[i])); - } - - // Execute the escrow - _releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - - // Verify that all strategies have been processed - assertFalse(factory.isPendingOperatorSet(defaultOperatorSet)); - assertFalse(factory.isPendingSlashId(defaultOperatorSet, defaultSlashId)); - assertEq(factory.getTotalPendingOperatorSets(), 0); - assertEq(factory.getTotalPendingSlashIds(defaultOperatorSet), 0); - assertEq(factory.getTotalPendingStrategiesForSlashId(defaultOperatorSet, defaultSlashId), 0); - - // Verify that all underlying amounts are cleared - for (uint i = 0; i < numStrategies; i++) { - assertEq(_getPendingUnderlyingAmountForStrategy(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i]), 0); - } - - // Verify that the start block is cleared - assertEq(factory.getEscrowStartBlock(defaultOperatorSet, defaultSlashId), 0); - } - - /// @dev Tests that operatorSets are only cleared once all slash IDs are released - function testFuzz_releaseSlashEscrow_multipleReleases(uint r) public { - uint numEscrows = bound(r, 2, 5); - - IStrategy[] memory strategies = new IStrategy[](1); - MockERC20[] memory tokens = new MockERC20[](1); - uint[] memory underlyingAmounts = new uint[](1); - - underlyingAmounts[0] = cheats.randomUint() / numEscrows; - - strategies[0] = IStrategy(cheats.randomAddress()); - tokens[0] = new MockERC20(); - - // Set up numEscrows slash escrows for the same operator set - for (uint i = 0; i < numEscrows; i++) { - // Start escrow for this slash - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId + i, strategies[0], tokens[0], underlyingAmounts[0]); - // Verify the escrow was started correctly - _checkStartEscrows(defaultOperatorSet, defaultSlashId + i, strategies[0], tokens[0], underlyingAmounts[0], 1); - } - - _rollForwardDefaultEscrowDelay(); - - // Release the first n-1 slash escrows - for (uint i = 0; i < numEscrows - 1; i++) { - _releaseSlashEscrow(defaultOperatorSet, defaultSlashId + i); - } - - // Assert that the operator set is still pending - assertTrue(factory.isPendingOperatorSet(defaultOperatorSet)); - assertTrue(factory.isPendingSlashId(defaultOperatorSet, defaultSlashId + numEscrows - 1)); - assertEq(factory.getTotalPendingOperatorSets(), 1); - assertEq(factory.getTotalPendingSlashIds(defaultOperatorSet), 1); - - // Release the last escrow - _releaseSlashEscrow(defaultOperatorSet, defaultSlashId + numEscrows - 1); - - // Assert that the operator set is no longer pending - assertFalse(factory.isPendingOperatorSet(defaultOperatorSet)); - assertFalse(factory.isPendingSlashId(defaultOperatorSet, defaultSlashId + numEscrows - 1)); - assertEq(factory.getTotalPendingOperatorSets(), 0); - } -} - -contract SlashEscrowFactoryUnitTests_releaseSlashEscrowByStrategy is SlashEscrowFactoryUnitTests { - /// @dev Asserts that the function reverts if the caller is not the redistribution recipient. - function testFuzz_releaseSlashEscrowByStrategy_OnlyRedistributionRecipient(uint underlyingAmount) public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, underlyingAmount); - cheats.expectRevert(ISlashEscrowFactoryErrors.OnlyRedistributionRecipient.selector); - factory.releaseSlashEscrowByStrategy(defaultOperatorSet, defaultSlashId, defaultStrategy); - } - - function testFuzz_releaseSlashEscrowByStrategy_globalPause(uint underlyingAmount) public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, underlyingAmount); - cheats.prank(pauser); - factory.pause(2 ** PAUSED_RELEASE_ESCROW); - cheats.prank(defaultRedistributionRecipient); - cheats.expectRevert(IPausable.CurrentlyPaused.selector); - factory.releaseSlashEscrowByStrategy(defaultOperatorSet, defaultSlashId, defaultStrategy); - } - - /// @dev Asserts that the function reverts if the redistribution is paused. - function testFuzz_releaseSlashEscrowByStrategy_paused(uint underlyingAmount) public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, underlyingAmount); - cheats.prank(pauser); - factory.pauseEscrow(defaultOperatorSet, defaultSlashId); - cheats.prank(defaultRedistributionRecipient); - cheats.expectRevert(IPausable.CurrentlyPaused.selector); - factory.releaseSlashEscrowByStrategy(defaultOperatorSet, defaultSlashId, defaultStrategy); - } - - /// @dev Asserts that the function reverts if the operator set and slash ID do not exist. - /// NOTE: `releaseSlashEscrowByStrategy` DOES revert when a slash ID does not exist for an operator set. - function testFuzz_releaseSlashEscrowByStrategy_nonexistentSlashIdForOperatorSet(uint underlyingAmount) public { - cheats.prank(defaultRedistributionRecipient); - cheats.expectRevert(); - factory.releaseSlashEscrowByStrategy(defaultOperatorSet, defaultSlashId, defaultStrategy); - assertFalse(factory.isPendingOperatorSet(defaultOperatorSet)); - assertFalse(factory.isPendingSlashId(defaultOperatorSet, defaultSlashId)); - } - - function testFuzz_releaseSlashEscrowByStrategy_delayNotElapsed(uint underlyingAmount) public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, underlyingAmount); - cheats.roll(block.number + defaultGlobalDelayBlocks); - cheats.prank(defaultRedistributionRecipient); - cheats.expectRevert(ISlashEscrowFactoryErrors.EscrowDelayNotElapsed.selector); - factory.releaseSlashEscrowByStrategy(defaultOperatorSet, defaultSlashId, defaultStrategy); - } - - function testFuzz_releaseSlashEscrowByStrategy_multipleStrategies(uint underlyingAmount) public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, underlyingAmount); - cheats.roll(block.number + defaultGlobalDelayBlocks); - cheats.prank(defaultRedistributionRecipient); - cheats.expectRevert(ISlashEscrowFactoryErrors.EscrowDelayNotElapsed.selector); - factory.releaseSlashEscrowByStrategy(defaultOperatorSet, defaultSlashId, defaultStrategy); - } - - /// @dev Tests that multiple strategies can be burned or redistributed across multiple calls - function testFuzz_releaseSlashEscrowByStrategy__multipleStrategies_sameDelay(uint r) public { - // Initialize arrays to store test data for multiple strategies - uint numStrategies = bound(r, 2, 10); - IStrategy[] memory strategies = new IStrategy[](numStrategies); - MockERC20[] memory tokens = new MockERC20[](numStrategies); - uint[] memory underlyingAmounts = new uint[](numStrategies); - - // Randomly update the redistribution to be the default burn address - _setRedistributionRecipient(r % 2 == 0); - - // Set up each strategy with random data and start escrow - for (uint i = 0; i < numStrategies; i++) { - // Generate random strategy address and token - strategies[i] = IStrategy(cheats.randomAddress()); - tokens[i] = new MockERC20(); - underlyingAmounts[i] = cheats.randomUint(); - - // Start escrow for this strategy - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i]); - // Verify the escrow was started correctly - _checkStartEscrows(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i], i + 1); - } - - // Advance time to allow escrow to occur - _rollForwardDefaultEscrowDelay(); - - // Set up mock calls for each strategy's underlying token - for (uint i = 0; i < numStrategies; i++) { - _mockStrategyUnderlyingTokenCall(strategies[i], address(tokens[i])); - } - - // Release the first n-1 slash escrows - for (uint i = 0; i < numStrategies - 1; i++) { - _releaseSlashEscrowByStrategy(defaultOperatorSet, defaultSlashId, strategies[i]); - } - - // Assert that the slashId and operatorSet are still pending - assertTrue(factory.isPendingOperatorSet(defaultOperatorSet)); - assertTrue(factory.isPendingSlashId(defaultOperatorSet, defaultSlashId)); - assertEq(factory.getTotalPendingOperatorSets(), 1); - assertEq(factory.getTotalPendingSlashIds(defaultOperatorSet), 1); - assertEq(factory.getTotalPendingStrategiesForSlashId(defaultOperatorSet, defaultSlashId), 1); - - // Release the last slash escrow - _releaseSlashEscrowByStrategy(defaultOperatorSet, defaultSlashId, strategies[numStrategies - 1]); - - // Checks - - // Assert that the operator set and slash ID are no longer pending. - assertFalse(factory.isPendingOperatorSet(defaultOperatorSet)); - assertFalse(factory.isPendingSlashId(defaultOperatorSet, defaultSlashId)); - assertEq(factory.getTotalPendingOperatorSets(), 0); - assertEq(factory.getTotalPendingSlashIds(defaultOperatorSet), 0); - - // Assert that the strategies and underlying amounts are no longer in the pending escrows. - assertEq(factory.getTotalPendingStrategiesForSlashId(defaultOperatorSet, defaultSlashId), 0); - - // Assert that the underlying amounts are no longer set. - for (uint i = 0; i < numStrategies; i++) { - assertEq(_getPendingUnderlyingAmountForStrategy(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i]), 0); - } - - // Assert that the start block for the (operator set, slash ID) is no longer set. - assertEq(factory.getEscrowStartBlock(defaultOperatorSet, defaultSlashId), 0); - } - - /// @dev Tests that multiple strategies can be burned or redistributed across multiple calls - function testFuzz_releaseSlashEscrowByStrategy__multipleStrategies_byIndexThenAll(uint r) public { - // Initialize arrays to store test data for multiple strategies - uint numStrategies = bound(r, 2, 10); - IStrategy[] memory strategies = new IStrategy[](numStrategies); - MockERC20[] memory tokens = new MockERC20[](numStrategies); - uint[] memory underlyingAmounts = new uint[](numStrategies); - - // Randomly update the redistribution to be the default burn address - _setRedistributionRecipient(r % 2 == 0); - - // Set up each strategy with random data and start escrow - for (uint i = 0; i < numStrategies; i++) { - // Generate random strategy address and token - strategies[i] = IStrategy(cheats.randomAddress()); - tokens[i] = new MockERC20(); - underlyingAmounts[i] = cheats.randomUint(); - - // Start escrow for this strategy - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i]); - // Verify the escrow was started correctly - _checkStartEscrows(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i], i + 1); - } - - // Advance time to allow escrow to occur - _rollForwardDefaultEscrowDelay(); - - // Release the first index - _releaseSlashEscrowByStrategy(defaultOperatorSet, defaultSlashId, strategies[0]); - - // Assert that the slashId and operatorSet are still pending - assertTrue(factory.isPendingOperatorSet(defaultOperatorSet)); - assertTrue(factory.isPendingSlashId(defaultOperatorSet, defaultSlashId)); - assertEq(factory.getTotalPendingOperatorSets(), 1); - assertEq(factory.getTotalPendingSlashIds(defaultOperatorSet), 1); - assertEq(factory.getTotalPendingStrategiesForSlashId(defaultOperatorSet, defaultSlashId), numStrategies - 1); - - // Release remaining - _releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - - // Checks - - // Assert that the operator set and slash ID are no longer pending. - assertFalse(factory.isPendingOperatorSet(defaultOperatorSet)); - assertFalse(factory.isPendingSlashId(defaultOperatorSet, defaultSlashId)); - assertEq(factory.getTotalPendingOperatorSets(), 0); - assertEq(factory.getTotalPendingSlashIds(defaultOperatorSet), 0); - - // Assert that the strategies and underlying amounts are no longer in the pending escrows. - assertEq(factory.getTotalPendingStrategiesForSlashId(defaultOperatorSet, defaultSlashId), 0); - - // Assert that the underlying amounts are no longer set. - for (uint i = 0; i < numStrategies; i++) { - assertEq(_getPendingUnderlyingAmountForStrategy(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i]), 0); - } - - // Assert that the start block for the (operator set, slash ID) is no longer set. - assertEq(factory.getEscrowStartBlock(defaultOperatorSet, defaultSlashId), 0); - } -} - -contract SlashEscrowFactoryUnitTests_pauseEscrow is SlashEscrowFactoryUnitTests { - function test_pauseEscrow_onlyPauser() public { - cheats.prank(cheats.randomAddress()); - cheats.expectRevert(IPausable.OnlyPauser.selector); - factory.pauseEscrow(defaultOperatorSet, defaultSlashId); - } - - function test_pauseEscrow_correctness() public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, 100); - - cheats.prank(pauser); - factory.pauseEscrow(defaultOperatorSet, defaultSlashId); - assertTrue(factory.isEscrowPaused(defaultOperatorSet, defaultSlashId)); - - _rollForwardDefaultEscrowDelay(); - - cheats.prank(defaultRedistributionRecipient); - cheats.expectRevert(IPausable.CurrentlyPaused.selector); - factory.releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - } -} - -contract SlashEscrowFactoryUnitTests_unpauseEscrow is SlashEscrowFactoryUnitTests { - function test_unpauseEscrow_onlyUnpauser() public { - cheats.prank(cheats.randomAddress()); - cheats.expectRevert(IPausable.OnlyUnpauser.selector); - factory.unpauseEscrow(defaultOperatorSet, defaultSlashId); - } - - function test_unpauseEscrow_correctness() public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, 100); - - cheats.prank(pauser); - factory.pauseEscrow(defaultOperatorSet, defaultSlashId); - assertTrue(factory.isEscrowPaused(defaultOperatorSet, defaultSlashId)); - - _rollForwardDefaultEscrowDelay(); - - cheats.prank(defaultRedistributionRecipient); - cheats.expectRevert(IPausable.CurrentlyPaused.selector); - factory.releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - - cheats.prank(unpauser); - factory.unpauseEscrow(defaultOperatorSet, defaultSlashId); - assertFalse(factory.isEscrowPaused(defaultOperatorSet, defaultSlashId)); - - // Should not revert... - _mockStrategyUnderlyingTokenCall(defaultStrategy, address(defaultToken)); - _releaseSlashEscrow(defaultOperatorSet, defaultSlashId); - } -} - -contract SlashEscrowFactoryUnitTests_setStrategyEscrowDelay is SlashEscrowFactoryUnitTests { - function test_setStrategyEscrowDelay_onlyOwner() public { - cheats.prank(cheats.randomAddress()); - cheats.expectRevert("Ownable: caller is not the owner"); - factory.setStrategyEscrowDelay(defaultStrategy, uint32(25)); - } - - function testFuzz_setStrategyEscrowDelay_correctness(uint32 delay) public { - delay = uint32(bound(delay, defaultGlobalDelayBlocks + 1, type(uint).max)); - cheats.prank(defaultOwner); - cheats.expectEmit(true, true, true, true); - emit StrategyEscrowDelaySet(defaultStrategy, delay); - factory.setStrategyEscrowDelay(defaultStrategy, delay); - // Returns strategy delay since strategy delay is larger than global delay. - assertEq(factory.getStrategyEscrowDelay(defaultStrategy), delay); - } -} - -contract SlashEscrowFactoryUnitTests_getEscrowDelay is SlashEscrowFactoryUnitTests { - function testFuzz_getEscrowDelay_correctness(uint r) public { - // Initialize arrays to store test data for multiple strategies - uint numStrategies = bound(r, 2, 10); - IStrategy[] memory strategies = new IStrategy[](numStrategies); - MockERC20[] memory tokens = new MockERC20[](numStrategies); - uint[] memory underlyingAmounts = new uint[](numStrategies); - uint32[] memory delays = new uint32[](numStrategies); - - // Set global delay less than all the strategy delays. - cheats.prank(defaultOwner); - factory.setGlobalEscrowDelay(0.5 days / 12 seconds); - - // Set up each strategy with random data and different delays - for (uint i = 0; i < numStrategies; i++) { - // Generate random strategy address and token - strategies[i] = IStrategy(cheats.randomAddress()); - tokens[i] = new MockERC20(); - underlyingAmounts[i] = cheats.randomUint(); - - // Set different delays for each strategy (increasing delays) - delays[i] = uint32((i + 1) * 1 days / 12 seconds); // 1 day, 2 days, 3 days, etc. - - // Set the strategy-specific delay - cheats.prank(defaultOwner); - factory.setStrategyEscrowDelay(strategies[i], delays[i]); - - // Start escrow for this strategy - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i]); - // Verify the escrow was started correctly - _checkStartEscrows(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i], i + 1); - } - - // The complete block should be the maximum delay across all strategies - assertEq(factory.getEscrowCompleteBlock(defaultOperatorSet, defaultSlashId), block.number + delays[numStrategies - 1] + 1); - } -} - -contract SlashEscrowFactoryUnitTests_setGlobalEscrowDelay is SlashEscrowFactoryUnitTests { - function test_setGlobalEscrowDelay_onlyOwner() public { - cheats.prank(cheats.randomAddress()); - cheats.expectRevert("Ownable: caller is not the owner"); - factory.setGlobalEscrowDelay(100); - } - - function testFuzz_setGlobalEscrowDelay_correctness(uint32 delay) public { - cheats.prank(defaultOwner); - cheats.expectEmit(true, true, true, true); - emit GlobalEscrowDelaySet(delay); - factory.setGlobalEscrowDelay(delay); - assertEq(factory.getGlobalEscrowDelay(), delay); - } -} - -contract SlashEscrowFactoryUnitTests_getPendingEscrows is SlashEscrowFactoryUnitTests { - function test_getPendingEscrows_singleSlashId() public { - // Start escrow for a single strategy - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, 100); - - // Get pending escrows for the specific slash ID - (IStrategy[] memory strategies) = factory.getPendingStrategiesForSlashId(defaultOperatorSet, defaultSlashId); - - // Verify results - assertEq(strategies.length, 1); - assertEq(address(strategies[0]), address(defaultStrategy)); - } - - function test_getPendingEscrows_multipleStrategies() public { - // Create multiple strategies and start escrows - IStrategy strategy1 = IStrategy(cheats.randomAddress()); - IStrategy strategy2 = IStrategy(cheats.randomAddress()); - MockERC20 token1 = new MockERC20(); - MockERC20 token2 = new MockERC20(); - - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, strategy1, token1, 100); - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, strategy2, token2, 200); - - // Get pending escrows for the specific slash ID - (IStrategy[] memory strategies) = factory.getPendingStrategiesForSlashId(defaultOperatorSet, defaultSlashId); - - // Verify results - assertEq(strategies.length, 2); - assertEq(address(strategies[0]), address(strategy1)); - assertEq(address(strategies[1]), address(strategy2)); - assertEq(_getPendingUnderlyingAmountForStrategy(defaultOperatorSet, defaultSlashId, strategy1, token1), 100); - assertEq(_getPendingUnderlyingAmountForStrategy(defaultOperatorSet, defaultSlashId, strategy2, token2), 200); - } - - function test_getPendingEscrows_multipleSlashIds() public { - // Create multiple slash IDs and strategies - uint slashId1 = 1; - uint slashId2 = 2; - IStrategy strategy1 = IStrategy(cheats.randomAddress()); - IStrategy strategy2 = IStrategy(cheats.randomAddress()); - MockERC20 token1 = new MockERC20(); - MockERC20 token2 = new MockERC20(); - - // Start escrows for different slash IDs - _initiateSlashEscrow(defaultOperatorSet, slashId1, strategy1, token1, 100); - _initiateSlashEscrow(defaultOperatorSet, slashId2, strategy2, token2, 200); - - // Get pending escrows for all slash IDs of the operator set - (IStrategy[][] memory strategies) = factory.getPendingStrategiesForSlashIds(defaultOperatorSet); - - // Verify results - assertEq(strategies.length, 2); - - // Check first slash ID - assertEq(strategies[0].length, 1); - assertEq(address(strategies[0][0]), address(strategy1)); - assertEq(_getPendingUnderlyingAmountForStrategy(defaultOperatorSet, slashId1, strategy1, token1), 100); - - // Check second slash ID - assertEq(strategies[1].length, 1); - assertEq(address(strategies[1][0]), address(strategy2)); - assertEq(_getPendingUnderlyingAmountForStrategy(defaultOperatorSet, slashId2, strategy2, token2), 200); - } - - function test_getPendingEscrows_empty() public { - // Test with no pending escrows - (IStrategy[] memory strategies) = factory.getPendingStrategiesForSlashId(defaultOperatorSet, defaultSlashId); - assertEq(strategies.length, 0); - - (IStrategy[][] memory strategies2) = factory.getPendingStrategiesForSlashIds(defaultOperatorSet); - assertEq(strategies2.length, 0); - assertEq(factory.getTotalPendingStrategiesForSlashId(defaultOperatorSet, defaultSlashId), 0); - } -} - -contract SlashEscrowFactoryUnitTests_getEscrowCompleteBlock is SlashEscrowFactoryUnitTests { - function test_getEscrowCompleteBlock() public { - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, 100); - assertEq(factory.getEscrowCompleteBlock(defaultOperatorSet, defaultSlashId), block.number + defaultGlobalDelayBlocks + 1); - } - - function testFuzz_getEscrowCompleteBlock_multipleStrategies(uint r) public { - // Initialize arrays to store test data for multiple strategies - uint numStrategies = bound(r, 2, 10); - IStrategy[] memory strategies = new IStrategy[](numStrategies); - MockERC20[] memory tokens = new MockERC20[](numStrategies); - uint[] memory underlyingAmounts = new uint[](numStrategies); - uint32[] memory delays = new uint32[](numStrategies); - - // Set global delay less than all the strategy delays. - cheats.prank(defaultOwner); - factory.setGlobalEscrowDelay(0.5 days / 12 seconds); - - // Set up each strategy with random data and different delays - for (uint i = 0; i < numStrategies; i++) { - // Generate random strategy address and token - strategies[i] = IStrategy(cheats.randomAddress()); - tokens[i] = new MockERC20(); - underlyingAmounts[i] = cheats.randomUint(); - - // Set different delays for each strategy (increasing delays) - delays[i] = uint32((i + 1) * 1 days / 12 seconds); // 1 day, 2 days, 3 days, etc. - - // Set the strategy-specific delay - cheats.prank(defaultOwner); - factory.setStrategyEscrowDelay(strategies[i], delays[i]); - - // Start escrow for this strategy - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i]); - // Verify the escrow was started correctly - _checkStartEscrows(defaultOperatorSet, defaultSlashId, strategies[i], tokens[i], underlyingAmounts[i], i + 1); - } - - // The complete block should be the maximum delay across all strategies - assertEq(factory.getEscrowCompleteBlock(defaultOperatorSet, defaultSlashId), block.number + delays[numStrategies - 1] + 1); - } -} - -contract SlashEscrowFactoryUnitTests_getPendingEscrowsFull is SlashEscrowFactoryUnitTests { - function test_getPendingEscrows() public { - uint32 dayInBlocks = 1 days / 12 seconds; - uint32 initialBlock = uint32(block.number); - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, 100); - - cheats.roll(block.number + dayInBlocks); - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId + 1, defaultStrategy, defaultToken, 100); - - cheats.roll(block.number + dayInBlocks); - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId + 2, defaultStrategy, defaultToken, 100); - - (OperatorSet[] memory operatorSets, bool[] memory isRedistributing, uint[][] memory slashIds, uint32[][] memory completeBlocks) = - factory.getPendingEscrows(); - assertEq(operatorSets.length, 1); - assertEq(operatorSets[0].key(), defaultOperatorSet.key()); - assertEq(isRedistributing.length, 1); - assertEq(isRedistributing[0], true); - assertEq(slashIds.length, 1); - assertEq(slashIds[0].length, 3); - assertEq(completeBlocks.length, 1); - assertEq(completeBlocks[0].length, 3); - - // Assert that the complete blocks are correct - assertEq(completeBlocks[0][0], initialBlock + defaultGlobalDelayBlocks + 1); - assertEq(completeBlocks[0][1], initialBlock + defaultGlobalDelayBlocks + dayInBlocks + 1); - assertEq(completeBlocks[0][2], initialBlock + defaultGlobalDelayBlocks + dayInBlocks * 2 + 1); - } -} - -contract SlashEscrowFactoryUnitTests_SlashEscrowProxy is SlashEscrowFactoryUnitTests { - address maliciousCaller; - - function setUp() public override { - super.setUp(); - _initiateSlashEscrow(defaultOperatorSet, defaultSlashId, defaultStrategy, defaultToken, 100); - maliciousCaller = cheats.randomAddress(); - } - - function test_SlashEscrowProxy_InvalidDeploymentParameters_BadFactory() public { - ISlashEscrow slashEscrow = factory.getSlashEscrow(defaultOperatorSet, defaultSlashId); - - cheats.prank(maliciousCaller); - cheats.expectRevert(ISlashEscrow.InvalidDeploymentParameters.selector); - slashEscrow.releaseTokens( - ISlashEscrowFactory(maliciousCaller), - slashEscrowImplementation, - defaultOperatorSet, - defaultSlashId, - defaultRedistributionRecipient, - defaultStrategy - ); - } - - function test_SlashEscrowProxy_InvalidDeploymentParameters_BadSlashEscrowImplementation() public { - ISlashEscrow slashEscrow = factory.getSlashEscrow(defaultOperatorSet, defaultSlashId); - - cheats.prank(maliciousCaller); - cheats.expectRevert(ISlashEscrow.InvalidDeploymentParameters.selector); - slashEscrow.releaseTokens( - factory, ISlashEscrow(maliciousCaller), defaultOperatorSet, defaultSlashId, defaultRedistributionRecipient, defaultStrategy - ); - } - - function test_SlashEscrowProxy_InvalidDeploymentParameters_BadOperatorSet() public { - ISlashEscrow slashEscrow = factory.getSlashEscrow(defaultOperatorSet, defaultSlashId); - - cheats.prank(maliciousCaller); - cheats.expectRevert(ISlashEscrow.InvalidDeploymentParameters.selector); - slashEscrow.releaseTokens( - factory, - slashEscrowImplementation, - OperatorSet(maliciousCaller, 1), - defaultSlashId, - defaultRedistributionRecipient, - defaultStrategy - ); - } - - function test_SlashEscrowProxy_InvalidDeploymentParameters_BadSlashId(uint slashId) public { - ISlashEscrow slashEscrow = factory.getSlashEscrow(defaultOperatorSet, defaultSlashId); - - cheats.assume(slashId != defaultSlashId); - - cheats.prank(maliciousCaller); - cheats.expectRevert(ISlashEscrow.InvalidDeploymentParameters.selector); - slashEscrow.releaseTokens( - factory, slashEscrowImplementation, defaultOperatorSet, slashId, defaultRedistributionRecipient, defaultStrategy - ); - } - - function test_SlashEscrowProxy_OnlySlashEscrowFactory() public { - ISlashEscrow slashEscrow = factory.getSlashEscrow(defaultOperatorSet, defaultSlashId); - - cheats.expectRevert(ISlashEscrow.OnlySlashEscrowFactory.selector); - slashEscrow.releaseTokens( - factory, slashEscrowImplementation, defaultOperatorSet, defaultSlashId, defaultRedistributionRecipient, defaultStrategy - ); - } - - function test_SlashEscrowProxy_OnlySlashEscrowFactory_BadRecipient() public { - ISlashEscrow slashEscrow = factory.getSlashEscrow(defaultOperatorSet, defaultSlashId); - - cheats.prank(maliciousCaller); - cheats.expectRevert(ISlashEscrow.OnlySlashEscrowFactory.selector); - slashEscrow.releaseTokens(factory, slashEscrowImplementation, defaultOperatorSet, defaultSlashId, maliciousCaller, defaultStrategy); - } -} diff --git a/src/test/unit/StrategyManagerUnit.t.sol b/src/test/unit/StrategyManagerUnit.t.sol index dff67cc3f0..d86ea93a85 100644 --- a/src/test/unit/StrategyManagerUnit.t.sol +++ b/src/test/unit/StrategyManagerUnit.t.sol @@ -43,10 +43,7 @@ contract StrategyManagerUnitTests is EigenLayerUnitTestSetup, IStrategyManagerEv function setUp() public override { EigenLayerUnitTestSetup.setUp(); strategyManagerImplementation = new StrategyManager( - IDelegationManager(address(delegationManagerMock)), - ISlashEscrowFactory(address(slashEscrowFactoryMock)), - pauserRegistry, - "9.9.9" + IAllocationManager(address(allocationManagerMock)), IDelegationManager(address(delegationManagerMock)), pauserRegistry, "9.9.9" ); strategyManager = StrategyManager( address( @@ -1117,6 +1114,16 @@ contract StrategyManagerUnitTests_increaseBurnOrRedistributableShares is Strateg "get burn or redistributable shares count is wrong" ); + // Check pending operator sets and slash IDs + OperatorSet[] memory pendingOperatorSets = strategyManager.getPendingOperatorSets(); + assertEq(pendingOperatorSets.length, 1, "should have 1 pending operator set"); + assertEq(pendingOperatorSets[0].avs, defaultOperatorSet.avs, "pending operator set AVS mismatch"); + assertEq(pendingOperatorSets[0].id, defaultOperatorSet.id, "pending operator set ID mismatch"); + + uint[] memory pendingSlashIds = strategyManager.getPendingSlashIds(defaultOperatorSet); + assertEq(pendingSlashIds.length, 1, "should have 1 pending slash ID"); + assertEq(pendingSlashIds[0], defaultSlashId, "pending slash ID mismatch"); + // Sanity check that the strategy is not in the OLD burnable shares mapping assertEq(strategyManager.getBurnableShares(strategy), 0, "get burnable shares is wrong"); } @@ -1157,6 +1164,16 @@ contract StrategyManagerUnitTests_increaseBurnOrRedistributableShares is Strateg strategies.length, "get burn or redistributable shares count is wrong" ); + + // Check pending operator sets and slash IDs - still only 1 of each since same operator set and slash ID + OperatorSet[] memory pendingOperatorSets = strategyManager.getPendingOperatorSets(); + assertEq(pendingOperatorSets.length, 1, "should have 1 pending operator set"); + assertEq(pendingOperatorSets[0].avs, defaultOperatorSet.avs, "pending operator set AVS mismatch"); + assertEq(pendingOperatorSets[0].id, defaultOperatorSet.id, "pending operator set ID mismatch"); + + uint[] memory pendingSlashIds = strategyManager.getPendingSlashIds(defaultOperatorSet); + assertEq(pendingSlashIds.length, 1, "should have 1 pending slash ID"); + assertEq(pendingSlashIds[0], defaultSlashId, "pending slash ID mismatch"); } function testFuzz_existingShares(uint existingBurnableShares, uint addedSharesToBurn) external { @@ -1187,6 +1204,83 @@ contract StrategyManagerUnitTests_increaseBurnOrRedistributableShares is Strateg addedSharesToBurn, "added shares to burn wrong" ); + + // Check pending operator sets and slash IDs - should have 1 operator set but 2 slash IDs + OperatorSet[] memory pendingOperatorSets = strategyManager.getPendingOperatorSets(); + assertEq(pendingOperatorSets.length, 1, "should have 1 pending operator set"); + assertEq(pendingOperatorSets[0].avs, defaultOperatorSet.avs, "pending operator set AVS mismatch"); + assertEq(pendingOperatorSets[0].id, defaultOperatorSet.id, "pending operator set ID mismatch"); + + uint[] memory pendingSlashIds = strategyManager.getPendingSlashIds(defaultOperatorSet); + assertEq(pendingSlashIds.length, 2, "should have 2 pending slash IDs"); + // Note: We can't guarantee order, so just check both are present + bool hasDefaultSlashId = false; + bool hasNextSlashId = false; + for (uint i = 0; i < pendingSlashIds.length; i++) { + if (pendingSlashIds[i] == defaultSlashId) hasDefaultSlashId = true; + if (pendingSlashIds[i] == nextSlashId) hasNextSlashId = true; + } + assertTrue(hasDefaultSlashId, "should have default slash ID"); + assertTrue(hasNextSlashId, "should have next slash ID"); + } + + function test_multipleOperatorSetsAndSlashIds_AllCleared() external { + IStrategy strategy = dummyStrat; + uint shares = 100; + + // Create a second operator set + OperatorSet memory operatorSet2 = OperatorSet(address(0x2), 1); + + // Add shares for multiple operator sets and slash IDs + cheats.startPrank(address(delegationManagerMock)); + + // Add to defaultOperatorSet with defaultSlashId + strategyManager.increaseBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId, strategy, shares); + + // Add to defaultOperatorSet with a different slashId + uint slashId2 = defaultSlashId + 1; + strategyManager.increaseBurnOrRedistributableShares(defaultOperatorSet, slashId2, strategy, shares); + + // Add to operatorSet2 with defaultSlashId + strategyManager.increaseBurnOrRedistributableShares(operatorSet2, defaultSlashId, strategy, shares); + + cheats.stopPrank(); + + // Check pending sets - should have 2 operator sets + OperatorSet[] memory pendingOperatorSets = strategyManager.getPendingOperatorSets(); + assertEq(pendingOperatorSets.length, 2, "should have 2 pending operator sets"); + + // Check pending slash IDs for each operator set + assertEq(strategyManager.getPendingSlashIds(defaultOperatorSet).length, 2, "defaultOperatorSet should have 2 pending slash IDs"); + assertEq(strategyManager.getPendingSlashIds(operatorSet2).length, 1, "operatorSet2 should have 1 pending slash ID"); + + // Deposit shares to strategies to enable clearing + _depositIntoStrategySuccessfully(strategy, address(this), shares * 3); + + // Clear one slash ID from defaultOperatorSet + strategyManager.clearBurnOrRedistributableSharesByStrategy(defaultOperatorSet, defaultSlashId, strategy); + + // Check pending sets - should still have 2 operator sets since defaultOperatorSet still has slashId2 + pendingOperatorSets = strategyManager.getPendingOperatorSets(); + assertEq(pendingOperatorSets.length, 2, "should still have 2 pending operator sets"); + assertEq(strategyManager.getPendingSlashIds(defaultOperatorSet).length, 1, "defaultOperatorSet should have 1 pending slash ID"); + + // Clear the second slash ID from defaultOperatorSet + strategyManager.clearBurnOrRedistributableSharesByStrategy(defaultOperatorSet, slashId2, strategy); + + // Now defaultOperatorSet should be removed from pending, but operatorSet2 should remain + pendingOperatorSets = strategyManager.getPendingOperatorSets(); + assertEq(pendingOperatorSets.length, 1, "should have 1 pending operator set"); + assertEq(pendingOperatorSets[0].avs, operatorSet2.avs, "remaining operator set should be operatorSet2"); + assertEq(strategyManager.getPendingSlashIds(defaultOperatorSet).length, 0, "defaultOperatorSet should have no pending slash IDs"); + + // Clear operatorSet2 + strategyManager.clearBurnOrRedistributableSharesByStrategy(operatorSet2, defaultSlashId, strategy); + + // All pending sets should be cleared now + pendingOperatorSets = strategyManager.getPendingOperatorSets(); + assertEq(pendingOperatorSets.length, 0, "should have no pending operator sets"); + assertEq(strategyManager.getPendingSlashIds(operatorSet2).length, 0, "operatorSet2 should have no pending slash IDs"); } } @@ -1207,18 +1301,26 @@ contract StrategyManagerUnitTests_clearBurnOrRedistributableShares is StrategyMa IStrategy strategy = dummyStrat; _increaseBurnOrRedistributableShares(strategy, shares); + // Check that pending operator set and slash ID are added + assertEq(strategyManager.getPendingOperatorSets().length, 1, "should have 1 pending operator set after adding shares"); + assertEq(strategyManager.getPendingSlashIds(defaultOperatorSet).length, 1, "should have 1 pending slash ID after adding shares"); + cheats.expectEmit(true, true, true, true, address(strategyManager)); emit BurnOrRedistributableSharesDecreased(defaultOperatorSet, defaultSlashId, strategy, shares); strategyManager.clearBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId); - (IStrategy[] memory escrowStrats, uint[] memory escrowShares) = + (IStrategy[] memory slashStrats, uint[] memory slashShares) = strategyManager.getBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId); - assertEq(escrowStrats.length, 0, "strats length should be 0"); - assertEq(escrowShares.length, 0, "shares length should be 0"); + assertEq(slashStrats.length, 0, "strats length should be 0"); + assertEq(slashShares.length, 0, "shares length should be 0"); assertEq(strategyManager.getBurnOrRedistributableCount(defaultOperatorSet, defaultSlashId), 0, "count should be 0"); - address slashEscrow = slashEscrowFactoryMock.getSlashEscrow(defaultOperatorSet, defaultSlashId); - assertEq(dummyToken.balanceOf(slashEscrow), shares, "strategy balance of slash escrow invalid"); + // Check that pending operator set and slash ID are removed since all strategies are cleared + assertEq(strategyManager.getPendingOperatorSets().length, 0, "pending operator sets should be empty after clearing"); + assertEq(strategyManager.getPendingSlashIds(defaultOperatorSet).length, 0, "pending slash ids should be empty after clearing"); + + address redistributionRecipient = allocationManagerMock.getRedistributionRecipient(defaultOperatorSet); + assertEq(dummyToken.balanceOf(redistributionRecipient), shares, "strategy balance of redistribution recipient invalid"); assertEq(dummyToken.balanceOf(address(strategy)), 0, "strategy balance should be 0"); } @@ -1229,18 +1331,26 @@ contract StrategyManagerUnitTests_clearBurnOrRedistributableShares is StrategyMa console.log("strategy balance", dummyToken.balanceOf(address(strategy))); + // Check that pending operator set and slash ID are added + assertEq(strategyManager.getPendingOperatorSets().length, 1, "should have 1 pending operator set after adding shares"); + assertEq(strategyManager.getPendingSlashIds(defaultOperatorSet).length, 1, "should have 1 pending slash ID after adding shares"); + cheats.expectEmit(true, true, true, true, address(strategyManager)); emit BurnOrRedistributableSharesDecreased(defaultOperatorSet, defaultSlashId, strategy, shares); strategyManager.clearBurnOrRedistributableSharesByStrategy(defaultOperatorSet, defaultSlashId, strategy); - (IStrategy[] memory escrowStrats, uint[] memory escrowShares) = + (IStrategy[] memory slashStrats, uint[] memory slashShares) = strategyManager.getBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId); - assertEq(escrowStrats.length, 0, "strats length should be 0"); - assertEq(escrowShares.length, 0, "shares length should be 0"); + assertEq(slashStrats.length, 0, "strats length should be 0"); + assertEq(slashShares.length, 0, "shares length should be 0"); assertEq(strategyManager.getBurnOrRedistributableCount(defaultOperatorSet, defaultSlashId), 0, "count should be 0"); - address slashEscrow = slashEscrowFactoryMock.getSlashEscrow(defaultOperatorSet, defaultSlashId); - assertEq(dummyToken.balanceOf(slashEscrow), shares, "strategy balance of slash escrow invalid"); + // Check that pending operator set and slash ID are removed since all strategies are cleared + assertEq(strategyManager.getPendingOperatorSets().length, 0, "pending operator sets should be empty after clearing"); + assertEq(strategyManager.getPendingSlashIds(defaultOperatorSet).length, 0, "pending slash ids should be empty after clearing"); + + address redistributionRecipient = allocationManagerMock.getRedistributionRecipient(defaultOperatorSet); + assertEq(dummyToken.balanceOf(redistributionRecipient), shares, "strategy balance of redistribution recipient invalid"); assertEq(dummyToken.balanceOf(address(strategy)), 0, "strategy balance should be 0"); } @@ -1262,15 +1372,15 @@ contract StrategyManagerUnitTests_clearBurnOrRedistributableShares is StrategyMa strategyManager.clearBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId); - (IStrategy[] memory escrowStrats, uint[] memory escrowShares) = + (IStrategy[] memory slashStrats, uint[] memory slashShares) = strategyManager.getBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId); - assertEq(escrowStrats.length, 0, "strats length should be 0"); - assertEq(escrowShares.length, 0, "shares length should be 0"); + assertEq(slashStrats.length, 0, "strats length should be 0"); + assertEq(slashShares.length, 0, "shares length should be 0"); assertEq(strategyManager.getBurnOrRedistributableCount(defaultOperatorSet, defaultSlashId), 0, "count should be 0"); // The dummyStrats all have the same token, assert total balance - address slashEscrow = slashEscrowFactoryMock.getSlashEscrow(defaultOperatorSet, defaultSlashId); - assertEq(dummyToken.balanceOf(slashEscrow), totalSharesToAdd, "total balance should be total shares to add"); + address defaultRedistributionRecipient = allocationManagerMock.getRedistributionRecipient(defaultOperatorSet); + assertEq(dummyToken.balanceOf(defaultRedistributionRecipient), totalSharesToAdd, "total balance should be total shares to add"); assertEq(dummyToken.balanceOf(address(strategies[0])), 0, "strategy balance should be 0"); assertEq(dummyToken.balanceOf(address(strategies[1])), 0, "strategy balance should be 0"); assertEq(dummyToken.balanceOf(address(strategies[2])), 0, "strategy balance should be 0"); @@ -1291,6 +1401,10 @@ contract StrategyManagerUnitTests_clearBurnOrRedistributableShares is StrategyMa _increaseBurnOrRedistributableShares(strategies, sharesToAdd); + // Check that pending operator set and slash ID are added + assertEq(strategyManager.getPendingOperatorSets().length, 1, "should have 1 pending operator set after adding shares"); + assertEq(strategyManager.getPendingSlashIds(defaultOperatorSet).length, 1, "should have 1 pending slash ID after adding shares"); + // Remove shares in random order uint[] memory indices = new uint[](3); indices[0] = 1; // dummyStrat2 @@ -1309,11 +1423,23 @@ contract StrategyManagerUnitTests_clearBurnOrRedistributableShares is StrategyMa strategies.length - i - 1, "count not correct" ); + + // Check pending sets - should remain until last strategy is cleared + if (i < strategies.length - 1) { + assertEq(strategyManager.getPendingOperatorSets().length, 1, "should still have 1 pending operator set"); + assertEq(strategyManager.getPendingSlashIds(defaultOperatorSet).length, 1, "should still have 1 pending slash ID"); + } else { + // After last strategy is cleared, pending sets should be empty + assertEq(strategyManager.getPendingOperatorSets().length, 0, "pending operator sets should be empty after clearing all"); + assertEq( + strategyManager.getPendingSlashIds(defaultOperatorSet).length, 0, "pending slash ids should be empty after clearing all" + ); + } } // The dummyStrats all have the same token, assert total balance - address slashEscrow = slashEscrowFactoryMock.getSlashEscrow(defaultOperatorSet, defaultSlashId); - assertEq(dummyToken.balanceOf(slashEscrow), totalShares, "total balance should be total shares to add"); + address redistributionRecipient = allocationManagerMock.getRedistributionRecipient(defaultOperatorSet); + assertEq(dummyToken.balanceOf(redistributionRecipient), totalShares, "total balance should be total shares to add"); assertEq(dummyToken.balanceOf(address(strategies[0])), 0, "strategy balance should be 0"); assertEq(dummyToken.balanceOf(address(strategies[1])), 0, "strategy balance should be 0"); assertEq(dummyToken.balanceOf(address(strategies[2])), 0, "strategy balance should be 0"); @@ -1510,3 +1636,131 @@ contract StrategyManagerUnitTests_removeStrategiesFromDepositWhitelist is Strate } } } + +contract StrategyManagerUnitTests_getPendingOperatorSets is StrategyManagerUnitTests { + function test_getPendingOperatorSets_InitiallyZero() external { + OperatorSet[] memory pendingOperatorSets = strategyManager.getPendingOperatorSets(); + assertEq(pendingOperatorSets.length, 0, "should have 0 pending operator sets"); + } + + function test_getPendingOperatorSets_SingleOperatorSet() external { + IStrategy strategy = dummyStrat; + uint shares = 100; + + // Staker must deposit first + address staker = address(this); + uint depositAmount = 1e18; + _depositIntoStrategySuccessfully(strategy, staker, depositAmount); + + cheats.prank(address(delegationManagerMock)); + strategyManager.increaseBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId, strategy, shares); + OperatorSet[] memory pendingOperatorSets = strategyManager.getPendingOperatorSets(); + assertEq(pendingOperatorSets.length, 1, "should have 1 pending operator set"); + assertEq(pendingOperatorSets[0].avs, defaultOperatorSet.avs, "pending operator set AVS mismatch"); + assertEq(pendingOperatorSets[0].id, defaultOperatorSet.id, "pending operator set ID mismatch"); + // Clear shares + strategyManager.clearBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId); + pendingOperatorSets = strategyManager.getPendingOperatorSets(); + assertEq(pendingOperatorSets.length, 0, "should have 0 pending operator sets"); + } + + function test_getPendingOperatorSets_MultipleOperatorSets() external { + IStrategy strategy = dummyStrat; + uint shares = 100; + + // Staker must deposit first + address staker = address(this); + uint depositAmount = 1e18; + _depositIntoStrategySuccessfully(strategy, staker, depositAmount); + + // Create multiple operator sets + OperatorSet memory operatorSet1 = OperatorSet(address(0x1), 1); + OperatorSet memory operatorSet2 = OperatorSet(address(0x2), 2); + OperatorSet memory operatorSet3 = OperatorSet(address(0x3), 3); + + // Add shares for each operator set + cheats.startPrank(address(delegationManagerMock)); + strategyManager.increaseBurnOrRedistributableShares(operatorSet1, defaultSlashId, strategy, shares); + strategyManager.increaseBurnOrRedistributableShares(operatorSet2, defaultSlashId, strategy, shares); + strategyManager.increaseBurnOrRedistributableShares(operatorSet3, defaultSlashId, strategy, shares); + cheats.stopPrank(); + + OperatorSet[] memory pendingOperatorSets = strategyManager.getPendingOperatorSets(); + assertEq(pendingOperatorSets.length, 3, "should have 3 pending operator sets"); + + // Verify all operator sets are present + assertEq(pendingOperatorSets[0].avs, operatorSet1.avs, "pending operator set 1 AVS mismatch"); + assertEq(pendingOperatorSets[0].id, operatorSet1.id, "pending operator set 1 ID mismatch"); + assertEq(pendingOperatorSets[1].avs, operatorSet2.avs, "pending operator set 2 AVS mismatch"); + assertEq(pendingOperatorSets[1].id, operatorSet2.id, "pending operator set 2 ID mismatch"); + assertEq(pendingOperatorSets[2].avs, operatorSet3.avs, "pending operator set 3 AVS mismatch"); + assertEq(pendingOperatorSets[2].id, operatorSet3.id, "pending operator set 3 ID mismatch"); + + strategyManager.clearBurnOrRedistributableShares(operatorSet1, defaultSlashId); + assertEq(strategyManager.getPendingOperatorSets().length, 2, "should have 2 pending operator sets"); + + strategyManager.clearBurnOrRedistributableShares(operatorSet2, defaultSlashId); + assertEq(strategyManager.getPendingOperatorSets().length, 1, "should have 1 pending operator sets"); + + strategyManager.clearBurnOrRedistributableShares(operatorSet3, defaultSlashId); + assertEq(strategyManager.getPendingOperatorSets().length, 0, "should have 0 pending operator sets"); + } +} + +contract StrategyManagerUnitTests_getPendingSlashIds is StrategyManagerUnitTests { + function test_getPendingSlashIds_InitiallyZero() external { + uint[] memory pendingSlashIds = strategyManager.getPendingSlashIds(defaultOperatorSet); + assertEq(pendingSlashIds.length, 0, "should have 0 pending slash IDs"); + } + + function test_getPendingSlashIds_SingleOperatorSet_SingleSlashId() external { + IStrategy strategy = dummyStrat; + uint shares = 100; + + address staker = address(this); + uint depositAmount = 1e18; + _depositIntoStrategySuccessfully(strategy, staker, depositAmount); + + cheats.prank(address(delegationManagerMock)); + strategyManager.increaseBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId, strategy, shares); + uint[] memory pendingSlashIds = strategyManager.getPendingSlashIds(defaultOperatorSet); + assertEq(pendingSlashIds.length, 1, "should have 1 pending slash ID"); + assertEq(pendingSlashIds[0], defaultSlashId, "pending slash ID mismatch"); + } + + function test_getPendingSlashIds_SingleOperatorSet_MultipleSlashIds() external { + IStrategy strategy = dummyStrat; + uint shares = 100; + + address staker = address(this); + uint depositAmount = 1e18; + _depositIntoStrategySuccessfully(strategy, staker, depositAmount); + + cheats.startPrank(address(delegationManagerMock)); + strategyManager.increaseBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId, strategy, shares); + strategyManager.increaseBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId + 1, strategy, shares); + strategyManager.increaseBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId + 2, strategy, shares); + cheats.stopPrank(); + + uint[] memory pendingSlashIds = strategyManager.getPendingSlashIds(defaultOperatorSet); + assertEq(pendingSlashIds.length, 3, "should have 3 pending slash IDs"); + assertEq(pendingSlashIds[0], defaultSlashId, "pending slash ID mismatch"); + assertEq(pendingSlashIds[1], defaultSlashId + 1, "pending slash ID mismatch"); + assertEq(pendingSlashIds[2], defaultSlashId + 2, "pending slash ID mismatch"); + + strategyManager.clearBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId); + pendingSlashIds = strategyManager.getPendingSlashIds(defaultOperatorSet); + assertEq(pendingSlashIds.length, 2, "should have 2 pending slash IDs"); + assertEq(pendingSlashIds[1], defaultSlashId + 1, "pending slash ID mismatch"); + assertEq(pendingSlashIds[0], defaultSlashId + 2, "pending slash ID mismatch"); + + strategyManager.clearBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId + 1); + pendingSlashIds = strategyManager.getPendingSlashIds(defaultOperatorSet); + assertEq(pendingSlashIds.length, 1, "should have 1 pending slash IDs"); + assertEq(pendingSlashIds[0], defaultSlashId + 2, "pending slash ID mismatch"); + + strategyManager.clearBurnOrRedistributableShares(defaultOperatorSet, defaultSlashId + 2); + pendingSlashIds = strategyManager.getPendingSlashIds(defaultOperatorSet); + assertEq(pendingSlashIds.length, 0, "should have 0 pending slash IDs"); + } +} diff --git a/src/test/unit/libraries/SlashingLibUnit.t.sol b/src/test/unit/libraries/SlashingLibUnit.t.sol new file mode 100644 index 0000000000..8ea6710cf9 --- /dev/null +++ b/src/test/unit/libraries/SlashingLibUnit.t.sol @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: BUSL-1.1 +pragma solidity ^0.8.27; + +import "forge-std/Test.sol"; +import "src/contracts/libraries/SlashingLib.sol"; + +contract SlashingLibHarness { + DepositScalingFactor dsf; + + function unsafeUpdate(uint scalingFactor) public { + dsf._scalingFactor = scalingFactor; + } + + function update(uint prevDepositShares, uint addedShares, uint slashingFactor) public { + dsf.update(prevDepositShares, addedShares, slashingFactor); + } +} + +contract SlashingLibUnitTests is Test { + /// @dev We use a harness so that `vm.expectRevert()` can be used. + SlashingLibHarness harness; + + function setUp() public { + harness = new SlashingLibHarness(); + } + + function test_Revert_InvalidDepositScalingFactor() public { + harness.unsafeUpdate(1); + + vm.expectRevert(SlashingLib.InvalidDepositScalingFactor.selector); + harness.update({prevDepositShares: 1e18, addedShares: 1, slashingFactor: WAD - 1}); + } +} diff --git a/src/test/utils/EigenLayerUnitTestSetup.sol b/src/test/utils/EigenLayerUnitTestSetup.sol index d3873f0178..6563d67925 100644 --- a/src/test/utils/EigenLayerUnitTestSetup.sol +++ b/src/test/utils/EigenLayerUnitTestSetup.sol @@ -16,7 +16,6 @@ import "src/test/mocks/AllocationManagerMock.sol"; import "src/test/mocks/StrategyManagerMock.sol"; import "src/test/mocks/DelegationManagerMock.sol"; import "src/test/mocks/EigenPodManagerMock.sol"; -import "src/test/mocks/SlashEscrowFactoryMock.sol"; import "src/test/mocks/EmptyContract.sol"; import "src/test/utils/ArrayLib.sol"; @@ -44,7 +43,6 @@ abstract contract EigenLayerUnitTestSetup is Test { StrategyManagerMock strategyManagerMock; DelegationManagerMock delegationManagerMock; EigenPodManagerMock eigenPodManagerMock; - SlashEscrowFactoryMock slashEscrowFactoryMock; EmptyContract emptyContract; mapping(address => bool) public isExcludedFuzzAddress; @@ -83,7 +81,6 @@ abstract contract EigenLayerUnitTestSetup is Test { StrategyManagerMock(payable(address(new StrategyManagerMock(IDelegationManager(address(delegationManagerMock)))))); delegationManagerMock = DelegationManagerMock(payable(address(new DelegationManagerMock()))); eigenPodManagerMock = EigenPodManagerMock(payable(address(new EigenPodManagerMock(pauserRegistry)))); - slashEscrowFactoryMock = SlashEscrowFactoryMock(payable(address(new SlashEscrowFactoryMock()))); emptyContract = new EmptyContract(); isExcludedFuzzAddress[address(0)] = true; @@ -95,6 +92,5 @@ abstract contract EigenLayerUnitTestSetup is Test { isExcludedFuzzAddress[address(strategyManagerMock)] = true; isExcludedFuzzAddress[address(delegationManagerMock)] = true; isExcludedFuzzAddress[address(eigenPodManagerMock)] = true; - isExcludedFuzzAddress[address(slashEscrowFactoryMock)] = true; } }